시험 구성: 1과목(데이터 모델링) 10문항 + 2과목(SQL 기본 및 활용) 40문항 = 총 50문항 시험 시간: 90분 | 합격 기준: 총점 60점 이상, 과목별 40% 미만 과락
제1회 모의고사
1과목. 데이터 모델링의 이해 (1~10번)
1번. 데이터 모델링의 단계에 대한 설명으로 옳지 않은 것은?
선택지
내용
①
개념 모델은 업무 관점에서 데이터의 큰 그림을 표현한다
②
논리 모델은 특정 DBMS에 종속적인 설계를 포함한다
③
물리 모델은 인덱스, 파티션 등 저장 구조를 정의한다
④
개념 모델에서 엔티티와 관계를 식별한다
정답: ②
해설: 논리 모델은 시스템 독립적(DBMS에 종속되지 않는) 설계이다. 특정 DBMS에 종속적인 설계는 물리 모델에서 이루어진다. 논리 모델에서는 속성, 키, 관계 등을 상세 정의하지만, 데이터 타입이나 인덱스 같은 물리적 구현 사항은 포함하지 않는다.
2번. 다음 중 엔티티(Entity)의 조건에 해당하지 않는 것은?
선택지
내용
①
다수의 인스턴스가 존재해야 한다
②
각 인스턴스를 식별할 수 있는 속성이 있어야 한다
③
반드시 물리적 테이블과 1:1로 대응해야 한다
④
업무적으로 의미 있는 대상이어야 한다
정답: ③
해설: 엔티티는 반드시 물리적 테이블과 1:1로 대응할 필요가 없다. 하나의 엔티티가 여러 테이블로 분해될 수도 있고, 반대로 여러 엔티티가 하나의 테이블로 통합될 수도 있다. 엔티티의 조건은 ①다수의 인스턴스 존재, ②식별 가능성, ③속성 보유, ④업무적 의미이다.
3번. 다음 중 인조식별자(Surrogate Identifier)의 예로 가장 적절한 것은?
선택지
내용
①
주민등록번호
②
이메일 주소
③
AUTO_INCREMENT로 생성된 일련번호
④
업무 규칙에 의해 부여된 주문번호 (ORD-20260101-001)
정답: ③
해설: 인조식별자는 업무적 의미 없이 인위적으로 부여한 식별자이다. AUTO_INCREMENT 일련번호는 업무적 의미가 없으며, 시스템이 자동으로 부여하는 대표적 인조식별자이다. ④의 주문번호는 업무 규칙에 의해 생성되므로 본질식별자(Natural Identifier)이다. ①②는 업무적으로 자연스럽게 존재하는 식별자이므로 본질식별자에 가깝다.
4번. 다음 테이블에서 기본키는 (학번, 과목번호)이다.
학번
과목번호
학생이름
학과명
학과사무실
성적
1001
CS01
김철수
컴퓨터공학과
공학관 301
90
1001
CS02
김철수
컴퓨터공학과
공학관 301
85
1002
CS01
이영희
통계학과
자연관 205
92
이 테이블이 충족하는 가장 높은 정규형은?
선택지
내용
①
1NF
②
2NF
③
3NF
④
BCNF
정답: ①
해설: 기본키가 (학번, 과목번호) 복합키일 때, 학생이름과 학과명·학과사무실은 학번만으로 결정된다. 즉, 복합키의 일부에만 종속되는 부분 함수 종속이 존재하므로 2NF를 충족하지 못한다. 따라서 충족하는 가장 높은 정규형은 1NF이다.
5번. 다음 중 참조 무결성(Referential Integrity)을 위반하는 경우는?
선택지
내용
①
사원 테이블의 사원번호(PK)에 NULL을 입력
②
사원 테이블의 부서번호(FK)에 부서 테이블에 존재하지 않는 값을 입력
③
사원 테이블의 사원번호(PK)에 이미 존재하는 값을 입력
④
사원 테이블의 급여 컬럼에 음수 값을 입력
정답: ②
해설: 참조 무결성은 외래키(FK)가 참조하는 테이블의 기본키(PK)에 존재하는 값이거나 NULL이어야 한다는 규칙이다. ①③은 개체 무결성 위반(PK의 NULL 또는 중복), ④는 도메인 무결성 위반이다.
6번. 부서-사원 관계에서 ON DELETE CASCADE를 설정한 경우, 부서를 삭제하면 어떻게 되는가?
선택지
내용
①
부서만 삭제되고 사원의 부서번호는 NULL로 변경된다
②
부서와 소속 사원 모두 삭제된다
③
소속 사원이 있으면 부서 삭제가 거부된다
④
소속 사원의 부서번호가 0으로 변경된다
정답: ②
해설: ON DELETE CASCADE는 부모 행(부서)이 삭제될 때, 이를 참조하는 자식 행(사원)도 함께 삭제하는 옵션이다. ①은 ON DELETE SET NULL, ③은 ON DELETE RESTRICT(기본값)의 동작이다.
7번. 반정규화(Denormalization)에 대한 설명으로 가장 적절한 것은?
선택지
내용
①
데이터 일관성을 항상 보장한다
②
INSERT, UPDATE 작업의 성능을 향상시킨다
③
조회 성능 향상을 위해 의도적으로 중복을 허용한다
④
정규화가 완료되지 않은 상태를 의미한다
정답: ③
해설: 반정규화는 조회(READ) 성능 향상을 위해 의도적으로 데이터 중복을 허용하는 설계 기법이다. 데이터 웨어하우스나 OLAP 시스템에서 주로 사용된다. ①은 정규화의 특징, ②는 오히려 인덱스 갱신 등으로 인해 수정 작업이 느려질 수 있다. ④는 반정규화의 개념과 다르다.
8번. 다음 중 1:1 관계의 예로 가장 적절한 것은?
선택지
내용
①
부서와 사원
②
학생과 수강 과목
③
사원과 사원 상세정보
④
고객과 주문
정답: ③
해설: 사원과 사원 상세정보는 한 명의 사원이 하나의 상세정보를 가지고, 하나의 상세정보가 하나의 사원에만 속하는 1:1 관계이다. ①은 1:N, ②는 M:N, ④는 1:N 관계이다.
9번. 후보식별자(Candidate Identifier)의 조건으로 올바른 것은?
선택지
내용
①
유일성만 만족하면 된다
②
최소성만 만족하면 된다
③
유일성과 최소성을 모두 만족해야 한다
④
유일성, 최소성, NOT NULL을 모두 만족해야 한다
정답: ③
해설: 후보식별자는 유일성(Uniqueness) — 각 인스턴스를 유일하게 식별 — 과 최소성(Minimality) — 불필요한 속성을 포함하지 않음 — 을 모두 만족해야 한다. NOT NULL은 기본키(PK)의 제약조건이지, 후보식별자의 정의 조건은 아니다.
10번. 다음 ER 다이어그램에서 관계를 나타내는 마름모(◇) 기호의 의미는?
선택지
내용
①
엔티티(Entity)
②
속성(Attribute)
③
관계(Relationship)
④
식별자(Identifier)
정답: ③
해설: ER 다이어그램에서 사각형(□)은 엔티티, 타원(○)은 속성, 마름모(◇)는 관계를 나타낸다. 주식별자는 속성 이름에 밑줄(_)로 표시한다.
2과목. SQL 기본 및 활용 (11~50번)
11번. SQL 명령어 분류에 대한 설명으로 옳지 않은 것은?
선택지
내용
①
CREATE, ALTER, DROP은 DDL에 해당한다
②
SELECT는 DML에 해당한다
③
TRUNCATE는 DML에 해당한다
④
COMMIT, ROLLBACK은 TCL에 해당한다
정답: ③
해설: TRUNCATE는 테이블의 구조는 유지하면서 모든 데이터를 삭제하는 DDL(Data Definition Language) 명령어이다. DELETE는 DML이지만, TRUNCATE는 DDL이다. DDL은 자동 커밋되므로 ROLLBACK으로 복구할 수 없다.
12번. 다음 SQL의 실행 순서로 올바른 것은?
SELECT dept_id, AVG(salary)
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY dept_id
HAVING AVG(salary) > 3000
ORDER BY dept_id;
선택지
내용
①
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
②
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
③
FROM → GROUP BY → WHERE → HAVING → SELECT → ORDER BY
④
FROM → WHERE → SELECT → GROUP BY → HAVING → ORDER BY
정답: ②
해설: SQL의 논리적 실행 순서는 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY이다. 이 순서를 알아야 별칭(alias) 사용 가능 여부, WHERE와 HAVING의 차이 등을 정확히 이해할 수 있다.
13번. 다음 중 WHERE절에서 사용할 수 없는 것은?
선택지
내용
①
비교 연산자 (=, <, >)
②
LIKE 패턴 매칭
③
집계 함수 (SUM, AVG 등)
④
BETWEEN 연산자
정답: ③
해설: 집계 함수(SUM, AVG, COUNT 등)는 WHERE절에서 사용할 수 없다. 집계 함수는 GROUP BY 이후에 계산되므로, HAVING절에서만 사용 가능하다. WHERE는 GROUP BY 이전에 실행되기 때문이다.
14번. 다음 테이블에서 SELECT COUNT(*), COUNT(dept_id) FROM emp의 결과는?
emp_id
name
dept_id
1
홍길동
10
2
김철수
NULL
3
이영희
20
4
박민수
NULL
선택지
내용
①
COUNT(*) = 4, COUNT(dept_id) = 4
②
COUNT(*) = 4, COUNT(dept_id) = 2
③
COUNT(*) = 2, COUNT(dept_id) = 2
④
COUNT(*) = 4, COUNT(dept_id) = 3
정답: ②
해설: COUNT(*)는 NULL을 포함한 전체 행 수를 반환하므로 4이다. COUNT(dept_id)는 dept_id가 NULL이 아닌 행만 세므로 2이다. 핵심: COUNT(*)는 NULL 포함, COUNT(컬럼)은 NULL 제외.
15번. 다음 중 LEFT OUTER JOIN의 결과에 대한 설명으로 올바른 것은?
SELECT *
FROM A LEFT OUTER JOIN B ON A.id = B.id;
선택지
내용
①
A와 B 모두 매칭되는 행만 반환한다
②
A의 모든 행이 반환되며, B에 매칭이 없으면 B 컬럼은 NULL이다
③
B의 모든 행이 반환되며, A에 매칭이 없으면 A 컬럼은 NULL이다
④
A와 B의 모든 행이 반환되며, 매칭이 없으면 양쪽 모두 NULL이다
정답: ②
해설: LEFT OUTER JOIN은 왼쪽 테이블(A)의 모든 행을 포함하고, 오른쪽 테이블(B)에서 매칭되는 행이 있으면 함께 출력하며, 없으면 B의 컬럼을 NULL로 출력한다. ③은 RIGHT OUTER JOIN, ④는 FULL OUTER JOIN의 결과이다.
16번. 다음 테이블 A와 B를 INNER JOIN할 때 결과 행 수는?
A 테이블:
id
name
1
홍길동
2
김철수
3
이영희
B 테이블:
id
dept
1
영업
2
개발
4
인사
선택지
내용
①
2행
②
3행
③
4행
④
9행
정답: ①
해설: INNER JOIN은 양쪽 테이블에 모두 매칭되는 행만 반환한다. A.id = B.id 조건에서 매칭되는 것은 id=1(홍길동-영업)과 id=2(김철수-개발)이므로 결과는 2행이다. id=3은 B에 없고, id=4는 A에 없으므로 제외된다.
17번. 다음 쿼리의 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE dept_id = 30);
부서 30의 급여가 1000, 2000, 3000일 때:
선택지
내용
①
부서 30의 최대 급여(3000)보다 높은 급여의 사원
②
부서 30의 최소 급여(1000)보다 높은 급여의 사원
③
부서 30의 모든 급여보다 높은 급여의 사원
④
부서 30의 평균 급여보다 높은 급여의 사원
정답: ②
해설:> ANY는 서브쿼리 결과 중 하나라도 크면 참이므로, 최소값보다 크면 참이다. 즉 > ANY(1000, 2000, 3000)은 > 1000과 동일한 효과이다. 반면 > ALL은 모든 값보다 커야 하므로 > 3000(최대값보다 큰)과 동일하다.
18번. 다음 중 UNION과 UNION ALL의 차이로 올바른 것은?
선택지
내용
①
UNION은 중복을 허용하고, UNION ALL은 중복을 제거한다
②
UNION은 중복을 제거하고, UNION ALL은 중복을 허용한다
③
둘 다 중복을 제거한다
④
둘 다 중복을 허용한다
정답: ②
해설: UNION은 두 쿼리 결과의 중복 행을 제거하여 반환하고, UNION ALL은 중복을 포함한 모든 행을 반환한다. UNION ALL이 항상 같거나 많은 행을 반환하며, 중복 제거 과정이 없어 UNION보다 성능이 좋다.
19번. 다음 쿼리에서 별칭(dept_name)을 사용할 수 없는 절은?
SELECT department_name AS dept_name
FROM departments
선택지
내용
①
WHERE
②
ORDER BY
③
①과 ② 모두
④
①과 ② 모두 사용 가능
정답: ①
해설: SQL 실행 순서에서 SELECT는 WHERE보다 나중에 실행되므로, WHERE절에서는 SELECT의 별칭을 사용할 수 없다. ORDER BY는 SELECT보다 나중에 실행되므로 별칭 사용이 가능하다.
20번. 다음 결과에서 A MINUS B의 결과는?
A = {1, 2, 3, 4, 5}, B = {2, 4, 6}
선택지
내용
①
{1, 3, 5}
②
{2, 4}
③
{1, 2, 3, 4, 5, 6}
④
{6}
정답: ①
해설: MINUS(차집합)는 첫 번째 쿼리 결과에서 두 번째 쿼리 결과를 뺀 것이다. A에서 B에 포함된 {2, 4}를 제거하면 {1, 3, 5}가 된다. B MINUS A는 {6}이 된다.
21번. 다음 쿼리의 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary IS NULL;
선택지
내용
①
salary가 0인 사원
②
salary가 NULL인 사원
③
salary가 0이거나 NULL인 사원
④
에러 발생
정답: ②
해설: IS NULL은 NULL 여부를 확인하는 연산자이다. NULL은 = NULL로 비교할 수 없으며(결과가 항상 UNKNOWN), 반드시 IS NULL 또는 IS NOT NULL을 사용해야 한다.
22번. 다음 쿼리의 결과 행 수는?
SELECT *
FROM A CROSS JOIN B;
A: 3행, B: 4행일 때:
선택지
내용
①
3행
②
4행
③
7행
④
12행
정답: ④
해설: CROSS JOIN(카테시안 곱)은 두 테이블의 모든 행 조합을 반환한다. 결과 행 수 = A의 행 수 × B의 행 수 = 3 × 4 = 12행이다.
23번. 다음 중 GROUP BY절에 대한 설명으로 옳지 않은 것은?
선택지
내용
①
SELECT절의 집계 함수와 함께 사용된다
②
GROUP BY절의 컬럼은 SELECT절에 포함되어야 한다
③
WHERE절은 GROUP BY 이전에 실행된다
④
GROUP BY절에서 SELECT의 별칭을 사용할 수 있다
정답: ④
해설: GROUP BY는 SELECT보다 먼저 실행되므로, SELECT의 별칭(alias)을 GROUP BY절에서 사용할 수 없다. GROUP BY에는 실제 컬럼명이나 표현식을 사용해야 한다.
24번. 다음 테이블에서 GROUP BY dept_id의 결과로 나올 그룹의 수는?
emp_id
dept_id
1
10
2
20
3
10
4
NULL
5
20
6
NULL
선택지
내용
①
2개
②
3개
③
4개
④
6개
정답: ③
해설: GROUP BY는 NULL도 하나의 그룹으로 처리한다. dept_id의 고유 값은 {10, 20, NULL}이므로 3개가 아닌, NULL 그룹까지 포함하여 3개이다. (※ NULL끼리 같은 그룹이 되므로 3개가 맞다. 다시 확인: 10, 20, NULL = 3개)
정답 수정: ②
해설: GROUP BY는 NULL 값을 하나의 그룹으로 취급한다. 고유한 dept_id 값은 10, 20, NULL의 3가지이므로, 결과 그룹은 3개이다.
25번. 다음 중 서브쿼리에 대한 설명으로 올바른 것은?
선택지
내용
①
상관 서브쿼리는 메인쿼리 없이 독립적으로 실행할 수 있다
②
FROM절의 서브쿼리를 인라인 뷰(Inline View)라고 한다
③
서브쿼리는 SELECT절에서만 사용할 수 있다
④
서브쿼리의 결과는 항상 단일 행이다
정답: ②
해설: FROM절에 사용되는 서브쿼리를 인라인 뷰(Inline View)라고 한다. ①은 상관 서브쿼리는 메인쿼리의 컬럼을 참조하므로 독립 실행이 불가능하다. ③은 서브쿼리는 SELECT, FROM, WHERE, HAVING 등 여러 절에서 사용 가능하다. ④는 서브쿼리의 결과는 단일 행 또는 다중 행이 될 수 있다.
26번. 다음 쿼리에서 에러가 발생하는 이유는?
SELECT name, salary
FROM employees
WHERE salary = (SELECT salary FROM employees WHERE dept_id = 30);
부서 30에 사원이 3명 이상일 때:
선택지
내용
①
서브쿼리의 결과가 여러 행이므로 단일행 연산자(=)를 사용할 수 없음
②
서브쿼리에서 salary를 조회할 수 없음
③
WHERE절에서 서브쿼리를 사용할 수 없음
④
에러가 발생하지 않음
정답: ①
해설: 단일행 연산자(=, <, >, <>, <=, >=)는 서브쿼리의 결과가 정확히 1행일 때만 사용할 수 있다. 결과가 여러 행이면 IN, ANY, ALL 같은 다중행 연산자를 사용해야 한다.
27번. 다음 쿼리의 의미로 가장 적절한 것은?
SELECT e.name, e.salary
FROM employees e
WHERE e.salary > (
SELECT AVG(salary)
FROM employees
WHERE dept_id = e.dept_id
);
선택지
내용
①
전체 사원의 평균 급여보다 높은 급여의 사원
②
자기 부서의 평균 급여보다 높은 급여의 사원
③
가장 높은 급여를 받는 사원
④
부서별 평균 급여가 가장 높은 부서의 사원
정답: ②
해설: 이 쿼리는 상관 서브쿼리이다. 서브쿼리 내부에서 e.dept_id를 참조하고 있으므로, 메인쿼리의 각 사원마다 자기 부서의 평균 급여를 계산하여 비교한다. 따라서 "자기 부서의 평균 급여보다 높은 급여의 사원"을 조회하는 쿼리이다.
28번. 다음 중 NOT IN 사용 시 주의할 점으로 올바른 것은?
선택지
내용
①
서브쿼리 결과에 NULL이 포함되면 결과가 0행이 된다
②
서브쿼리 결과에 중복이 있으면 에러가 발생한다
③
NOT IN은 다중행 연산자가 아니므로 사용할 수 없다
④
NOT IN은 NULL 값을 자동으로 무시한다
정답: ①
해설: NOT IN에 NULL이 포함되면, x NOT IN (a, b, NULL)은 x != a AND x != b AND x != NULL로 해석된다. x != NULL은 항상 NULL(UNKNOWN)이므로, 전체 조건이 FALSE가 되어 결과가 0행이 된다. 이는 SQLD 시험에서 자주 출제되는 함정이다.
29번. 다음 테이블에서 SELECT AVG(salary) FROM emp의 결과는?
name
salary
A
3000
B
NULL
C
5000
선택지
내용
①
2666.67 (8000 / 3)
②
4000 (8000 / 2)
③
8000
④
NULL
정답: ②
해설: AVG 함수는 NULL 값을 자동으로 제외하고 계산한다. (3000 + 5000) / 2 = 4000이다. NULL을 0으로 처리하고 3으로 나누는 것이 아니다.
SELECT name, score,
RANK() OVER (ORDER BY score DESC) AS rnk
FROM students;
name
score
김철수
95
이영희
90
박민수
90
최지우
85
선택지
내용
①
2
②
3
③
4
④
NULL
정답: ②
해설: RANK()는 동순위 시 다음 순위를 건너뛴다. 김철수=1등, 이영희와 박민수가 공동 2등, 그 다음은 4등(3을 건너뜀). 하지만 박민수의 RANK는 이영희와 같은 2이다. (다음 순위인 최지우가 4라는 것이 핵심)
32번. 위 31번 데이터에서 DENSE_RANK()를 적용하면 최지우의 순위는?
선택지
내용
①
3
②
4
③
5
④
NULL
정답: ①
해설: DENSE_RANK()는 동순위 후에도 다음 순위를 연속으로 매긴다. 김철수=1, 이영희=2, 박민수=2, 최지우=3이다. RANK였다면 4이겠지만, DENSE_RANK는 건너뛰지 않는다.
33번. 다음 쿼리에서 LAG(revenue, 1)의 결과로 올바른 것은?
SELECT month, revenue,
LAG(revenue, 1) OVER (ORDER BY month) AS prev
FROM monthly_sales;
month
revenue
1월
100
2월
150
3월
120
선택지
내용
①
1월: NULL, 2월: 100, 3월: 150
②
1월: 150, 2월: 120, 3월: NULL
③
1월: NULL, 2월: 150, 3월: 120
④
1월: 100, 2월: 150, 3월: 120
정답: ①
해설: LAG(revenue, 1)은 ORDER BY 기준으로 바로 이전 행의 revenue 값을 가져온다. 1월은 이전 행이 없으므로 NULL, 2월은 1월의 100, 3월은 2월의 150이다.
34번. 다음 쿼리에서 cumul_sum 컬럼의 의미는?
SELECT name, dept_id, salary,
SUM(salary) OVER (PARTITION BY dept_id ORDER BY salary) AS cumul_sum
FROM employees;
선택지
내용
①
부서별 급여 총합
②
부서별 급여 누적합
③
전체 급여 총합
④
부서별 급여 평균
정답: ②
해설: PARTITION BY dept_id로 부서별 그룹을 만들고, ORDER BY salary로 정렬 기준을 주면, 현재 행까지의 누적합이 계산된다. ORDER BY가 없으면 부서별 전체 합이 되지만, ORDER BY가 있으면 누적(Cumulative) 계산이 된다.
35번. 다음 계층형 쿼리에서 각 사원의 LEVEL은?
SELECT employee_id, manager_id, LEVEL
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id;
employee_id
manager_id
1 (대표)
NULL
2 (부장)
1
3 (대리)
2
4 (사원)
2
선택지
내용
①
대표:0, 부장:1, 대리:2, 사원:2
②
대표:1, 부장:2, 대리:3, 사원:3
③
대표:1, 부장:1, 대리:2, 사원:2
④
대표:1, 부장:2, 대리:3, 사원:4
정답: ②
해설: LEVEL은 루트 노드에서 1부터 시작한다. START WITH manager_id IS NULL이 대표(1)를 루트로 설정하고, CONNECT BY PRIOR employee_id = manager_id로 부모→자식 방향으로 탐색한다. 대표=1, 부장=2, 대리=3, 사원=3이다.
36번. 다음 ROLLUP 쿼리에서 생성되는 그룹 조합의 수는?
SELECT region, city, SUM(sales)
FROM sales_table
GROUP BY ROLLUP(region, city);
선택지
내용
①
2개
②
3개
③
4개
④
5개
정답: ②
해설: ROLLUP(region, city)은 오른쪽에서 왼쪽으로 컬럼을 하나씩 빼면서 소계를 생성한다: (region, city) → (region, NULL) → (NULL, NULL). 총 3개 그룹 조합이다. CUBE였다면 (region, city), (region, NULL), (NULL, city), (NULL, NULL) = 4개이다.
37번. 다음 CASE WHEN 표현식에서 score=85인 학생의 grade는?
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
ELSE 'F'
END
선택지
내용
①
A
②
B
③
C
④
F
정답: ②
해설: CASE WHEN은 위에서부터 순서대로 평가하여, 첫 번째로 만족하는 조건의 THEN이 반환된다. score=85일 때: >= 90은 FALSE, >= 80은 TRUE → 'B'가 반환된다.
38번. 다음 중 뷰(View)를 통해 INSERT가 불가능한 경우는?
선택지
내용
①
하나의 테이블을 기반으로 한 단순 뷰
②
DISTINCT를 포함한 뷰
③
WHERE절만 포함한 단순 뷰
④
컬럼 별칭(alias)만 사용한 뷰
정답: ②
해설: DISTINCT, 그룹 함수, GROUP BY, JOIN 등을 포함한 뷰(복합 뷰)에서는 INSERT가 불가능하다. DISTINCT가 포함되면 중복 제거 로직이 적용된 결과이므로, 원본 테이블에 어떤 행을 삽입해야 할지 결정할 수 없기 때문이다.
39번. 인덱스(Index)에 대한 설명으로 옳지 않은 것은?
선택지
내용
①
SELECT 쿼리의 성능을 향상시킨다
②
INSERT, UPDATE, DELETE 시 성능이 저하될 수 있다
③
PRIMARY KEY 설정 시 자동으로 인덱스가 생성된다
④
모든 컬럼에 인덱스를 생성하면 전체 성능이 향상된다
정답: ④
해설: 모든 컬럼에 인덱스를 생성하면 INSERT/UPDATE/DELETE 시 모든 인덱스를 갱신해야 하므로 오히려 성능이 크게 저하된다. 인덱스는 WHERE절에 자주 사용되고, 고유성(카디널리티)이 높은 컬럼에 선별적으로 설정하는 것이 바람직하다.
40번. 다음 중 트랜잭션의 ACID 속성에 대한 설명으로 올바른 것은?
선택지
내용
①
Atomicity는 동시 실행되는 트랜잭션이 서로 간섭하지 않는 것을 보장한다
②
Consistency는 트랜잭션 전후에 데이터의 일관성을 유지하는 것을 보장한다
③
Isolation은 트랜잭션의 모든 작업이 모두 성공하거나 모두 실패하는 것을 보장한다
④
Durability는 커밋 전까지 데이터를 안전하게 보관하는 것을 보장한다
정답: ②
해설: ①은 Isolation(고립성)의 설명, ③은 Atomicity(원자성)의 설명, ④는 Durability(지속성)는 커밋 된 트랜잭션의 결과가 영구적으로 반영되는 것이다. Consistency(일관성)는 트랜잭션 전후에 데이터의 일관성이 유지됨을 보장한다.
41번. 다음 중 READ COMMITTED 격리 수준에서 발생 가능한 현상은?
선택지
내용
①
Dirty Read
②
Non-Repeatable Read
③
①과 ② 모두
④
①과 ② 모두 발생하지 않음
정답: ②
해설: READ COMMITTED는 Dirty Read는 방지하지만, Non-Repeatable Read와 Phantom Read는 발생할 수 있다. Dirty Read를 방지하는 최소 격리 수준이 READ COMMITTED이다. Oracle의 기본 격리 수준이기도 하다.
42번. 다음 쿼리에서 결과 행 수는?
SELECT *
FROM A LEFT JOIN B ON A.id = B.id
WHERE B.dept = '개발';
해설: LEFT JOIN의 결과는 (1, 영업), (2, 개발), (3, NULL)이다. 여기서 WHERE B.dept = '개발'을 적용하면, B.dept가 NULL인 행(3번)은 제외되고, '영업'인 행(1번)도 제외된다. 결과는 (2, 개발) 1행만 남는다. 이는 INNER JOIN과 동일한 결과가 될 수 있는 대표적 패턴이다.
43번. 다음 시퀀스(Sequence)에서 currval을 호출하기 전에 반드시 먼저 호출해야 하는 것은?
선택지
내용
①
START WITH
②
NEXTVAL
③
INCREMENT BY
④
MAXVALUE
정답: ②
해설: CURRVAL은 시퀀스의 현재 값을 반환하지만, 세션 내에서 NEXTVAL이 한 번 이상 호출되어야 사용할 수 있다. NEXTVAL 없이 CURRVAL을 호출하면 에러가 발생한다.
44번. 다음 쿼리의 결과로 올바른 것은?
SELECT name, salary,
CASE
WHEN salary >= 5000 THEN '고급'
WHEN salary >= 3000 THEN '중급'
ELSE '초급'
END AS grade
FROM employees;
salary가 5000인 사원의 grade는?
선택지
내용
①
고급
②
중급
③
초급
④
NULL
정답: ①
해설: salary=5000일 때, 첫 번째 WHEN salary >= 5000이 TRUE이므로 '고급'이 반환된다. 두 번째 WHEN >= 3000도 만족하지만, CASE WHEN은 첫 번째로 만족하는 조건만 실행한다.
45번. 다음 중 GRANT 명령어에 대한 설명으로 올바른 것은?
선택지
내용
①
DDL에 해당한다
②
DML에 해당한다
③
DCL에 해당한다
④
TCL에 해당한다
정답: ③
해설: GRANT(권한 부여)와 REVOKE(권한 회수)는 DCL(Data Control Language)에 해당한다.
46번. 다음 쿼리에서 CONNECT BY의 PRIOR 위치를 변경하면 어떤 결과가 나오는가?
-- 원래 쿼리 (위→아래)
SELECT employee_id, LEVEL
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id;
-- 변경된 쿼리 (아래→위)
SELECT employee_id, LEVEL
FROM employees
START WITH employee_id = 4
CONNECT BY employee_id = PRIOR manager_id;
선택지
내용
①
두 쿼리의 결과가 동일하다
②
변경된 쿼리는 사원(4)에서 대표(1) 방향으로 탐색한다
③
변경된 쿼리는 에러가 발생한다
④
변경된 쿼리는 모든 사원을 반환한다
정답: ②
해설: PRIOR의 위치에 따라 탐색 방향이 바뀐다. PRIOR employee_id = manager_id는 부모→자식(위→아래), employee_id = PRIOR manager_id는 자식→부모(아래→위)이다. employee_id=4(사원)에서 시작하여 manager_id를 통해 역으로 올라가면, 사원(4)→부장(2)→대표(1) 순서로 탐색한다.
해설: DELETE는 DML로 WHERE절을 사용하여 조건부 삭제가 가능하고, ROLLBACK이 가능하다. TRUNCATE는 DDL로 WHERE절 사용이 불가능하고(전체 삭제), 자동 커밋되어 ROLLBACK이 불가능하다. TRUNCATE는 DELETE보다 빠르다(로그 최소 기록).
49번. 다음 쿼리의 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary > ALL (SELECT salary FROM employees WHERE dept_id = 30);
부서 30의 급여가 1000, 2000, 3000일 때:
선택지
내용
①
부서 30의 최소 급여(1000)보다 높은 급여의 사원
②
부서 30의 최대 급여(3000)보다 높은 급여의 사원
③
부서 30의 평균 급여보다 높은 급여의 사원
④
부서 30의 모든 사원
정답: ②
해설:> ALL은 서브쿼리 결과의 모든 값보다 커야 참이다. 즉, 최대값(3000)보다 큰 값만 참이 된다. > ALL(1000, 2000, 3000)은 > 3000과 동일한 효과이다.
50번. 다음 중 뷰(View)의 장점에 해당하지 않는 것은?
선택지
내용
①
보안 향상 (특정 컬럼만 노출)
②
복잡한 쿼리의 재사용 편의성
③
데이터베이스의 논리적 독립성
④
인덱스를 통한 조회 성능 향상
정답: ④
해설: 뷰는 가상의 테이블이므로 자체적으로 인덱스를 가질 수 없다. 따라서 뷰를 통한 조회 성능 향상은 뷰의 장점이 아니다. 뷰의 장점은 ①보안(컬럼 제한), ②편의성(복잡한 쿼리 재사용), ③논리적 데이터 독립성이다.
제1회 정답표
번호
정답
번호
정답
번호
정답
번호
정답
번호
정답
1
②
11
③
21
②
31
②
41
②
2
③
12
②
22
④
32
①
42
①
3
③
13
③
23
④
33
①
43
②
4
①
14
②
24
②
34
②
44
①
5
②
15
②
25
②
35
②
45
③
6
②
16
①
26
①
36
②
46
②
7
③
17
②
27
②
37
②
47
③
8
③
18
②
28
①
38
②
48
②
9
③
19
①
29
②
39
④
49
②
10
③
20
①
30
③
40
②
50
④
제2회 모의고사
1과목. 데이터 모델링의 이해 (1~10번)
1번. 데이터 모델링의 3단계(개념→논리→물리)에서 논리 모델에 해당하는 것은?
선택지
내용
①
엔티티와 관계의 개요를 ER 다이어그램으로 표현
②
속성, 키, 관계를 상세 정의하고 정규화 수행
③
인덱스, 파티션, 테이블스페이스를 정의
④
DDL 스크립트를 생성하여 테이블을 생성
정답: ②
해설: ①은 개념 모델, ③④는 물리 모델에 해당한다. 논리 모델은 시스템 독립적으로 엔티티, 속성, 관계, 키를 상세 정의하고 정규화를 수행하는 단계이다.
2번. 다음 중 다중 값 속성(Multi-valued Attribute)의 예는?
선택지
내용
①
사원의 이름
②
사원의 입사일
③
사원의 보유 자격증 (SQLD, ADsP, 정보처리기사)
④
사원의 급여에서 파생된 연봉
정답: ③
해설: 다중 값 속성은 하나의 인스턴스에 여러 값을 가질 수 있는 속성이다. 보유 자격증은 하나의 사원에 여러 자격증이 있으므로 다중 값 속성이다. ①은 기본 속성, ④는 파생 속성이다. 다중 값 속성은 1NF를 위반한다.
SELECT region, city, SUM(sales), GROUPING(region) AS g_r, GROUPING(city) AS g_c
FROM sales_table
GROUP BY ROLLUP(region, city);
선택지
내용
①
일반 상세 데이터 행
②
region별 소계 또는 총계 행
③
city별 소계 행
④
에러 행
정답: ②
해설: GROUPING(region)=1은 region이 소계로 집계된 행, 즉 region별 소계 또는 총계 행이다. GROUPING(region)=0, GROUPING(city)=1이면 region별 소계, 둘 다 1이면 총계이다.
34번. 다음 뷰 정의에서 INSERT가 가능한가?
CREATE VIEW emp_view AS
SELECT emp_id, name, salary
FROM employees
WHERE salary > 3000;
선택지
내용
①
가능하다 (단순 뷰이므로)
②
불가능하다 (WHERE절이 포함되어 있으므로)
③
불가능하다 (뷰를 통한 INSERT는 항상 불가능)
④
salary > 3000인 행만 INSERT 가능
정답: ①
해설: 이 뷰는 하나의 테이블을 기반으로, 그룹 함수, DISTINCT, JOIN, GROUP BY가 없는 단순 뷰이다. WHERE절이 포함되어 있어도 단순 뷰의 조건을 충족하므로 INSERT가 가능하다. 다만, INSERT된 행이 뷰의 조건(salary > 3000)을 만족하지 않으면 뷰에서는 보이지 않게 된다.
35번. 다음 시퀀스에서 결과로 올바른 것은?
CREATE SEQUENCE seq_test
START WITH 10
INCREMENT BY 5
MAXVALUE 30
NOCYCLE;
SELECT seq_test.NEXTVAL FROM dual; -- 1회
SELECT seq_test.NEXTVAL FROM dual; -- 2회
SELECT seq_test.CURRVAL FROM dual; -- 3회
선택지
내용
①
1회:10, 2회:15, 3회:15
②
1회:10, 2회:15, 3회:20
③
1회:5, 2회:10, 3회:10
④
1회:10, 2회:20, 3회:20
정답: ①
해설: START WITH 10, INCREMENT BY 5이므로, 1회 NEXTVAL=10, 2회 NEXTVAL=15, 3회 CURRVAL=15(마지막 NEXTVAL 값). CURRVAL은 값을 증가시키지 않고 현재 값만 반환한다.
36번. 다음 중 인덱스를 설정하기에 가장 적합한 컬럼은?
선택지
내용
①
성별 (남/여만 있는 컬럼)
②
사원번호 (고유한 값)
③
비고 (대부분 NULL인 컬럼)
④
설명 (매우 긴 텍스트 컬럼)
정답: ②
해설: 인덱스는 고유성(카디널리티)이 높고 WHERE절에 자주 사용되는 컬럼에 설정하는 것이 효과적이다. 사원번호는 모든 값이 고유하므로 인덱스 효과가 크다. 성별은 값이 2개뿐이라 인덱스 효율이 낮고, NULL이 많은 컬럼이나 긴 텍스트 컬럼도 적합하지 않다.
SELECT name FROM employees
WHERE dept_id NOT IN (SELECT dept_id FROM departments WHERE dept_id IS NOT NULL);
departments에 dept_id: 10, 20, NULL이 있을 때:
선택지
내용
①
부서가 10, 20이 아닌 사원 (NULL 포함)
②
결과 0행
③
모든 사원
④
부서가 없는 사원만
정답: ①
해설: 서브쿼리에서 WHERE dept_id IS NOT NULL로 NULL을 이미 제거했으므로, NOT IN의 함정을 피할 수 있다. 결과는 부서 10, 20에 속하지 않는 사원이 반환된다.
39번. 다음 쿼리의 결과로 올바른 것은?
SELECT name, salary,
CASE
WHEN salary IS NULL THEN '미등록'
WHEN salary >= 5000 THEN '고급'
WHEN salary >= 3000 THEN '중급'
ELSE '초급'
END AS grade
FROM employees;
salary가 NULL인 사원의 grade는?
선택지
내용
①
고급
②
중급
③
초급
④
미등록
정답: ④
해설: CASE WHEN은 위에서부터 순서대로 평가한다. salary가 NULL이면 salary IS NULL이 먼저 TRUE가 되어 '미등록'이 반환된다. NULL에 대한 비교를 먼저 처리하는 것이 좋은 패턴이다.
40번. 다음 중 CONNECT_BY_ISLEAF의 값이 1인 경우의 의미는?
선택지
내용
①
루트 노드
②
중간 노드
③
리프 노드 (자식이 없는 노드)
④
에러
정답: ③
해설: CONNECT_BY_ISLEAF는 현재 행이 리프 노드(자식이 없는 말단 노드)이면 1, 아니면 0을 반환한다.
SELECT a, b, c, SUM(d)
FROM t
GROUP BY CUBE(a, b, c);
선택지
내용
①
4개
②
6개
③
8개
④
16개
정답: ③
해설: CUBE(a, b, c)는 3개 컬럼의 모든 가능한 조합을 생성한다. 2³ = 8개: (a,b,c), (a,b), (a,c), (b,c), (a), (b), (c), ().
25번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
CASE
WHEN salary >= 5000 THEN 'A'
WHEN salary >= 3000 THEN 'B'
ELSE 'C'
END AS grade,
CASE
WHEN dept_id = 10 THEN '본사'
ELSE '지사'
END AS location
FROM employees;
salary=4000, dept_id=10인 사원의 grade와 location은?
선택지
내용
①
grade='A', location='본사'
②
grade='B', location='본사'
③
grade='B', location='지사'
④
grade='C', location='본사'
정답: ②
해설: salary=4000: >= 5000은 FALSE, >= 3000은 TRUE → 'B'. dept_id=10: = 10은 TRUE → '본사'. 두 CASE WHEN은 독립적으로 평가된다.
26번. 다음 중 인덱스에 대한 설명으로 올바른 것은?
선택지
내용
①
인덱스는 항상 B-Tree 구조로만 생성된다
②
복합 인덱스에서 선행 컬럼이 WHERE절에 없으면 인덱스를 사용할 수 없다
③
인덱스는 테이블의 모든 행을 물리적으로 복사하여 저장한다
④
UNIQUE 제약조건 설정 시 자동으로 인덱스가 생성된다
정답: ④
해설: PRIMARY KEY와 UNIQUE 제약조건 설정 시 해당 컬럼에 자동으로 고유 인덱스가 생성된다. ①은 해시 인덱스 등 다른 구조도 있다. ②는 선행 컬럼 없이 후행 컬럼만으로도 사용 가능한 DBMS가 있다(단, 효율이 떨어짐). ③은 인덱스는 키 값과 ROWID만 저장한다.
27번. 다음 쿼리에서 결과 행 수는?
SELECT *
FROM A UNION ALL B;
A: 5행 (중복 포함하여 {1,2,3,4,5}), B: 4행 ({2,4,6,8})
선택지
내용
①
7행
②
9행
③
5행
④
8행
정답: ②
해설: UNION ALL은 중복을 허용하므로, 행 수를 단순히 합산한다. 5 + 4 = 9행.
28번. 다음 쿼리에서 에러가 발생하는 이유는?
SELECT dept_id, name, AVG(salary)
FROM employees
GROUP BY dept_id;
선택지
내용
①
GROUP BY절에 name이 포함되지 않았기 때문
②
AVG 함수를 사용할 수 없기 때문
③
GROUP BY와 SELECT의 순서가 잘못되었기 때문
④
에러가 발생하지 않음
정답: ①
해설: GROUP BY절에는 dept_id만 있지만, SELECT절에 집계 함수가 아닌 name이 포함되어 있다. GROUP BY 사용 시, SELECT에는 집계 함수 또는 GROUP BY에 포함된 컬럼만 올 수 있다. name은 GROUP BY에 없으므로 에러이다.
29번. 다음 중 CONNECT BY에서 PRIOR의 위치를 변경한 결과로 올바른 것은?
-- 원래: 위→아래
CONNECT BY PRIOR employee_id = manager_id
-- 변경: 아래→위
CONNECT BY employee_id = PRIOR manager_id
선택지
내용
①
두 쿼리의 결과가 동일하다
②
변경된 쿼리는 리프 노드에서 루트 노드 방향으로 탐색한다
③
변경된 쿼리는 에러가 발생한다
④
변경된 쿼리는 모든 행의 LEVEL이 1이 된다
정답: ②
해설: PRIOR가 manager_id에 붙으면, 자식의 manager_id를 통해 부모를 찾는 방향, 즉 아래→위(자식→부모)로 탐색한다.
30번. 다음 중 SAVEPOINT에 대한 설명으로 올바른 것은?
선택지
내용
①
트랜잭션의 모든 작업을 취소한다
②
트랜잭션 내에 중간 복구 지점을 설정한다
③
트랜잭션을 종료하고 결과를 영구 반영한다
④
DDL 명령어이다
정답: ②
해설: SAVEPOINT는 트랜잭션 내에 복구 지점을 설정하여, ROLLBACK TO SAVEPOINT로 해당 지점까지만 되돌릴 수 있게 한다. COMMIT은 ③, ROLLBACK은 ①에 해당한다. SAVEPOINT는 TCL이다.
31번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
선택지
내용
①
전체 평균 급여보다 높은 급여의 사원
②
부서별 평균 급여보다 높은 급여의 사원
③
가장 높은 급여의 사원
④
평균 급여와 같은 사원
정답: ①
해설: 서브쿼리가 독립적(비상관)이므로, 전체 사원의 평균 급여를 한 번만 계산하여, 그보다 높은 급여의 사원을 반환한다.
32번. 다음 테이블에서 SELECT dept_id, SUM(salary) FROM emp GROUP BY dept_id HAVING SUM(salary) > 5000의 결과는?
emp_id
dept_id
salary
1
10
3000
2
10
4000
3
20
2000
4
20
2000
5
30
6000
선택지
내용
①
부서 10만
②
부서 10, 30
③
부서 10, 20, 30
④
부서 30만
정답: ②
해설: 부서10: SUM=7000(>5000), 부서20: SUM=4000(<=5000), 부서30: SUM=6000(>5000). HAVING SUM(salary) > 5000을 만족하는 것은 부서 10과 30이다.
33번. 다음 중 뷰의 장점에 해당하지 않는 것은?
선택지
내용
①
특정 사용자에게 필요한 컬럼만 보여줌으로써 보안을 강화한다
②
복잡한 쿼리를 뷰로 저장하여 재사용할 수 있다
③
뷰에 인덱스를 생성하여 조회 성능을 향상시킬 수 있다
④
기반 테이블 변경 시 뷰를 통해 논리적 독립성을 유지할 수 있다
정답: ③
해설: 뷰는 가상의 테이블이므로 자체적으로 인덱스를 생성할 수 없다. 뷰의 장점은 보안, 편의성, 논리적 독립성이다.
34번. 다음 시퀀스에서 에러가 발생하는 경우는?
선택지
내용
①
SELECT seq_test.NEXTVAL FROM dual; (시퀀스 생성 후 첫 호출)
②
SELECT seq_test.CURRVAL FROM dual; (NEXTVAL 호출 없이 첫 호출)
③
INSERT INTO t VALUES(seq_test.NEXTVAL, 'data');
④
②번
정답: ②
해설: CURRVAL은 세션 내에서 NEXTVAL이 한 번 이상 호출되어야 사용할 수 있다. NEXTVAL 없이 CURRVAL을 호출하면 "sequence CURRVAL is not yet defined in this session" 에러가 발생한다.
SELECT name, salary,
RANK() OVER (PARTITION BY dept_id ORDER BY salary) AS rnk
FROM employees;
name
dept_id
salary
A
10
3000
B
10
5000
C
10
5000
D
20
4000
B의 rnk는?
선택지
내용
①
1
②
2
③
3
④
4
정답: ②
해설: PARTITION BY dept_id로 부서별 그룹. 부서10에서 ORDER BY salary: A=1, B=2, C=2 (동순위). 부서20에서 D=1. B의 rnk는 2이다.
38번. 다음 중 GRANT와 REVOKE에 대한 설명으로 올바른 것은?
선택지
내용
①
GRANT는 DDL이다
②
REVOKE는 권한을 부여하는 명령어이다
③
GRANT는 권한을 부여하고, REVOKE는 권한을 회수하는 명령어이다
④
둘 다 TCL이다
정답: ③
해설: GRANT는 권한 부여, REVOKE는 권한 회수 명령어이며, 둘 다 DCL(Data Control Language)이다.
39번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary <> ALL (SELECT salary FROM employees WHERE dept_id = 10);
부서 10의 급여가 3000, 4000일 때:
선택지
내용
①
부서 10의 급여와 다른 사원 (3000, 4000이 아닌 사원)
②
부서 10의 급여와 같은 사원
③
모든 사원
④
결과 0행
정답: ①
해설:<> ALL은 NOT IN과 동일하다. 서브쿼리 결과의 모든 값과 다르면 참. 즉, 3000도 아니고 4000도 아닌 사원을 반환한다. (단, 서브쿼리에 NULL이 없을 때만 정상 동작)
40번. 다음 중 DELETE와 TRUNCATE의 차이로 올바른 것은?
선택지
내용
①
TRUNCATE는 WHERE절로 조건부 삭제가 가능하다
②
DELETE는 트리거를 발생시키고, TRUNCATE는 발생시키지 않는다
③
DELETE는 DDL이고, TRUNCATE는 DML이다
④
TRUNCATE는 DELETE보다 느리다
정답: ②
해설: DELETE는 DML로 트리거가 발생하고, TRUNCATE는 DDL로 트리거가 발생하지 않는다. ①은 TRUNCATE는 WHERE 사용 불가. ③은 반대. ④는 TRUNCATE가 더 빠르다.
41번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
LAG(salary, 2) OVER (ORDER BY salary) AS prev2
FROM employees;
name
salary
A
2000
B
3000
C
4000
D
5000
D의 prev2는?
선택지
내용
①
2000
②
3000
③
4000
④
NULL
정답: ②
해설: LAG(salary, 2)는 2번째 이전 행의 값. D(5000)의 2번째 이전은 B(3000). A의 prev2=NULL(2번째 이전 없음), B의 prev2=NULL, C의 prev2=2000, D의 prev2=3000.
42번. 다음 쿼리에서 결과 행 수는?
SELECT *
FROM A FULL OUTER JOIN B ON A.id = B.id
WHERE A.id IS NULL;
A: (1, 2, 3), B: (3, 4, 5)
선택지
내용
①
0행
②
1행
③
2행
④
3행
정답: ③
해설: FULL OUTER JOIN 결과: (1,NULL), (2,NULL), (3,3), (NULL,4), (NULL,5). WHERE A.id IS NULL은 A쪽이 NULL인 행만: (NULL,4), (NULL,5) = 2행. 이 패턴은 "B에는 있지만 A에는 없는 데이터"를 찾을 때 사용된다.
43번. 다음 중 윈도우 함수의 OVER절에서 ORDER BY가 있을 때와 없을 때의 차이는?
선택지
내용
①
ORDER BY가 있으면 전체 파티션에 대한 단일 값, 없으면 누적 값
②
ORDER BY가 있으면 누적(Cumulative) 값, 없으면 전체 파티션에 대한 단일 값
③
차이가 없다
④
ORDER BY가 있으면 에러가 발생한다
정답: ②
해설: ORDER BY가 있으면 기본 프레임이 "처음부터 현재 행까지"로 설정되어 누적(Cumulative) 계산이 된다. ORDER BY가 없으면 파티션 전체에 대한 단일 집계 값이 모든 행에 반환된다.
44번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary IN (SELECT salary FROM employees WHERE dept_id = 10);
부서 10의 급여가 3000, 4000, NULL일 때:
선택지
내용
①
급여가 3000 또는 4000인 모든 사원
②
급여가 3000, 4000, NULL인 모든 사원
③
부서 10의 사원만
④
결과 0행
정답: ①
해설: IN은 NULL과의 매칭을 수행하지 않는다. salary IN (3000, 4000, NULL)에서 NULL은 무시되므로, salary=3000 또는 salary=4000인 사원이 반환된다. NOT IN이었다면 NULL 함정에 빠져 0행이 되었겠지만, IN은 정상 동작한다.
45번. 다음 중 SYS_CONNECT_BY_PATH에 대한 설명으로 올바른 것은?
선택지
내용
①
루트 노드의 값을 반환한다
②
현재 노드의 깊이(LEVEL)를 반환한다
③
루트부터 현재 노드까지의 경로를 문자열로 반환한다
④
리프 노드 여부를 반환한다
정답: ③
해설: SYS_CONNECT_BY_PATH(column, delimiter)는 루트 노드부터 현재 노드까지의 경로를 지정한 구분자로 연결한 문자열을 반환한다. ①은 CONNECT_BY_ROOT, ②는 LEVEL, ④는 CONNECT_BY_ISLEAF이다.
46번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
NTILE(2) OVER (ORDER BY salary DESC) AS half
FROM employees;
name
salary
A
5000
B
4000
C
3000
D
2000
선택지
내용
①
A:1, B:1, C:2, D:2
②
A:1, B:2, C:1, D:2
③
A:1, B:1, C:1, D:2
④
A:2, B:2, C:1, D:1
정답: ①
해설: NTILE(2)는 4행을 2개 그룹으로 나눈다. ORDER BY salary DESC이므로 상위 2명(A, B)이 1번 그룹, 하위 2명(C, D)이 2번 그룹.
SELECT name, salary
FROM employees
WHERE salary IS NOT NULL
ORDER BY salary DESC;
name
salary
A
3000
B
NULL
C
5000
D
NULL
선택지
내용
①
C, A 순서로 2행
②
C, A, B, D 순서로 4행
③
C, A, D, B 순서로 4행
④
A, C 순서로 2행
정답: ①
해설: WHERE salary IS NOT NULL로 NULL을 제외하면 A(3000), C(5000). ORDER BY salary DESC이므로 C(5000), A(3000) 순서. 2행.
13번. 다음 쿼리에서 결과 행 수는?
SELECT *
FROM A LEFT JOIN B ON A.id = B.id;
A: (1, 2, 3), B: (1, 2, 3, 4)
선택지
내용
①
3행
②
4행
③
7행
④
12행
정답: ①
해설: LEFT JOIN은 A의 모든 행을 포함. A의 모든 행(1,2,3)이 B와 매칭되므로 3행. B에만 있는 4는 LEFT JOIN에서 포함되지 않는다.
14번. 다음 중 GROUP BY에 대한 설명으로 올바른 것은?
선택지
내용
①
GROUP BY절의 컬럼은 SELECT에 반드시 포함되어야 한다
②
SELECT에는 GROUP BY 컬럼 또는 집계 함수만 올 수 있다
③
WHERE절은 GROUP BY 이후에 실행된다
④
GROUP BY는 NULL 값을 자동으로 제외한다
정답: ②
해설: GROUP BY 사용 시, SELECT에는 GROUP BY에 포함된 컬럼 또는 집계 함수만 올 수 있다. ①은 GROUP BY 컬럼이 SELECT에 없어도 되는 경우가 있다(하지만 관례적으로 포함). ③은 WHERE가 먼저. ④는 NULL도 하나의 그룹으로 처리.
15번. 다음 테이블에서 SELECT AVG(salary) FROM emp GROUP BY dept_id의 결과는?
SELECT name, dept_id, salary,
SUM(salary) OVER (PARTITION BY dept_id) AS dept_sum,
salary / SUM(salary) OVER (PARTITION BY dept_id) * 100 AS pct
FROM employees;
SELECT name, salary
FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE dept_id = 10)
AND salary < ALL (SELECT salary FROM employees WHERE dept_id = 20);
해설: COMMIT은 트랜잭션의 모든 변경 사항을 데이터베이스에 영구적으로 반영한다. COMMIT 후에는 ROLLBACK으로 복구할 수 없다.
31번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
FIRST_VALUE(name) OVER (PARTITION BY dept_id ORDER BY salary DESC) AS top_name
FROM employees;
name
dept_id
salary
A
10
3000
B
10
5000
C
20
4000
A의 top_name은?
선택지
내용
①
A
②
B
③
C
④
NULL
정답: ②
해설: FIRST_VALUE(name) OVER (PARTITION BY dept_id ORDER BY salary DESC)는 부서별 급여 내림차순에서 첫 번째 name을 반환. 부서10에서 가장 높은 급여는 B(5000)이므로, 부서10의 모든 행에서 top_name='B'.
32번. 다음 쿼리에서 결과 행 수는?
SELECT *
FROM A INNER JOIN B ON A.id = B.id
UNION
SELECT *
FROM A LEFT JOIN B ON A.id = B.id;
해설: 단순 뷰(하나의 테이블, 그룹 함수 없음, DISTINCT 없음, GROUP BY 없음)에서는 INSERT가 가능하다.
34번. 다음 시퀀스에서 MAXVALUE에 도달한 후 NOCYCLE 옵션의 동작은?
선택지
내용
①
1부터 다시 시작한다
②
에러가 발생한다
③
MAXVALUE를 유지한다
④
자동으로 INCREMENT BY가 음수가 된다
정답: ②
해설: NOCYCLE 옵션에서는 MAXVALUE에 도달한 후 NEXTVAL을 호출하면 에러가 발생한다. CYCLE 옵션이면 MINVALUE부터 다시 시작한다.
35번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary NOT BETWEEN 3000 AND 5000;
name
salary
A
2000
B
3000
C
4000
D
5000
E
6000
선택지
내용
①
A, E
②
B, C, D
③
A, B, D, E
④
C만
정답: ①
해설: NOT BETWEEN 3000 AND 5000은 3000 미만 또는 5000 초과. A(2000)와 E(6000)만 해당.
36번. 다음 중 REPEATABLE READ 격리 수준에서 방지되는 현상은?
선택지
내용
①
Dirty Read만
②
Dirty Read와 Non-Repeatable Read
③
Dirty Read, Non-Repeatable Read, Phantom Read 모두
④
Non-Repeatable Read만
정답: ②
해설: REPEATABLE READ는 Dirty Read와 Non-Repeatable Read를 방지하지만, Phantom Read는 발생할 수 있다.
37번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
SUM(salary) OVER (ORDER BY salary ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS moving_sum
FROM employees;
name
salary
A
2000
B
3000
C
4000
D
5000
B의 moving_sum은?
선택지
내용
①
3000
②
5000
③
9000
④
12000
정답: ③
해설: ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING은 이전 1행 + 현재 행 + 다음 1행의 합. B의 moving_sum = A(2000) + B(3000) + C(4000) = 9000.
38번. 다음 중 CONNECT_BY_ROOT의 결과로 올바른 것은?
SELECT employee_id, CONNECT_BY_ROOT employee_id AS root_id
FROM employees
START WITH employee_id = 1
CONNECT BY PRIOR employee_id = manager_id;
모든 행의 root_id는?
선택지
내용
①
각 행의 employee_id
②
각 행의 manager_id
③
1 (루트 노드의 employee_id)
④
NULL
정답: ③
해설: CONNECT_BY_ROOT는 현재 행이 속한 트리의 루트 노드 값을 반환한다. START WITH employee_id=1이 루트이므로, 모든 행의 root_id는 1이다.
39번. 다음 쿼리에서 GROUPING SETS의 결과 그룹 수는?
SELECT a, b, SUM(c)
FROM t
GROUP BY GROUPING SETS((a), (b));
선택지
내용
①
1개
②
2개
③
3개
④
4개
정답: ②
해설: GROUPING SETS((a), (b))는 지정한 그룹 조합만 생성한다. (a)별 집계와 (b)별 집계, 총 2개 그룹.
40번. 다음 중 트리거(Trigger)에 대한 설명으로 올바른 것은?
선택지
내용
①
수동으로만 실행할 수 있다
②
특정 테이블의 DML 이벤트 발생 시 자동으로 실행된다
③
DDL 명령어이다
④
SELECT 쿼리에서 자동으로 실행된다
정답: ②
해설: 트리거는 특정 테이블에서 INSERT, UPDATE, DELETE 같은 DML 이벤트가 발생하면 자동으로 실행되는 저장 프로시저이다.
41번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
LEAD(salary, 1, 0) OVER (ORDER BY salary) AS next_sal
FROM employees;
name
salary
A
2000
B
3000
C
4000
C의 next_sal은?
선택지
내용
①
NULL
②
0
③
4000
④
에러
정답: ②
해설: LEAD(salary, 1, 0)에서 세 번째 매개변수(0)는 다음 행이 없을 때 반환할 기본값이다. C의 다음 행이 없으므로 기본값 0이 반환된다.
42번. 다음 쿼리에서 결과 행 수는?
SELECT *
FROM A FULL OUTER JOIN B ON A.id = B.id;
A: (1, 2), B: (3, 4) (공통 없음)
선택지
내용
①
0행
②
2행
③
3행
④
4행
정답: ④
해설: FULL OUTER JOIN은 양쪽의 모든 행을 포함. INNER JOIN 결과: 0행. A에만: (1,NULL), (2,NULL) = 2행. B에만: (NULL,3), (NULL,4) = 2행. 총 4행.
43번. 다음 중 동의어(Synonym)에 대한 설명으로 올바른 것은?
선택지
내용
①
테이블의 다른 이름(별칭)을 부여하는 객체
②
인덱스의 다른 이름을 부여하는 객체
③
뷰의 물리적 저장소
④
트랜잭션의 복구 지점
정답: ①
해설: 동의어(Synonym)는 테이블, 뷰, 시퀀스 등 스키마 객체에 다른 이름을 부여하는 객체이다. 긴 스키마명.객체명을 간단히 사용할 수 있게 해준다.
44번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE EXISTS (SELECT 1 FROM departments d WHERE d.dept_id = employees.dept_id)
AND salary IS NOT NULL;
선택지
내용
①
부서가 존재하는 사원 중 급여가 NULL이 아닌 사원
②
부서가 존재하지 않는 사원
③
급여가 NULL인 사원
④
모든 사원
정답: ①
해설: EXISTS로 departments에 부서가 존재하는 사원만 필터링하고, AND salary IS NOT NULL로 급여가 NULL이 아닌 사원만 필터링.
45번. 다음 중 MERGE 문에 대한 설명으로 올바른 것은?
선택지
내용
①
INSERT와 DELETE를 결합한 DML이다
②
UPDATE와 DELETE를 결합한 DDL이다
③
INSERT와 UPDATE를 결합한 DML이다
④
SELECT와 UPDATE를 결합한 DCL이다
정답: ③
해설: MERGE는 조건에 따라 데이터가 존재하면 UPDATE하고, 존재하지 않으면 INSERT하는 DML 명령어이다. UPSERT라고도 불린다.
46번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
DENSE_RANK() OVER (PARTITION BY dept_id ORDER BY salary) AS drnk
FROM employees;
name
dept_id
salary
A
10
3000
B
10
3000
C
10
5000
D
20
4000
C의 drnk는?
선택지
내용
①
2
②
3
③
1
④
4
정답: ①
해설: 부서10에서 ORDER BY salary: A=1, B=1(동순위), C=2(DENSE_RANK는 건너뛰지 않음). 부서20에서 D=1.
47번. 다음 중 CUBE(a, b)에서 (NULL, b) 행의 의미는?
선택지
내용
①
a별 소계
②
b별 소계
③
총계
④
상세 데이터
정답: ②
해설: CUBE에서 (NULL, b)는 a를 무시한 b별 소계이다. ROLLUP에는 이 조합이 없고, CUBE에만 있다.
48번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary > ALL (SELECT salary FROM employees WHERE dept_id = 10)
OR salary < ANY (SELECT salary FROM employees WHERE dept_id = 20);
해설: 관계의 차수는 참여하는 엔티티의 수이다. 학생—과목—교수는 3개 엔티티가 참여하므로 차수 3의 관계이다.
8번. ON DELETE CASCADE와 ON DELETE SET NULL의 차이로 올바른 것은?
선택지
내용
①
CASCADE는 자식 행을 삭제하고, SET NULL은 FK를 NULL로 변경한다
②
CASCADE는 FK를 NULL로 변경하고, SET NULL은 자식 행을 삭제한다
③
둘 다 자식 행을 삭제한다
④
둘 다 FK를 NULL로 변경한다
정답: ①
해설: CASCADE는 자식 행을 함께 삭제, SET NULL은 자식 행의 FK를 NULL로 변경한다.
9번. 다음 중 정규화의 장점에 해당하지 않는 것은?
선택지
내용
①
데이터 중복 최소화
②
이상 현상 제거
③
조회 성능 향상
④
데이터 무결성 확보
정답: ③
해설: 정규화는 테이블을 분리하므로 오히려 JOIN이 증가하여 조회 성능이 저하될 수 있다. 조회 성능 향상은 반정규화의 목적이다.
10번. 다음 중 사용자 정의 무결성(User-defined Integrity)의 예는?
선택지
내용
①
PK는 NULL 불가
②
FK는 참조 테이블의 PK 값이어야 함
③
급여는 0 이상이어야 함
④
퇴사일은 입사일보다 늦어야 함
정답: ④
해설: "퇴사일 > 입사일"은 업무 규칙에 따른 사용자 정의 무결성이다. ①은 개체 무결성, ②는 참조 무결성, ③은 도메인 무결성(CHECK 제약)이다.
2과목. SQL 기본 및 활용 (11~50번)
11번. 다음 중 ROLLBACK에 대한 설명으로 올바른 것은?
선택지
내용
①
DDL 명령어를 실행한 후에도 복구할 수 있다
②
COMMIT한 트랜잭션을 복구할 수 있다
③
COMMIT 전의 DML 변경 사항을 취소할 수 있다
④
데이터베이스를 이전 시점으로 완전히 복구한다
정답: ③
해설: ROLLBACK은 COMMIT 전의 DML 변경 사항을 취소한다. DDL은 자동 커밋되므로 ROLLBACK 불가. COMMIT 후에는 복구 불가.
12번. 다음 쿼리의 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE dept_id = 10
ORDER BY name ASC, salary DESC;
name
dept_id
salary
김철수
10
3000
김철수
10
5000
이영희
10
4000
선택지
내용
①
김철수(5000), 김철수(3000), 이영희(4000)
②
김철수(3000), 김철수(5000), 이영희(4000)
③
이영희(4000), 김철수(5000), 김철수(3000)
④
김철수(5000), 이영희(4000), 김철수(3000)
정답: ①
해설: ORDER BY name ASC(이름 오름차순), salary DESC(급여 내림차순). 이름이 같으면 급여 내림차순. 김철수(5000), 김철수(3000), 이영희(4000).
13번. 다음 테이블에서 SELECT SUM(DISTINCT salary) FROM emp의 결과는?
emp_id
salary
1
3000
2
3000
3
5000
4
NULL
선택지
내용
①
11000
②
8000
③
5000
④
NULL
정답: ②
해설: SUM(DISTINCT salary)는 중복을 제거한 후 합산. NULL 제외, 고유 값: {3000, 5000}. 3000 + 5000 = 8000.
14번. 다음 쿼리에서 결과 행 수는?
SELECT *
FROM A LEFT JOIN B ON A.id = B.id
UNION ALL
SELECT *
FROM A RIGHT JOIN B ON A.id = B.id;
A: (1, 2, 3), B: (2, 3, 4)
선택지
내용
①
4행
②
5행
③
6행
④
7행
정답: ③
해설: LEFT JOIN: (1,NULL), (2,2), (3,3) = 3행. RIGHT JOIN: (2,2), (3,3), (NULL,4) = 3행. UNION ALL: 3 + 3 = 6행 (중복 포함). (2,2)와 (3,3)이 각각 2번씩 나옴.
15번. 다음 중 HAVING절에 대한 설명으로 올바른 것은?
선택지
내용
①
WHERE와 동일한 기능을 한다
②
GROUP BY 이전에 실행된다
③
그룹화된 결과를 필터링할 때 집계 함수를 사용할 수 있다
④
GROUP BY 없이 단독으로 사용할 수 없다
정답: ③
해설: HAVING은 GROUP BY 이후에 그룹 결과를 필터링하며, 집계 함수를 조건으로 사용할 수 있다. WHERE와의 핵심 차이이다. ④는 HAVING을 GROUP BY 없이 사용하면 SELECT의 집계 함수에 대해 필터링한다(일부 DBMS).
16번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary IN (3000, 4000, NULL);
name
salary
A
3000
B
4000
C
NULL
D
5000
선택지
내용
①
A, B, C
②
A, B
③
A, B, C, D
④
C만
정답: ②
해설: IN (3000, 4000, NULL)에서 NULL은 매칭에 영향을 주지 않는다. salary=3000 또는 salary=4000인 행만 반환. A(3000), B(4000) = 2행. C의 salary=NULL은 IN으로 매칭되지 않는다(NULL은 = 비교 불가).
17번. 다음 쿼리에서 결과 행 수는?
SELECT *
FROM A INNER JOIN B ON A.id = B.id
WHERE A.status = 'active';
SELECT name, salary
FROM employees
WHERE name LIKE '_영%';
name
salary
이영희
3000
박영수
4000
김영
5000
최철수
6000
선택지
내용
①
이영희, 박영수, 김영
②
이영희, 박영수만
③
이영희만
④
모든 사원
정답: ①
해설:'_영%'은 첫 번째 글자(아무 글자) + "영" + 0개 이상의 문자. 이영희(이+영+희), 박영수(박+영+수), 김영(김+영) 모두 매칭. 최철수는 "영"이 없으므로 미매칭.
20번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary = NULL;
선택지
내용
①
salary가 NULL인 사원
②
결과 0행
③
모든 사원
④
에러
정답: ②
해설:= NULL은 항상 NULL(UNKNOWN)을 반환하므로 WHERE 조건이 FALSE가 되어 0행이 반환된다. NULL을 비교하려면 반드시 IS NULL을 사용해야 한다.
21번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rn
FROM employees;
name
dept_id
salary
A
10
5000
B
10
5000
C
10
3000
D
20
4000
B의 rn은?
선택지
내용
①
1
②
2
③
3
④
NULL
정답: ②
해설: ROW_NUMBER()는 동순위에도 고유 번호를 부여. 부서10에서 ORDER BY salary DESC: A=1, B=2, C=3. 부서20에서 D=1.
22번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
SUM(salary) OVER (PARTITION BY dept_id ORDER BY salary
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumul
FROM employees;
name
dept_id
salary
A
10
2000
B
10
3000
C
10
5000
C의 cumul은?
선택지
내용
①
5000
②
8000
③
10000
④
3333
정답: ③
해설: 부서10에서 ORDER BY salary: A(2000)→B(3000)→C(5000). C의 cumul = 2000+3000+5000 = 10000.
23번. 다음 계층형 쿼리에서 employee_id=5의 LEVEL과 경로는?
SELECT employee_id, LEVEL, SYS_CONNECT_BY_PATH(name, '/') AS path
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id;
해설: DDL은 실행 즉시 자동 커밋(ROLLBACK 불가), DML은 COMMIT 전까지 ROLLBACK 가능(수동 커밋). ①은 반대.
31번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
NTILE(3) OVER (ORDER BY salary DESC) AS tercile
FROM employees;
name
salary
A
6000
B
5000
C
4000
D
3000
E
2000
F
1000
선택지
내용
①
A:1, B:1, C:2, D:2, E:3, F:3
②
A:1, B:1, C:1, D:2, E:2, F:3
③
A:3, B:3, C:2, D:2, E:1, F:1
④
A:1, B:2, C:3, D:1, E:2, F:3
정답: ①
해설: NTILE(3)은 6행을 3개 그룹으로 나눔. 6/3=2행씩. ORDER BY salary DESC이므로 A,B=1번 그룹, C,D=2번 그룹, E,F=3번 그룹.
32번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary
FROM employees e
WHERE salary = (SELECT MAX(salary) FROM employees WHERE dept_id = e.dept_id);
선택지
내용
①
전체 사원 중 최고 급여 사원
②
각 부서에서 가장 높은 급여를 받는 사원
③
평균 급여보다 높은 사원
④
부서별 평균 급여 사원
정답: ②
해설: 상관 서브쿼리로, 각 사원의 급여가 자기 부서의 MAX(salary)와 같은지 확인. 즉, 각 부서에서 가장 높은 급여를 받는 사원을 반환한다.
33번. 다음 중 뷰에 대한 설명으로 올바른 것은?
선택지
내용
①
뷰는 물리적으로 데이터를 저장한다
②
뷰를 삭제하면 기반 테이블의 데이터도 삭제된다
③
뷰는 기반 테이블의 변경을 반영하여 항상 최신 결과를 보여준다
④
뷰에는 반드시 인덱스를 생성해야 한다
정답: ③
해설: 뷰는 가상의 테이블로 데이터를 저장하지 않으며, 기반 테이블의 데이터가 변경되면 뷰의 조회 결과도 자동으로 반영된다. 뷰를 삭제해도 기반 테이블에는 영향이 없다.
34번. 다음 시퀀스에서 결과로 올바른 것은?
CREATE SEQUENCE seq1
START WITH 1
INCREMENT BY 2
MAXVALUE 10
CYCLE;
-- 6회 호출 시
SELECT seq1.NEXTVAL FROM dual; -- 1
SELECT seq1.NEXTVAL FROM dual; -- 3
SELECT seq1.NEXTVAL FROM dual; -- 5
SELECT seq1.NEXTVAL FROM dual; -- 7
SELECT seq1.NEXTVAL FROM dual; -- 9
SELECT seq1.NEXTVAL FROM dual; -- ?
선택지
내용
①
10
②
11
③
1 (CYCLE)
④
에러
정답: ③
해설: INCREMENT BY 2이므로 1, 3, 5, 7, 9 다음은 11이 되어야 하지만, MAXVALUE=10을 초과하므로 CYCLE 옵션에 의해 MINVALUE(기본 1)로 돌아간다. 6회 호출 시 1.
35번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary > 3000
UNION
SELECT name, salary
FROM employees
WHERE dept_id = 10;
name
salary
dept_id
A
4000
10
B
2000
10
C
5000
20
D
3000
10
선택지
내용
①
A, C
②
A, B, C, D
③
A, B, D, C
④
A, C, B, D
정답: ②
해설: 첫 번째 쿼리(salary>3000): A(4000), C(5000). 두 번째 쿼리(dept_id=10): A(4000), B(2000), D(3000). UNION(중복 제거): A, B, C, D = 4행.
36번. 다음 중 Non-Repeatable Read를 방지하는 격리 수준은?
선택지
내용
①
READ UNCOMMITTED
②
READ COMMITTED
③
REPEATABLE READ
④
③만
정답: ③
해설: Non-Repeatable Read를 방지하는 최소 격리 수준은 REPEATABLE READ이다. READ COMMITTED에서는 Non-Repeatable Read가 발생할 수 있다.
37번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
LAST_VALUE(salary) OVER (PARTITION BY dept_id ORDER BY salary
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_sal
FROM employees;
name
dept_id
salary
A
10
2000
B
10
5000
C
10
3000
A의 last_sal은?
선택지
내용
①
2000
②
3000
③
5000
④
NULL
정답: ③
해설: LAST_VALUE는 윈도우 프레임의 마지막 값. ORDER BY salary로 정렬하면 A(2000), C(3000), B(5000). ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING으로 전체 프레임을 지정하면 마지막은 B(5000). 모든 행의 last_sal=5000.
38번. 다음 중 CONNECT_BY_ISLEAF가 0인 노드의 특징은?
선택지
내용
①
루트 노드이다
②
자식이 없는 말단 노드이다
③
자식이 있는 중간 노드 또는 루트 노드이다
④
LEVEL이 1인 노드이다
정답: ③
해설: CONNECT_BY_ISLEAF=0은 자식이 있는 노드(중간 노드 또는 루트 노드)이다. =1이면 자식이 없는 리프(말단) 노드이다.
39번. 다음 쿼리에서 GROUPING(city)가 1인 행의 의미는?
SELECT region, city, SUM(sales), GROUPING(region) AS g_r, GROUPING(city) AS g_c
FROM sales_table
GROUP BY CUBE(region, city);
선택지
내용
①
city가 그룹화에 사용된 상세 행
②
city가 소계로 집계된 행 (지역별 소계 또는 총계)
③
에러 행
④
region이 소계로 집계된 행
정답: ②
해설: GROUPING(city)=1은 city 컬럼이 소계로 집계된 행이다. 이는 region별 소계(g_r=0, g_c=1) 또는 총계(g_r=1, g_c=1)에 해당한다.
40번. 다음 중 동의어(Synonym)를 생성하는 SQL로 올바른 것은?
선택지
내용
①
CREATE ALIAS emp FOR employees;
②
CREATE SYNONYM emp FOR employees;
③
CREATE VIEW emp AS SELECT * FROM employees;
④
CREATE INDEX emp ON employees;
정답: ②
해설: 동의어 생성 구문은 CREATE SYNONYM 동의어이름 FOR 원래객체이름;이다.
41번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
LAG(salary, 1, 0) OVER (PARTITION BY dept_id ORDER BY salary) AS prev_sal
FROM employees;
name
dept_id
salary
A
10
2000
B
10
3000
C
20
4000
A의 prev_sal은?
선택지
내용
①
NULL
②
0
③
2000
④
3000
정답: ②
해설: LAG(salary, 1, 0)에서 기본값이 0. 부서10에서 A는 첫 번째 행이므로 이전 행이 없어 기본값 0이 반환된다.
42번. 다음 쿼리에서 결과 행 수는?
SELECT *
FROM A LEFT JOIN B ON A.id = B.id
WHERE B.id IS NOT NULL
UNION ALL
SELECT *
FROM A LEFT JOIN B ON A.id = B.id
WHERE B.id IS NULL;
A: (1, 2, 3), B: (1, 2)
선택지
내용
①
2행
②
3행
③
4행
④
5행
정답: ②
해설: 첫 번째 쿼리(B.id IS NOT NULL): (1,1), (2,2) = 2행. 두 번째 쿼리(B.id IS NULL): (3,NULL) = 1행. UNION ALL: 2+1 = 3행. 결국 원래 LEFT JOIN의 전체 결과와 동일.
43번. 다음 중 MERGE 문의 동작으로 올바른 것은?
선택지
내용
①
대상 행이 존재하면 DELETE하고, 없으면 INSERT한다
②
대상 행이 존재하면 UPDATE하고, 없으면 INSERT한다
③
대상 행이 존재하면 INSERT하고, 없으면 UPDATE한다
④
항상 모든 행을 INSERT한다
정답: ②
해설: MERGE(UPSERT)는 조건에 일치하는 행이 있으면 UPDATE, 없으면 INSERT한다.
44번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary
FROM employees
WHERE salary BETWEEN (SELECT MIN(salary) FROM employees WHERE dept_id = 10)
AND (SELECT MAX(salary) FROM employees WHERE dept_id = 10);
부서 10의 급여 범위: 3000~5000일 때:
선택지
내용
①
부서 10의 사원만
②
급여가 3000~5000인 모든 사원 (부서 무관)
③
부서 10의 평균 급여 사원
④
에러
정답: ②
해설: BETWEEN (SELECT MIN...) AND (SELECT MAX...)는 부서 10의 급여 범위(3000~5000)를 기준으로, 모든 부서에서 그 범위에 해당하는 사원을 반환한다.
45번. 다음 중 GRANT의 WITH ADMIN OPTION의 의미는?
선택지
내용
①
권한을 받은 사용자가 다른 사용자에게 권한을 부여할 수 있다
②
권한을 받은 사용자가 관리자로 승격된다
③
권한을 받은 사용자가 모든 테이블에 접근할 수 있다
④
권한을 받은 사용자가 자동으로 COMMIT한다
정답: ①
해설: WITH ADMIN OPTION은 시스템 권한에 대해, 권한을 받은 사용자가 다른 사용자에게 해당 권한을 재부여할 수 있는 옵션이다. WITH GRANT OPTION은 객체 권한에 대한 것.
46번. 다음 쿼리에서 결과로 올바른 것은?
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS r,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
FROM employees;