1. 아래와 같은 테이블에 SQL 구문이 실행되었을 경우 최종 출력 값을 작성하시오.
품목ID | 단가 |
001 | 10000 |
002 | 20000 |
003 | 10000 |
004 | 20000 |
BEGIN TRANSACTION
INSERT INTO 품목(품목 ID, 단가) VALUES('005',20000)
COMMIT
BEGIN TRANSACTION
DELETE 품목 WHERE 품목ID = '002'
BEGIN TRANSACTION
UPDATE 품목 SET 단가 = 20000 WHERE 단가 = 10000
ROLLBACK
SELECT COUNT(품목ID) FROM 품목 WHERE 단가 = 20000
ROLLBACK 을 하면 COMMIT 이후에 실행되었던 것들은 다 취소됨
답 : 3
2. 아래의 상품 테이블의 데이터에 대하여 관리자가 아래와 같이 SQL 문장을 실행하여 데이터를 변경하였다. 데이터 변경 후의 상품ID '001' 의 최종 상품명을 작성하시오.
상품 테이블
상품ID | 상품명 |
001 | TV |
BEGIN TRANSACTION;
SAVE TRANSACTION SP1;
UPDATE 상품 SET 상품명 = 'LED-TV' WHERE 상품ID = '001';
SAVE TRANSACTION SP2;
UPDATE 상품 SET 상품명 = '삼성-TV' WHERE 상품ID = '001';
ROLLBACK TRANSACTION SP2;
COMMIT
답 : LED-TV
BEGIN TRANSACTION(BEGIN TRAN)으로 트랜잭션을 시작하고
COMMIT TRANSACTION(TRANSACTION 생략 가능) 또는
ROLLBACK TRANSACTION(TRANSACTION 생략 가능)으로 트랜잭션을 종료한다.
ROLLBACK 구문을 만나면 최초의 BEGIN TRANSACTION 시점까지 모두 ROLLBACK이 수행된다.
저장점(SAVEPOINT)을 정의하면 롤백(ROLL BACK)할 때 트랜잭션에 포함된 전체 작업을 롤백 하는 것이 아니라 한 시점에서 SAVEPOINT 까지 트랜잭션의 일부만 롤백할 수 있다.
3. ㄱ에 들어갈 말은?
SQL을 사용하여 데이터베이스에서 데이터를 조회할 때 원하는 데이터만을 검색하기 위해서 SELECT, FROM 절과 함께 (ㄱ) 을 이용하여 조회되는 데이터의 조건을 설정하여 데이터를 제한할 수 있다.
ㄱ : WHERE
4. 다음 중 SQL의 실행결과로 가장 적절한 것은?
EMP_TBL
EMPNO | SAL |
100 | 1500 |
200 | 3000 |
300 | 2000 |
SELECT COUNT(*)
FROM EMP_TBL
WHERE EMPNO > 100 AND SAL >= 3000 OR EMPNO = 200;
AND → OR 순으로 풀기
1) EMPNO > 100 : 200,300
2) AND SAL >= 3000 : 200
3) OR EMPNO=200 : 200
답 : 1
연산자의 우선순위
1. 괄호로 묶은 연산
2. 부정 연산자 (NOT)
3. 비교 연산자(=,>,<) 와 SQL 비교 연산자 (BETWEEN AND , IN(), LIKE, IS NULL)
4. 논리 연한자 중 AND, OR순으로 처리
5. SELECT COL1 + COL3 FROM TAB_A;의 결과는? (NULL의 연산)
COL1 | COL2 | COL3 |
30 | NULL | 20 |
NULL | 10 | 40 |
50 | NULL | NULL |
50
NULL
NULL
6. 아래와 같은 DDL 문장으로 테이블을 생성하고, SQL들을 수행하였을 때 다음 설명 중 옳은 것은?
CREATE TABLE 서비스
(
서비스번호 VARCHAR2(10) PRIMARY KEY,
서비스명 VARCHAR2(100) NULL,
게시일자 DATE NOT NULL
);
--ㄱ
SELECT * FROM 서비스 WHERE 서비스번호 = 1;
--ㄴ
INSERT INTO 서비스 VALUES ('999','','2015-11-11');
--ㄷ
SELECT * FROM 서비스 WHERE 서비스명 = '';
--ㄹ
SELECT * FROM 서비스 WHERE 서비스명 IS NULL;
1) 서비스번호 컬럼에 모든 레코드 중에서 '001'과 같은 숫자형식으로 하나의 레코드만이라도 입력되어 있으면 ㄱ)은 오류 없이 실행된다.
→ 서비스번호는 VARCHAR으로 INT형식으로 검색할 수 없다.
2) ORACLE에서 ㄴ)과 같이 데이터를 입력하였을 때, 서비스명 컬럼에 공백문자 데이터가 입력된다.→ SQL SERVER는 공백문자 데이터로 , ORACLE은 NULL로 입력된다.
3) ORACLE에서 ㄴ)과 같이 데이터를 입력하고, ㄷ)과 같이 조회하였을 때, 데이터는 조회된다.→ NULL로 인식하기 때문에 IS NULL 로 검색해야한다.
4) SQL SERVER에서 ㄴ)과 같이 데이터를 입력하고, ㄹ)과 같이 조회하였을 때, 데이터는 조회되지 않는다.
→ SQL SERVER에서는 = '' 로 검색해야한다.
7. 월별매출 테이블 2014년 11월부터 2015년 3월 까지의 매출금액 합계를 출력하는 SQL 문장
년 | 월 | 매출 금액 |
... | ... | ... |
SELECT SUM(매출 금액)
FROM 월별매출
WHERE
년 = '2014' AND 월 BETWEEN '11' AND '12'
OR 년 = '2015' AND 월 BETWEEN '01' AND '03';
8. 아래 테이블 스키마를 참조하여 SQL 문장을 작성하였다. 다음 중 결과가 다른 SQL 문장은?
사비스_가입
고객ID 서비스ID 가비일자 가입시간 |
서비스시작일시 서비스종료일시 |
SVC_JOIN
CUST_ID: VARCHAR2(10) NOT NULL SVC_ID: VARCHAR2(5) NOT NULL JOIN_YMD: VARCHAR2(8) NOT NULL JOIN_HH : VARCHAR2(4) NOT NULL |
SVC_START_DATE: DATE NULL SVC_END_DATE : DATE NULL |
--1
SELECT SVC_ID, COUNT(*) AS CNT
FROM SVC_JOIN
WHERE SVC_END_DATE >= TO_DATE('20150101000000','YYYYMMDDHH24miss')
AND SVC_END_DATE = TO_DATE('20150131235959','YYYYMMDDHH24miss')
AND CONCAT(JOIN_YMD, JOIN_HH) = '2014120100'
GROUP BY SYC_ID;
--2
SELECT SVC_ID, COUNT(*) AS CNT
FROM SVC_JOIN
WHERE SVC_END_DATE >= TO_DATE('20150101','YYYYMMDD')
AND SVC_END_DATE < TO_DATE('20150201','YYYYMMDDHH')
AND (JOIN_YMD, JOIN_HH) IN (('20141201','00'))
GROUP BY SYC_ID;
--3
SELECT SVC_ID, COUNT(*) AS CNT
FROM SVC_JOIN
WHERE '201501' = TO_CHAR(SVC_END_DATE, 'YYYYMM')
AND JOIN_YMD = '20141201'
AND JOIN_HH = '00'
GROUP BY SYC_ID;
--4
SELECT SVC_ID, COUNT(*) AS CNT
FROM SVC_JOIN
WHERE TO_DATE('201501','YYYYMM') = SVC_END_DATE
AND JOIN_YMD || JOIN_HH = '2014120100'
GROUP BY SYC_ID;
-- 201501 전체를 거르는게 아니라 201501000000 을 조건으로 두게 된다. 그래서 위 3개와 다른 결과가 나온다.
9. 아래와 같은 내장 함수에 대한 설명 중에서 옳은 것을 모두 고르시오
가) 함수의 입력 행수에 따라 단일행 함수와 다중행 함수로 구분할 수 있다.
나) 단일행 함수는 SELECT, WHERE, ORDER BY, UPDATE 의 SET절에 사용이 가능하다.
다) 1:M 관계의 두 테이블을 조인할 경우 M쪽에 다중행이 출력되므로 단일행 함수는 사용할 수 없다.
라) 단일행 함수는 다중행 함수와 다르게 여러 개의 인수가 입력되어도 단일값만을 반환한다. → 모두 단일값 반환
단일행 함수(Single-Row Function)
종류 | 내용 | 함수의 예 |
문자형 함수 | 문자를 입력하면 문자나 숫자 값을 반환한다. | LOWER, UPPER, SUBSTR, LENGTH, LTRIM, RTRIM, TRIM, ASCII |
숫자형 함수 | 숫자를 입력하면 숫자값을 반환한다. | ABS, MOD, ROUND, TRUNC, SIGN, CHR, CEIL, FLOOR, EXP, LOG, LN, POWER, COS, TAN |
날짜형 함수 | DATE 타입의 값을 연산한다. | SYSDATE, EXTRACT, TO_NUMBER |
변환형 함수 | 문자, 숫자, 날짜형 값의 데이터 타입을 변환한다. | TO_NUMBER, TO_CHAR, TO_DATE |
NULL 관련 함수 | NULL을 처리하기 위한 함수 | NVL, NULLIF, COALESCE |
단일행 함수의 특징
- SELECT, WHERE, ORDER BY, UPDATE SET 절에 사용 가능하다.
- 각 행(ROW)들에 대해 개별적으로 작용하여 데이터 값들을 조작하고, 각각의 행에 대한 조작 결과를 리턴한다.
- 여러 인자(Argument)를 입력해도 단 하나의 결과만 리턴한다.
- 함수의 인자(Argument)로 상수, 변수, 표현식이 사용 가능하고, 하나의 인수를 가지는 경우도 있지만 여러개의 인수를 가질 수도 있다.
- 특별한 경우가 아니면 함수의 인자(Argument)로 함수를 사용하는 함수의 중첩이 가능하다.
다중행 함수(Multi-Row-Function)
- 다중행 함수는 집계함수, 그룹함수, 윈도우 함수로 구분된다.
- 집계함수 : COUNT, AVG, SUM, MIN, MAX, STDDEV(표준편차), VARIANCE(분산)
- 그룹함수 : ROLLUP(소계), CUBE(모든 조합의 그룹별 소계), GROUPING SETS(다양한 소계 집합)
- 윈도우함수 :
- 그룹 내 순위 함수 : RANK, DENSE_RANK, ROW_NUMBER
- 그룹 내 집계 함수 : SUM, MAX, MIN, AVG, COUNT
- 그룹 내 행 순서 관련 함수 : FIRST_VALUE, LAST_VALUE, LAG, LEAD
- 그룹 내 비율 관련 함수 : CUME_DIST, PRECENT_RANK, NTLE, RATIO_TO_REPORT
- 선형 분석을 포함한 통계 분석 함수
'△ > SQLD' 카테고리의 다른 글
SQLD 문제 풀이 6 (0) | 2023.05.15 |
---|---|
SQLD 문제 풀이 5 (1) | 2023.05.13 |
SQLD 문제 풀이 3 (0) | 2023.05.10 |
SQLD 문제풀이 2 (0) | 2023.05.10 |
SQLD 문제풀이 1 (0) | 2023.05.08 |
댓글