자격증 공부 관련/그 외 자격증

SQLD 모의고사 5회분 — 과년도 기출 스타일 문제, 선택지, 정답 및 해설

영구원(09One) 2026. 8. 31. 14:30

SQLD 모의고사 5회분 — 과년도 기출 스타일 문제, 선택지, 정답 및 해설

시험 구성: 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으로 나누는 것이 아니다.


30번. 다음 중 DCL(Data Control Language)에 해당하는 것은?

선택지 내용
CREATE
INSERT
GRANT
COMMIT

정답: ③

해설: GRANT(권한 부여)와 REVOKE(권한 회수)는 DCL이다. CREATE는 DDL, INSERT는 DML, COMMIT은 TCL이다.


31번. 다음 쿼리의 결과에서 박민수의 RANK 값은?

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 = '개발';

A: 3행 (id: 1,2,3), B: 2행 (id:1, dept:'영업'), (id:2, dept:'개발')

선택지 내용
1행
2행
3행
4행

정답: ①

해설: 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) 순서로 탐색한다.


47번. 다음 CUBE 쿼리에서 생성되는 그룹 조합의 수는?

SELECT a, b, SUM(c)
FROM t
GROUP BY CUBE(a, b);
선택지 내용
2개
3개
4개
8개

정답: ③

해설: CUBE(a, b)는 모든 가능한 조합의 소계를 생성한다: (a, b), (a, NULL), (NULL, b), (NULL, NULL) = 4개. ROLLUP(a, b)이면 (a, b), (a, NULL), (NULL, NULL) = 3개이다. CUBE(a, b, c)이면 2³ = 8개이다.


48번. 다음 중 DELETE와 TRUNCATE의 차이로 올바른 것은?

선택지 내용
둘 다 DML이다
DELETE는 WHERE절 사용이 가능하고, TRUNCATE는 불가능하다
TRUNCATE는 DELETE보다 느리다
DELETE는 ROLLBACK이 불가능하다

정답: ②

해설: 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를 위반한다.


3번. 다음 테이블을 3NF까지 정규화한 결과로 올바른 것은?

원본: 주문(주문번호, 고객ID, 고객명, 고객주소, 상품번호, 상품명, 수량, 단가)

함수 종속:

  • 주문번호 → 고객ID, 고객ID → 고객명, 고객주소
  • 상품번호 → 상품명, 단가
  • (주문번호, 상품번호) → 수량
선택지 내용
고객(고객ID, 고객명, 고객주소), 상품(상품번호, 상품명, 단가), 주문(주문번호, 고객ID, 상품번호, 수량)
주문(주문번호, 고객ID, 고객명, 상품번호, 상품명, 수량, 단가) — 그대로
고객(고객ID, 고객명), 주문(주문번호, 고객ID, 상품번호, 수량)
주문(주문번호, 수량), 고객(고객ID, 고객명, 고객주소), 상품(상품번호, 상품명, 단가)

정답: ①

해설: 고객ID→고객명, 고객주소(이행 종속)를 분리하여 고객 테이블, 상품번호→상품명, 단가를 분리하여 상품 테이블, 나머지를 주문 테이블로 구성하면 3NF를 충족한다.


4번. 다음 중 개체 무결성(Entity Integrity)을 위반하는 것은?

선택지 내용
사원번호(PK)에 NULL 입력
사원번호(PK)에 중복 값 입력
부서번호(FK)에 부서 테이블에 없는 값 입력
①과 ② 모두

정답: ④

해설: 개체 무결성은 기본키(PK)가 NULL이 아니고 유일해야 한다는 규칙이다. PK에 NULL을 입력하거나 중복 값을 입력하면 개체 무결성이 위반된다. ③은 참조 무결성 위반이다.


5번. M:N 관계를 실제 데이터베이스에서 구현하는 방법은?

선택지 내용
한쪽 테이블에 외래키를 추가한다
관계 테이블(조인 테이블)을 별도로 생성한다
양쪽 테이블을 하나로 합친다
뷰(View)를 생성하여 해결한다

정답: ②

해설: M:N 관계는 직접 구현할 수 없으므로, 두 엔티티의 PK를 외래키로 포함하는 관계 테이블을 별도로 생성하여 1:N + 1:N으로 분해한다. 예: 학생-과목의 M:N → 수강(학번FK, 과목번호FK, 성적) 테이블.


6번. 다음 중 식별 관계(Identifying Relationship)의 예는?

선택지 내용
부서(부서번호PK) — 사원(사원번호PK, 부서번호FK)
주문(주문번호PK) — 주문상세(주문번호PK+상품번호PK)
사원(사원번호PK) — 사원상세(사원번호PK)
②와 ③ 모두

정답: ④

해설: 식별 관계는 부모의 PK가 자식의 PK에 포함되는 관계이다. ②에서 주문상세의 PK에 주문번호가 포함되고, ③에서 사원상세의 PK에 사원번호가 포함되므로 둘 다 식별 관계이다. ①은 부서번호가 사원의 PK가 아닌 FK만 되므로 비식별 관계이다.


7번. 파생 속성(Derived Attribute)의 예로 가장 적절한 것은?

선택지 내용
사원의 이름
사원의 출생일
사원의 나이 (출생일로부터 계산)
사원의 주소 (시/도, 시/군/구, 동)

정답: ③

해설: 파생 속성은 다른 속성에서 유도·계산되는 속성이다. 나이는 출생일로부터 계산되므로 파생 속성이다. ④는 복합 속성이다.


8번. ON DELETE SET NULL의 동작으로 올바른 것은?

선택지 내용
부모 행 삭제 시 자식 행도 함께 삭제된다
부모 행 삭제 시 자식 행의 FK가 NULL로 변경된다
부모 행 삭제 시 자식 행이 있으면 삭제가 거부된다
부모 행 삭제 시 자식 행의 FK가 0으로 변경된다

정답: ②

해설: ON DELETE SET NULL은 부모 행이 삭제될 때, 자식 행의 외래키 값을 NULL로 변경한다. ①은 CASCADE, ③은 RESTRICT의 동작이다.


9번. 후보식별자와 대체식별자에 대한 설명으로 올바른 것은?

선택지 내용
후보식별자는 주식별자로 선정된 것만 해당한다
대체식별자는 후보식별자 중 주식별자로 선정되지 않은 것이다
후보식별자와 대체식별자는 서로 배타적이다
대체식별자는 반드시 인조식별자여야 한다

정답: ②

해설: 대체식별자는 후보식별자 중 주식별자(PK)로 선정되지 않은 나머지이다. 후보식별자와 대체식별자는 동시 성립 가능하며(대체식별자는 후보식별자의 부분집합), 대체식별자는 본질식별자일 수도 있다.


10번. 도메인 무결성(Domain Integrity)을 위반하는 경우는?

선택지 내용
PK에 NULL 입력
FK에 참조 테이블에 없는 값 입력
정수형 컬럼에 문자열 입력
NOT NULL 컬럼에 NULL 입력

정답: ③

해설: 도메인 무결성은 속성 값이 정의된 도메인(값의 범위, 타입 등) 내에 있어야 한다는 규칙이다. 정수형 컬럼에 문자열을 입력하면 도메인 무결성이 위반된다. ①은 개체 무결성, ②는 참조 무결성, ④는 NOT NULL 제약 위반이다.


2과목. SQL 기본 및 활용 (11~50번)


11번. 다음 중 DML에 해당하지 않는 것은?

선택지 내용
SELECT
INSERT
DROP
UPDATE

정답: ③

해설: DROP은 DDL이다. DML: SELECT, INSERT, UPDATE, DELETE, MERGE. DDL: CREATE, ALTER, DROP, TRUNCATE, RENAME.


12번. 다음 쿼리에서 에러가 발생하는 부분은?

SELECT dept_id, AVG(salary) AS avg_sal
FROM employees
WHERE avg_sal > 3000
GROUP BY dept_id;
선택지 내용
SELECT절
WHERE절
GROUP BY절
에러가 발생하지 않음

정답: ②

해설: WHERE절에서는 SELECT의 별칭(avg_sal)을 사용할 수 없다. WHERE는 SELECT보다 먼저 실행되기 때문이다. 또한 집계 함수(AVG)의 결과를 필터링하려면 WHERE가 아닌 HAVING을 사용해야 한다.


13번. 다음 테이블에서 SELECT SUM(salary) FROM emp의 결과는?

name salary
A 3000
B NULL
C 5000
선택지 내용
8000
2666.67
NULL
0

정답: ①

해설: SUM 함수는 NULL 값을 자동으로 무시하고 계산한다. 3000 + 5000 = 8000이다.


14번. 다음 쿼리의 결과 행 수는?

SELECT *
FROM A FULL OUTER JOIN B ON A.id = B.id;

A: (1, 2, 3), B: (2, 3, 4)

선택지 내용
2행
3행
4행
6행

정답: ③

해설: FULL OUTER JOIN은 양쪽 테이블의 모든 행을 포함한다. INNER JOIN 결과: (2, 3) = 2행. A에만 있는 행: (1) = 1행. B에만 있는 행: (4) = 1행. 총 2 + 1 + 1 = 4행.


15번. 다음 중 SELF JOIN에 대한 설명으로 올바른 것은?

선택지 내용
서로 다른 두 테이블을 조인한다
같은 테이블을 자기 자신과 조인한다
반드시 OUTER JOIN을 사용해야 한다
CROSS JOIN과 동일한 결과를 반환한다

정답: ②

해설: SELF JOIN은 같은 테이블을 두 번 참조하여 자기 자신과 조인하는 것이다. 주로 계층 구조(상사-부하 관계)를 조회할 때 사용한다. 반드시 별칭(alias)을 사용하여 두 참조를 구분해야 한다.


16번. 다음 쿼리의 의미로 가장 적절한 것은?

SELECT name FROM employees
WHERE EXISTS (SELECT 1 FROM departments WHERE dept_id = employees.dept_id AND location = '서울');
선택지 내용
서울에 위치한 부서에 소속된 사원의 이름
서울에 소속된 모든 사원의 이름
부서가 없는 사원의 이름
서울 외 지역 부서의 사원 이름

정답: ①

해설: EXISTS는 서브쿼리의 결과가 하나 이상의 행을 반환하면 TRUE이다. 메인쿼리의 각 사원에 대해, 그 사원의 부서가 서울에 있는지 확인하여, 서울에 있는 부서의 사원만 반환한다.


17번. 다음 결과에서 쿼리 A INTERSECT B의 결과는?

A = {1, 2, 3, 4}, B = {3, 4, 5, 6}

선택지 내용
{1, 2}
{3, 4}
{1, 2, 3, 4, 5, 6}
{5, 6}

정답: ②

해설: INTERSECT(교집합)는 두 쿼리 결과의 공통 원소만 반환한다. A와 B의 공통 원소는 {3, 4}이다.


18번. 다음 중 집합 연산에 대한 설명으로 올바른 것은?

선택지 내용
UNION은 컬럼 수가 달라도 사용할 수 있다
UNION ALL은 UNION보다 항상 같거나 많은 행을 반환한다
MINUS는 양쪽 모두에서 공통 원소를 제거한다
ORDER BY는 집합 연산의 모든 쿼리에 사용할 수 있다

정답: ②

해설: UNION ALL은 중복을 허용하므로, UNION(중복 제거)보다 항상 같거나 많은 행을 반환한다. ①은 컬럼 수와 타입이 일치해야 한다. ③은 MINUS는 첫 번째에서 두 번째를 뺀 것(차집합). ④는 ORDER BY는 마지막 쿼리에만 사용 가능하다.


19번. 다음 LIKE 패턴에서 '김'으로 시작하는 3글자 문자열만 검색되는 것은?

선택지 내용
LIKE '김%'
LIKE '김_'
LIKE '김__'
LIKE '%김%'

정답: ③

해설: _는 정확히 1개의 임의 문자를 의미한다. '김__'은 "김" 다음에 2개의 문자가 오는, 총 3글자 문자열만 매칭된다. '김%'은 2글자 이상, '김_'은 정확히 2글자, '%김%'은 "김"이 포함된 모든 문자열이다.


20번. 다음 테이블에서 SELECT COUNT(*), COUNT(mgr_id) FROM emp의 결과는?

emp_id name mgr_id
1 A NULL
2 B 1
3 C 1
4 D NULL
선택지 내용
COUNT(*)=4, COUNT(mgr_id)=4
COUNT(*)=4, COUNT(mgr_id)=2
COUNT(*)=2, COUNT(mgr_id)=2
COUNT(*)=4, COUNT(mgr_id)=3

정답: ②

해설: COUNT(*)는 전체 행 수 = 4. COUNT(mgr_id)는 NULL이 아닌 행만 세므로, 2와 3의 mgr_id만 카운트 = 2.


21번. 다음 쿼리의 결과로 올바른 것은?

SELECT name, salary,
       DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees;
name salary
A 5000
B 5000
C 4000
D 3000
선택지 내용
A:1, B:1, C:3, D:4
A:1, B:1, C:2, D:3
A:1, B:2, C:3, D:4
A:1, B:1, C:3, D:3

정답: ②

해설: DENSE_RANK()는 동순위 후에도 건너뛰지 않고 연속 번호를 매긴다. A=1, B=1(동순위), C=2, D=3이다. RANK였다면 A=1, B=1, C=3, D=4이다.


22번. 다음 쿼리에서 PARTITION BY의 역할은?

SELECT name, dept_id, salary,
       RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS dept_rnk
FROM employees;
선택지 내용
전체 사원을 급여 순으로 순위 매기기
부서별로 그룹을 나누고 각 그룹 내에서 급여 순으로 순위 매기기
부서별 급여 합계를 계산하기
부서를 알파벳 순으로 정렬하기

정답: ②

해설: PARTITION BY dept_id는 부서별로 그룹(파티션)을 만들고, 각 그룹 내에서 ORDER BY salary DESC 기준으로 순위를 매긴다. 부서가 바뀌면 순위가 초기화된다.


23번. 다음 계층형 쿼리에서 employee_id=3의 LEVEL은?

SELECT employee_id, LEVEL
FROM employees
START WITH employee_id = 1
CONNECT BY PRIOR employee_id = manager_id;
employee_id manager_id
1 NULL
2 1
3 2
4 1
선택지 내용
1
2
3
4

정답: ③

해설: 1(루트, LEVEL=1) → 2(LEVEL=2) → 3(LEVEL=3). employee_id=3의 LEVEL은 3이다.


24번. 다음 ROLLUP 쿼리에서 총계 행의 region과 city 값은?

SELECT region, city, SUM(sales)
FROM sales_table
GROUP BY ROLLUP(region, city);
선택지 내용
region='총계', city='총계'
region=NULL, city=NULL
region=0, city=0
region='TOTAL', city='TOTAL'

정답: ②

해설: ROLLUP의 소계·총계 행에서는 해당 컬럼의 값이 NULL로 표시된다. 총계 행은 region=NULL, city=NULL이다. GROUPING 함수로 소계 행인지 판별할 수 있다.


25번. 다음 중 NOT IN의 결과가 0행이 되는 경우는?

선택지 내용
서브쿼리 결과에 빈 행이 있을 때
서브쿼리 결과에 NULL이 하나라도 있을 때
메인쿼리에 NULL이 있을 때
서브쿼리 결과가 1행일 때

정답: ②

해설: NOT IN에 NULL이 포함되면, x NOT IN (a, NULL)x != a AND x != NULL로 해석된다. x != NULL은 항상 NULL(UNKNOWN)이므로 전체가 FALSE가 되어 0행이 된다.


26번. 다음 쿼리에서 결과 행 수는?

SELECT *
FROM A LEFT JOIN B ON A.id = B.id
WHERE B.id IS NOT NULL;

A: (1, 2, 3), B: (1, 2)

선택지 내용
1행
2행
3행
4행

정답: ②

해설: LEFT JOIN 결과: (1,1), (2,2), (3,NULL). WHERE B.id IS NOT NULL을 적용하면 (3,NULL)이 제외되고 (1,1), (2,2) = 2행. 이는 INNER JOIN과 동일한 결과이다.


27번. 다음 중 윈도우 함수에 대한 설명으로 올바른 것은?

선택지 내용
윈도우 함수는 GROUP BY와 반드시 함께 사용해야 한다
윈도우 함수의 결과는 그룹당 1행으로 압축된다
윈도우 함수는 원본 행 수를 유지하면서 그룹별 계산을 수행한다
윈도우 함수는 WHERE절에서 사용할 수 있다

정답: ③

해설: 윈도우 함수는 GROUP BY 없이 OVER절을 사용하며, 원본 행 수를 유지하면서 그룹별(파티션별) 계산을 수행한다. 결과가 그룹당 1행으로 압축되지 않는 것이 집계 함수와의 핵심 차이이다. 윈도우 함수는 WHERE절에서 직접 사용할 수 없다.


28번. 다음 쿼리에서 LEAD(salary, 1)의 결과로 올바른 것은?

SELECT name, salary,
       LEAD(salary, 1) OVER (ORDER BY salary) AS next_sal
FROM employees;
name salary
A 2000
B 3000
C 4000
선택지 내용
A:3000, B:4000, C:NULL
A:NULL, B:2000, C:3000
A:4000, B:3000, C:2000
A:2000, B:3000, C:4000

정답: ①

해설: LEAD(salary, 1)은 ORDER BY 기준으로 바로 다음 행의 salary를 가져온다. A의 다음은 B(3000), B의 다음은 C(4000), C의 다음은 없으므로 NULL.


29번. 다음 쿼리의 결과로 올바른 것은?

SELECT name, salary,
       SUM(salary) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumul
FROM employees;
name salary
A 2000
B 3000
C 4000
선택지 내용
A:2000, B:5000, C:9000
A:9000, B:9000, C:9000
A:2000, B:3000, C:4000
A:4000, B:7000, C:9000

정답: ①

해설: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW는 첫 번째 행부터 현재 행까지의 누적합을 계산한다. A: 2000, B: 2000+3000=5000, C: 2000+3000+4000=9000.


30번. 다음 중 TCL(Transaction Control Language)에 해당하는 것은?

선택지 내용
CREATE
SELECT
GRANT
SAVEPOINT

정답: ④

해설: TCL: COMMIT, ROLLBACK, SAVEPOINT. CREATE는 DDL, SELECT는 DML, GRANT는 DCL이다.


31번. 다음 중 SERIALIZABLE 격리 수준에서 방지되는 현상은?

선택지 내용
Dirty Read만
Dirty Read와 Non-Repeatable Read만
Dirty Read, Non-Repeatable Read, Phantom Read 모두
어떤 현상도 방지하지 못한다

정답: ③

해설: SERIALIZABLE은 가장 높은 격리 수준으로, Dirty Read, Non-Repeatable Read, Phantom Read를 모두 방지한다.


32번. 다음 테이블에서 SELECT MIN(salary), MAX(salary) FROM emp WHERE dept_id = 10의 결과는?

emp_id dept_id salary
1 10 3000
2 10 NULL
3 10 5000
4 20 4000
선택지 내용
MIN=0, MAX=5000
MIN=3000, MAX=5000
MIN=NULL, MAX=NULL
MIN=3000, MAX=4000

정답: ②

해설: WHERE dept_id=10으로 필터링하면 emp_id 1, 2, 3이 대상이다. MIN/MAX는 NULL을 무시하므로, MIN(3000, 5000)=3000, MAX(3000, 5000)=5000.


33번. 다음 쿼리에서 GROUPING(region)이 1인 행의 의미는?

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이 많은 컬럼이나 긴 텍스트 컬럼도 적합하지 않다.


37번. 다음 쿼리에서 결과 행 수는?

SELECT *
FROM A CROSS JOIN B
WHERE A.id > B.id;

A: (1, 2, 3), B: (1, 2, 3)

선택지 내용
3행
6행
9행
0행

정답: ①

해설: CROSS JOIN은 3×3=9행. WHERE A.id > B.id를 적용하면: (2,1), (3,1), (3,2) = 3행.


38번. 다음 서브쿼리의 결과로 올바른 것은?

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을 반환한다.


41번. 다음 중 ROLLUP(a, b, c)에서 생성되지 않는 그룹 조합은?

선택지 내용
(a, b, c)
(a, b)
(b, c)
()

정답: ③

해설: ROLLUP(a, b, c)은 오른쪽에서 왼쪽으로 제거: (a,b,c) → (a,b) → (a) → (). (b, c)는 CUBE에서만 생성된다.


42번. 다음 쿼리에서 ORDER BY 1의 의미는?

SELECT emp_id, name, salary
FROM employees
ORDER BY 1;
선택지 내용
첫 번째 컬럼(emp_id)으로 정렬
값이 1인 행만 정렬
1번째 행만 출력
에러 발생

정답: ①

해설: ORDER BY 뒤에 숫자를 쓰면, SELECT절의 해당 순번 컬럼으로 정렬한다. ORDER BY 1은 SELECT의 첫 번째 컬럼(emp_id)으로 정렬한다.


43번. 다음 쿼리에서 HAVING절의 역할로 가장 적절한 것은?

SELECT dept_id, COUNT(*) AS cnt
FROM employees
GROUP BY dept_id
HAVING COUNT(*) >= 5;
선택지 내용
사원 수가 5명 이상인 행만 필터링
사원 수가 5명 이상인 부서만 필터링
전체 사원 중 5번째 이후 사원만 필터링
부서번호가 5 이상인 부서만 필터링

정답: ②

해설: HAVING은 GROUP BY 이후에 그룹의 결과를 필터링한다. COUNT(*) >= 5는 그룹(부서)별 사원 수가 5명 이상인 그룹만 남긴다.


44번. 다음 중 데이터베이스에서 트랜잭션이 필요한 이유로 가장 적절한 것은?

선택지 내용
조회 속도를 향상시키기 위해
데이터의 원자성(Atomicity)을 보장하여 일관성을 유지하기 위해
저장 공간을 절약하기 위해
여러 사용자가 동시에 읽기만 할 때

정답: ②

해설: 트랜잭션은 여러 작업을 하나의 논리적 단위로 묶어, 모두 성공하거나 모두 실패하도록 보장(원자성)함으로써 데이터의 일관성을 유지한다.


45번. 다음 쿼리에서 SYS_CONNECT_BY_PATH(name, '/')의 결과로 올바른 것은?

SELECT name, SYS_CONNECT_BY_PATH(name, '/') AS path
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id;
employee_id name manager_id
1 대표 NULL
2 부장 1
3 대리 2

대리(3)의 path는?

선택지 내용
/대리
/대표/부장
/대표/부장/대리
/부장/대리

정답: ③

해설: SYS_CONNECT_BY_PATH는 루트부터 현재 노드까지의 경로를 구분자로 연결한다. 대리(3)의 경로는 루트(대표) → 부장 → 대리이므로, /대표/부장/대리이다.


46번. 다음 중 DELETE에 대한 설명으로 올바른 것은?

선택지 내용
DDL에 해당한다
WHERE절을 사용하여 조건부 삭제가 가능하다
자동 커밋되므로 ROLLBACK이 불가능하다
테이블의 구조도 함께 삭제한다

정답: ②

해설: DELETE는 DML로 WHERE절을 사용하여 특정 조건의 행만 삭제할 수 있다. COMMIT 전까지 ROLLBACK이 가능하다. 테이블 구조는 유지된다.


47번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name, salary,
       NTILE(4) OVER (ORDER BY salary DESC) AS quartile
FROM employees;

사원이 8명이고 급여가 모두 다를 때, 가장 높은 급여 사원의 quartile은?

선택지 내용
1
2
3
4

정답: ①

해설: NTILE(4)는 전체 행을 4개 그룹으로 나눈다. ORDER BY salary DESC이므로 가장 높은 급여가 1분위(quartile=1)에 속한다.


48번. 다음 중 뷰를 통한 DELETE가 불가능한 경우는?

선택지 내용
단순 뷰 (하나의 테이블, 그룹 함수 없음)
DISTINCT를 포함한 뷰
GROUP BY를 포함한 뷰
②와 ③ 모두

정답: ④

해설: DISTINCT, 그룹 함수, GROUP BY를 포함한 뷰에서는 DELETE가 불가능하다. 단순 뷰에서는 INSERT, UPDATE, DELETE 모두 가능하다.


49번. 다음 중 GRANT 명령어의 WITH GRANT OPTION의 의미는?

선택지 내용
권한을 받은 사용자가 다른 사용자에게도 권한을 부여할 수 있다
권한을 받은 사용자가 관리자 권한을 가진다
권한을 받은 사용자가 모든 테이블에 접근할 수 있다
권한을 받은 사용자가 자동으로 커밋한다

정답: ①

해설: WITH GRANT OPTION은 권한을 받은 사용자가 다른 사용자에게 해당 권한을 재부여할 수 있는 옵션이다.


50번. 다음 쿼리의 결과로 올바른 것은?

SELECT name, salary
FROM employees
WHERE salary BETWEEN 3000 AND 5000;
선택지 내용
3000 초과 5000 미만인 사원
3000 이상 5000 이하인 사원
3000 미만 5000 초과인 사원
3000 또는 5000인 사원만

정답: ②

해설: BETWEEN A AND B는 A 이상 B 이하 (양쪽 끝 포함)이다. BETWEEN 3000 AND 5000은 3000 <= salary <= 5000을 의미한다.


제2회 정답표

번호 정답 번호 정답 번호 정답 번호 정답 번호 정답
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


제3회 모의고사


1과목. 데이터 모델링의 이해 (1~10번)


1번. 개념 모델에서 정의하지 않는 것은?

선택지 내용
엔티티
관계
속성의 데이터 타입
엔티티의 업무적 의미

정답: ③

해설: 개념 모델은 업무 관점의 큰 그림으로, 엔티티와 관계의 개요를 파악한다. 속성의 데이터 타입은 물리 모델에서 정의된다.


2번. 다음 중 복합 속성(Composite Attribute)의 예는?

선택지 내용
사원의 이름
사원의 주소 (시/도, 시/군/구, 동, 상세주소)
사원의 보유 기술 (Java, Python, SQL)
사원의 근속년수 (입사일로부터 파생)

정답: ②

해설: 복합 속성은 여러 하위 속성으로 분해 가능한 속성이다. 주소는 시/도, 시/군/구, 동, 상세주소로 분해 가능하다. ③은 다중 값 속성, ④는 파생 속성이다.


3번. 다음 테이블의 정규형 단계를 판별하시오.

사원번호 부서번호 부서명 부서위치
E01 D01 영업부 서울
E02 D01 영업부 서울
E03 D02 개발부 판교

PK: 사원번호 (단일키)

선택지 내용
1NF
2NF
3NF
BCNF

정답: ②

해설: PK가 단일키(사원번호)이므로 부분 함수 종속은 없다 → 2NF 충족. 그러나 사원번호 → 부서번호 → 부서명, 부서위치라는 이행 함수 종속이 존재하므로 3NF는 미달. 충족하는 가장 높은 정규형은 2NF이다.


4번. 다음 중 도메인 무결성의 예로 가장 적절한 것은?

선택지 내용
PK에 중복 값을 입력할 수 없다
FK는 참조하는 테이블의 PK 값이거나 NULL이어야 한다
나이 컬럼에는 0 이상 200 이하의 정수만 입력 가능하다
모든 사원은 반드시 하나의 부서에 소속되어야 한다

정답: ③

해설: 도메인 무결성은 속성 값이 정의된 도메인(값의 범위, 타입 등) 내에 있어야 한다는 규칙이다. CHECK(age BETWEEN 0 AND 200) 같은 제약조건으로 구현한다. ①은 개체 무결성, ②는 참조 무결성, ④는 업무 규칙(사용자 정의 무결성)이다.


5번. 다음 관계에서 비식별 관계(Non-identifying Relationship)인 것은?

선택지 내용
주문(주문번호PK) — 주문상세(주문번호PK + 상품번호PK)
부서(부서번호PK) — 사원(사원번호PK, 부서번호FK)
사원(사원번호PK) — 사원급여이력(사원번호PK + 변경일PK)
①과 ③

정답: ②

해설: 비식별 관계는 부모의 PK가 자식의 PK가 아닌 FK로만 사용되는 관계이다. ②에서 부서번호는 사원의 PK가 아니라 FK만 되므로 비식별 관계이다. ①③은 부모의 PK가 자식의 PK에 포함되므로 식별 관계이다.


6번. 반정규화의 단점으로 가장 적절한 것은?

선택지 내용
조회 성능이 저하된다
데이터 중복으로 인한 갱신 이상이 발생할 수 있다
JOIN 연산이 증가한다
저장 공간이 절약된다

정답: ②

해설: 반정규화는 의도적 중복을 허용하므로, 중복된 데이터 중 일부만 수정 시 불일치가 발생할 수 있다(갱신 이상). ①은 오히려 조회 성능이 향상되고, ③은 JOIN이 감소하며, ④는 저장 공간이 증가한다.


7번. 다음 시나리오에서 위반되는 무결성은?

"사원 테이블에 부서번호 FK로 'D99'를 입력하려 했으나, 부서 테이블에 D99가 존재하지 않는다."

선택지 내용
개체 무결성
참조 무결성
도메인 무결성
사용자 정의 무결성

정답: ②

해설: FK가 참조하는 테이블의 PK에 존재하지 않는 값을 입력하려 했으므로, 참조 무결성이 위반된다.


8번. 1:1 관계를 구현할 때, 외래키를 어디에 두는 것이 일반적으로 더 효율적인가?

선택지 내용
선택 참여(Partial Participation)인 쪽
필수 참여(Total Participation)인 쪽
어느 쪽이든 동일하다
별도의 관계 테이블을 생성해야 한다

정답: ②

해설: 1:1 관계에서는 필수 참여인 쪽에 외래키를 두면, NULL 값 없이 항상 유효한 참조가 보장된다. 선택 참여인 쪽에 두면 NULL이 발생할 수 있다.


9번. 다음 중 ER 다이어그램의 이중선(Double Line)이 의미하는 것은?

선택지 내용
선택 참여 (Partial Participation)
필수 참여 (Total Participation)
식별 관계
M:N 관계

정답: ②

해설: ER 다이어그램에서 이중선은 필수 참여(Total Participation)를 의미한다. 모든 인스턴스가 반드시 관계에 참여해야 한다는 뜻이다. 단일선은 선택 참여(Partial Participation)이다.


10번. 정규화의 목적으로 가장 적절한 것은?

선택지 내용
조회 성능 향상
이상 현상(Anomaly) 제거와 데이터 무결성 확보
저장 공간 확보
JOIN 연산 최소화

정답: ②

해설: 정규화의 궁극적 목적은 삽입 이상, 삭제 이상, 갱신 이상을 제거하여 데이터의 무결성을 확보하는 것이다.


2과목. SQL 기본 및 활용 (11~50번)


11번. 다음 중 DDL의 특징으로 올바른 것은?

선택지 내용
ROLLBACK으로 복구할 수 있다
자동 커밋되므로 ROLLBACK으로 복구할 수 없다
COMMIT을 명시적으로 실행해야 반영된다
트랜잭션의 대상이 아니다

정답: ②

해설: DDL은 실행 즉시 자동 커밋되므로, ROLLBACK으로 복구할 수 없다. DML은 수동 커밋(COMMIT 전까지 ROLLBACK 가능)인 것과 대비된다.


12번. 다음 쿼리의 결과로 올바른 것은?

SELECT name, salary
FROM employees
WHERE name LIKE '김%';
선택지 내용
이름이 "김"인 사원
이름에 "김"이 포함된 사원
이름이 "김"으로 시작하는 사원
이름이 "김"으로 끝나는 사원

정답: ③

해설: '김%'은 "김"으로 시작하는 모든 문자열을 의미한다. %는 0개 이상의 임의 문자이다.


13번. 다음 테이블에서 SELECT COUNT(DISTINCT dept_id) FROM emp의 결과는?

emp_id dept_id
1 10
2 20
3 10
4 NULL
5 20
선택지 내용
2
3
4
5

정답: ①

해설: COUNT(DISTINCT dept_id)는 dept_id의 고유한 NOT NULL 값의 수를 센다. NULL을 제외한 고유 값은 {10, 20} = 2이다.


14번. 다음 쿼리의 결과 행 수는?

SELECT *
FROM A RIGHT JOIN B ON A.id = B.id;

A: (1, 2, 3), B: (2, 3, 4)

선택지 내용
2행
3행
4행
6행

정답: ②

해설: RIGHT JOIN은 오른쪽 테이블(B)의 모든 행을 포함한다. B의 행: 2, 3, 4. 매칭: 2→A(2), 3→A(3). 미매칭: 4→A(NULL). 총 3행.


15번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name, salary
FROM employees
WHERE salary BETWEEN 3000 AND 5000
ORDER BY salary DESC;
name salary
A 2000
B 3000
C 4000
D 5000
E 6000
선택지 내용
D, C, B 순서로 3행
E, D, C, B, A 순서로 5행
B, C, D 순서로 3행
D, C만 2행

정답: ①

해설: BETWEEN 3000 AND 5000은 3000 이상 5000 이하. B(3000), C(4000), D(5000)가 대상. ORDER BY salary DESC이므로 D(5000), C(4000), B(3000) 순서.


16번. 다음 쿼리의 의미로 가장 적절한 것은?

SELECT d.dept_name, COUNT(e.emp_id) AS cnt
FROM departments d
LEFT JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.dept_name;
선택지 내용
사원이 있는 부서의 이름과 사원 수
모든 부서의 이름과 사원 수 (사원이 없는 부서는 0)
사원이 2명 이상인 부서의 이름과 사원 수
전체 사원 수

정답: ②

해설: LEFT JOIN으로 departments의 모든 행을 포함하므로, 사원이 없는 부서도 결과에 포함된다. COUNT(e.emp_id)는 NULL을 제외하고 세므로, 사원이 없는 부서는 0이 된다.


17번. 다음 중 서브쿼리에 대한 설명으로 옳지 않은 것은?

선택지 내용
SELECT절에서 스칼라 서브쿼리로 사용할 수 있다
FROM절에서 인라인 뷰로 사용할 수 있다
WHERE절에서 조건으로 사용할 수 있다
GROUP BY절에서 그룹 조건으로 사용할 수 있다

정답: ④

해설: 서브쿼리는 SELECT, FROM, WHERE, HAVING 절에서 사용할 수 있지만, GROUP BY절에서는 직접 사용하지 못한다. 그룹 조건은 HAVING절에서 서브쿼리와 함께 사용한다.


18번. 다음 테이블에서 SELECT MAX(salary), MIN(salary) FROM emp GROUP BY dept_id의 결과는?

emp_id dept_id salary
1 10 3000
2 10 5000
3 20 4000
4 20 NULL
선택지 내용
부서10: MAX=5000, MIN=3000 / 부서20: MAX=NULL, MIN=NULL
부서10: MAX=5000, MIN=3000 / 부서20: MAX=4000, MIN=4000
부서10: MAX=5000, MIN=3000 / 부서20: MAX=4000, MIN=0
부서10: MAX=4000, MIN=3000 / 부서20: MAX=5000, MIN=4000

정답: ②

해설: MAX/MIN은 NULL을 무시한다. 부서10: MAX(3000,5000)=5000, MIN(3000,5000)=3000. 부서20: MAX(4000)=4000, MIN(4000)=4000 (NULL은 무시).


19번. 다음 쿼리에서 결과 행 수는?

SELECT *
FROM A LEFT JOIN B ON A.id = B.id
WHERE B.id IS NULL;

A: (1, 2, 3), B: (1, 2)

선택지 내용
0행
1행
2행
3행

정답: ②

해설: LEFT JOIN 결과: (1,1), (2,2), (3,NULL). WHERE B.id IS NULL은 B쪽이 NULL인 행만 남기므로 (3,NULL) = 1행. 이 패턴은 "A에는 있지만 B에는 없는 데이터를 찾을 때" 자주 사용된다.


20번. 다음 중 NULL에 대한 설명으로 올바른 것은?

선택지 내용
NULL = NULL의 결과는 TRUE이다
NULL + 100의 결과는 100이다
NULL은 "값이 없다"를 나타내며, 0이나 빈 문자열과는 다르다
COUNT(*)는 NULL 행을 제외한다

정답: ③

해설: NULL은 값의 부재를 나타내는 특수한 상태이다. 0이나 ''(빈 문자열)과는 다르다. NULL=NULL은 NULL(UNKNOWN), NULL+100은 NULL, COUNT(*)는 NULL을 포함한다.


21번. 다음 쿼리의 결과로 올바른 것은?

SELECT name, score,
       ROW_NUMBER() OVER (ORDER BY score DESC) AS rn
FROM students;
name score
A 90
B 90
C 85
선택지 내용
A:1, B:1, C:3
A:1, B:1, C:2
A:1, B:2, C:3
A:1, B:2, C:2

정답: ③

해설: ROW_NUMBER()는 동순위에도 고유한 번호를 부여한다. A:1, B:2, C:3. RANK였다면 A:1, B:1, C:3, DENSE_RANK였다면 A:1, B:1, C:2.


22번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name, dept_id, salary,
       SUM(salary) OVER () AS total
FROM employees;
name dept_id salary
A 10 3000
B 10 4000
C 20 5000
선택지 내용
A:3000, B:4000, C:5000
A:7000, B:7000, C:5000
A:12000, B:12000, C:12000
A:3000, B:7000, C:12000

정답: ③

해설: SUM() OVER()는 PARTITION BY 없이 전체 테이블에 대한 합계를 모든 행에 반환한다. 3000+4000+5000=12000이 모든 행의 total이 된다.


23번. 다음 계층형 쿼리에서 employee_id=4의 LEVEL은?

SELECT employee_id, LEVEL
FROM employees
START WITH employee_id = 1
CONNECT BY PRIOR employee_id = manager_id;
employee_id manager_id
1 NULL
2 1
3 1
4 3
선택지 내용
1
2
3
4

정답: ③

해설: 1(LEVEL=1) → 2(LEVEL=2), 3(LEVEL=2) → 4(LEVEL=3, 부모가 3이므로). employee_id=4의 LEVEL은 3이다.


24번. 다음 CUBE 쿼리에서 생성되는 그룹 조합의 수는?

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" 에러가 발생한다.


35번. 다음 쿼리에서 결과 행 수는?

SELECT *
FROM A INNER JOIN B ON A.id = B.id;

A: (1, 2, 3, 4), B: (3, 4, 5, 6)

선택지 내용
2행
4행
6행
8행

정답: ①

해설: INNER JOIN은 양쪽 모두 매칭되는 행만. 공통 id: 3, 4 = 2행.


36번. 다음 중 트랜잭션 격리 수준을 높은 것부터 올바르게 나열한 것은?

선택지 내용
READ UNCOMMITTED → READ COMMITTED → REPEATABLE READ → SERIALIZABLE
SERIALIZABLE → READ COMMITTED → REPEATABLE READ → READ UNCOMMITTED
READ COMMITTED → READ UNCOMMITTED → SERIALIZABLE → REPEATABLE READ
SERIALIZABLE → REPEATABLE READ → READ COMMITTED → READ UNCOMMITTED

정답: ④

해설: 격리 수준은 SERIALIZABLE(가장 높음) → REPEATABLE READ → READ COMMITTED → READ UNCOMMITTED(가장 낮음) 순이다.


37번. 다음 쿼리에서 결과로 올바른 것은?

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행

정답: ①

해설: <> ALLNOT 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번 그룹.


47번. 다음 중 ROLLUP(a, b)에서 (a, NULL) 행의 의미는?

선택지 내용
a와 b의 상세 데이터
a별 소계
b별 소계
총계

정답: ②

해설: ROLLUP(a, b)에서 (a, NULL)은 b를 무시한 a별 소계이다. (NULL, NULL)은 총계, (a, b)는 상세 데이터이다.


48번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name, salary
FROM employees
WHERE EXISTS (SELECT 1 FROM dual WHERE 1 = 0);
선택지 내용
모든 사원
결과 0행
첫 번째 사원만
에러

정답: ②

해설: EXISTS는 서브쿼리가 하나 이상의 행을 반환하면 TRUE이다. WHERE 1=0은 항상 FALSE이므로 서브쿼리가 0행을 반환 → EXISTS가 FALSE → 메인쿼리의 WHERE 조건이 FALSE → 결과 0행.


49번. 다음 중 복합 인덱스 (col_a, col_b)에서 인덱스를 활용할 수 없는 WHERE절은?

선택지 내용
WHERE col_a = 1
WHERE col_a = 1 AND col_b = 2
WHERE col_b = 2
①과 ② 모두 활용 가능

정답: ③

해설: 복합 인덱스 (col_a, col_b)에서 선행 컬럼(col_a)이 WHERE절에 포함되어야 인덱스를 효율적으로 사용할 수 있다. col_b만으로는 인덱스 스캔이 어렵다(일부 DBMS에서는 인덱스 스킵 스캔 지원).


50번. 다음 중 READ UNCOMMITTED 격리 수준에서 발생 가능한 현상은?

선택지 내용
Dirty Read만
Dirty Read와 Non-Repeatable Read만
Dirty Read, Non-Repeatable Read, Phantom Read 모두
어떤 현상도 발생하지 않음

정답: ③

해설: READ UNCOMMITTED는 가장 낮은 격리 수준으로, Dirty Read, Non-Repeatable Read, Phantom Read가 모두 발생할 수 있다.


제3회 정답표

번호 정답 번호 정답 번호 정답 번호 정답 번호 정답
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


제4회 모의고사


1과목. 데이터 모델링의 이해 (1~10번)


1번. 물리 모델에서 정의하는 것은?

선택지 내용
엔티티의 업무적 의미
엔티티와 관계의 개요
인덱스, 파티션, 테이블스페이스
속성의 업무 규칙

정답: ③

해설: 물리 모델은 특정 DBMS에 맞는 구현 설계로, 인덱스, 파티션, 저장 구조(테이블스페이스), 데이터 타입 등을 정의한다.


2번. 다음 중 본질식별자(Natural Identifier)의 예는?

선택지 내용
AUTO_INCREMENT로 생성된 주문번호
UUID로 생성된 사용자 ID
업무 규칙에 의해 부여된 사원번호 (EMP-2026-001)
시스템이 자동 생성한 일련번호

정답: ③

해설: 본질식별자는 업무에서 자연스럽게 존재하며 업무적 의미를 가지는 식별자이다. ①②④는 모두 인위적으로 생성된 인조식별자이다.


3번. 다음 테이블의 정규형 단계를 판별하시오.

학번 과목번호 성적
1001 CS01 90
1001 CS02 85
1002 CS01 92

PK: (학번, 과목번호)

선택지 내용
1NF
2NF
3NF
BCNF

정답: ③

해설: PK가 복합키(학번, 과목번호)이고, 성적은 복합키 전체에만 종속(완전 함수 종속) → 부분 함수 종속 없음 → 2NF 충족. 비키 속성(성적) 간의 이행 종속도 없음 → 3NF 충족. 이 테이블은 이미 3NF이다.


4번. 다음 중 삽입 이상(Insertion Anomaly)의 예는?

선택지 내용
학생 정보 없이 학과 정보만 입력할 수 없는 경우
학생을 삭제하면 학과 정보도 사라지는 경우
학과 사무실 번호가 여러 행에 중복되어 일부만 수정되는 경우
학생의 이름을 변경하면 모든 행을 수정해야 하는 경우

정답: ①

해설: 삽입 이상은 불필요한 데이터까지 함께 입력해야 하는 상황이다. 학과 정보만 입력하려 해도, 학생 정보(학번 등)가 없으면 행을 만들 수 없는 것이 삽입 이상이다. ②는 삭제 이상, ③④는 갱신 이상이다.


5번. M:N 관계를 관계 테이블로 분해할 때, 관계 테이블에 포함되는 것은?

선택지 내용
두 엔티티의 PK만
두 엔티티의 PK + 관계에 속성
두 엔티티의 모든 속성
① 또는 ② (관계에 속성이 있느냐에 따라)

정답: ④

해설: M:N 관계 테이블에는 두 엔티티의 PK를 FK로 포함하고, 관계 자체에 속성이 있으면(예: 수강 관계의 "성적") 그것도 포함한다. 속성이 없으면 PK만, 있으면 PK+속성이다.


6번. 다음 중 참조 무결성을 위반하지 않는 것은?

선택지 내용
사원의 부서번호 FK에 부서 테이블에 없는 'D99' 입력
사원의 부서번호 FK에 NULL 입력
부서 테이블의 부서번호 PK에 NULL 입력
사원의 사원번호 PK에 중복 값 입력

정답: ②

해설: 참조 무결성은 FK가 참조하는 PK에 존재하는 값이거나 NULL이면 충족된다. ①은 참조 무결성 위반, ③은 개체 무결성 위반(PK에 NULL), ④는 개체 무결성 위반(PK 중복).


7번. 다음 중 관계의 카디널리티(Cardinality)를 결정하는 것은?

선택지 내용
엔티티의 속성 수
엔티티 간의 관계 비율 (1:1, 1:N, M:N)
테이블의 행 수
인덱스의 수

정답: ②

해설: 카디널리티는 엔티티 간의 관계 비율을 나타내며, 1:1, 1:N, M:N으로 분류된다.


8번. 정규화에서 이행 함수 종속의 예로 올바른 것은?

선택지 내용
학번 → 이름
(학번, 과목번호) → 성적
학번 → 학과명 → 학과사무실
학번 → 학번

정답: ③

해설: 이행 함수 종속은 X → Z → Y 형태로, X가 Z를 통해 간접적으로 Y를 결정하는 것이다. 학번 → 학과명 → 학과사무실에서, 학과사무실은 학번을 통해 간접적으로 결정된다.


9번. ON DELETE RESTRICT의 동작으로 올바른 것은?

선택지 내용
부모 행 삭제 시 자식 행도 함께 삭제
부모 행 삭제 시 자식 행의 FK를 NULL로 변경
자식 행이 존재하면 부모 행 삭제를 거부
자식 행의 FK를 기본값으로 변경

정답: ③

해설: ON DELETE RESTRICT는 참조하는 자식 행이 있으면 부모 행의 삭제를 거부한다. FK의 기본 동작이다.


10번. 다음 중 ER 다이어그램의 타원(○) 기호가 나타내는 것은?

선택지 내용
엔티티
속성
관계
식별자

정답: ②

해설: ER 다이어그램에서 사각형=엔티티, 타원(원)=속성, 마름모=관계. 주식별자는 속성에 밑줄 표시.


2과목. SQL 기본 및 활용 (11~50번)


11번. 다음 중 DML에 해당하는 것은?

선택지 내용
ALTER
DROP
MERGE
REVOKE

정답: ③

해설: MERGE는 INSERT와 UPDATE를 결합한 DML 명령어이다. ALTER, DROP은 DDL, REVOKE는 DCL이다.


12번. 다음 쿼리의 결과로 올바른 것은?

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의 결과는?

emp_id dept_id salary
1 10 3000
2 10 NULL
3 20 5000
선택지 내용
부서10: 1500, 부서20: 5000
부서10: 3000, 부서20: 5000
부서10: NULL, 부서20: 5000
부서10: 3000, 부서20: 2500

정답: ②

해설: AVG는 NULL을 제외하고 계산. 부서10: AVG(3000) = 3000 (NULL은 제외, 1건만). 부서20: AVG(5000) = 5000.


16번. 다음 쿼리에서 결과 행 수는?

SELECT *
FROM A CROSS JOIN B;

A: 2행, B: 5행

선택지 내용
5행
7행
10행
2행

정답: ③

해설: CROSS JOIN = 2 × 5 = 10행.


17번. 다음 쿼리의 의미로 가장 적절한 것은?

SELECT name FROM employees
WHERE dept_id IN (SELECT dept_id FROM departments WHERE location = '서울')
AND salary > (SELECT AVG(salary) FROM employees);
선택지 내용
서울 부서의 평균 급여보다 높은 사원
서울 부서에 소속된 사원 중 전체 평균 급여보다 높은 사원
전체 평균 급여보다 높은 사원 중 서울 부서 소속
②와 ③은 동일한 의미

정답: ④

해설: AND 조건이므로 두 조건을 모두 만족하는 사원. "서울 부서 소속이면서 전체 평균 급여보다 높은 사원"과 "전체 평균 급여보다 높은 서울 부서 사원"은 동일한 의미이다.


18번. 다음 결과에서 B MINUS A의 결과는?

A = {1, 2, 3}, B = {2, 3, 4, 5}

선택지 내용
{1}
{4, 5}
{2, 3}
{1, 4, 5}

정답: ②

해설: B MINUS A는 B에서 A에 포함된 원소를 뺀 것. B={2,3,4,5}에서 A에 포함된 {2,3}을 제거하면 {4, 5}.


19번. 다음 중 NULL과의 연산 결과로 올바른 것은?

선택지 내용
NULL AND TRUE = TRUE
NULL OR TRUE = TRUE
NULL AND FALSE = NULL
NULL OR FALSE = FALSE

정답: ②

해설: NULL OR TRUE = TRUE (TRUE와의 OR은 항상 TRUE). ①은 NULL AND TRUE = NULL. ③은 NULL AND FALSE = FALSE. ④은 NULL OR FALSE = NULL.


20번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name, salary
FROM employees
WHERE salary BETWEEN 3000 AND 5000
AND dept_id IN (10, 20);
선택지 내용
급여가 3000~5000이거나 부서가 10 또는 20인 사원
급여가 3000~5000이고 부서가 10 또는 20인 사원
급여가 3000~5000인 사원 중 부서가 10 또는 20이 아닌 사원
부서가 10 또는 20인 사원 중 급여가 3000~5000이 아닌 사원

정답: ②

해설: AND로 연결되었으므로 두 조건을 모두 만족하는 행만 반환. 급여 3000~5000 이고 부서 10 또는 20인 사원.


21번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name, score,
       RANK() OVER (ORDER BY score DESC) AS r,
       DENSE_RANK() OVER (ORDER BY score DESC) AS dr
FROM students;
name score
A 100
B 90
C 90
D 80
E 70

D의 r과 dr은?

선택지 내용
r=4, dr=3
r=3, dr=3
r=4, dr=4
r=3, dr=4

정답: ①

해설: RANK: A=1, B=2, C=2, D=4(3 건너뜀), E=5. DENSE_RANK: A=1, B=2, C=2, D=3, E=4.


22번. 다음 쿼리에서 결과로 올바른 것은?

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;
name dept_id salary
A 10 3000
B 10 7000

A의 pct는?

선택지 내용
30
33.33
50
70

정답: ①

해설: dept_sum = 3000 + 7000 = 10000. pct = 3000 / 10000 × 100 = 30.


23번. 다음 계층형 쿼리에서 결과의 LEVEL 분포는?

SELECT employee_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 1
4 2
5 2
6 3
선택지 내용
LEVEL 1: 1개, LEVEL 2: 2개, LEVEL 3: 3개
LEVEL 1: 1개, LEVEL 2: 2개, LEVEL 3: 3개
LEVEL 1: 1개, LEVEL 2: 2개, LEVEL 3: 3개
LEVEL 0: 1개, LEVEL 1: 2개, LEVEL 2: 3개

정답: ②

해설: 1(LEVEL=1), 2(LEVEL=2), 3(LEVEL=2), 4(LEVEL=3), 5(LEVEL=3), 6(LEVEL=3). LEVEL 1: 1개, LEVEL 2: 2개, LEVEL 3: 3개.


24번. 다음 ROLLUP 쿼리에서 총계 행의 모든 컬럼 값은?

SELECT a, b, SUM(c)
FROM t
GROUP BY ROLLUP(a, b);
선택지 내용
a='TOTAL', b='TOTAL'
a=NULL, b=NULL
a=0, b=0
a=MAX(a), b=MAX(b)

정답: ②

해설: ROLLUP의 총계 행에서는 모든 그룹 컬럼이 NULL로 표시된다.


25번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name, salary,
       CASE salary
           WHEN 3000 THEN '초급'
           WHEN 5000 THEN '중급'
           WHEN 7000 THEN '고급'
           ELSE '미분류'
       END AS level
FROM employees;

salary=4000인 사원의 level은?

선택지 내용
초급
중급
고급
미분류

정답: ④

해설: 단순 CASE는 CASE salary WHEN 값 THEN 결과 형태로, salary=4000은 3000, 5000, 7000 중 어느 것과도 일치하지 않으므로 ELSE의 '미분류'가 반환된다.


26번. 다음 중 인덱스를 설정하기에 부적절한 경우는?

선택지 내용
WHERE절에 자주 사용되는 컬럼
INSERT/UPDATE가 매우 빈번한 테이블의 모든 컬럼
JOIN 조건에 사용되는 컬럼
높은 고유성(카디널리티)을 가진 컬럼

정답: ②

해설: INSERT/UPDATE가 빈频繁한 테이블의 모든 컬럼에 인덱스를 설정하면, DML 시 모든 인덱스를 갱신해야 하므로 성능이 크게 저하된다.


27번. 다음 쿼리에서 결과 행 수는?

SELECT *
FROM A UNION B;

A = {1, 2, 3}, B = {2, 3, 4}

선택지 내용
4행
5행
6행
7행

정답: ①

해설: UNION은 중복을 제거. {1, 2, 3, 4} = 4행. UNION ALL이었다면 6행.


28번. 다음 쿼리에서 결과로 올바른 것은?

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);

부서 10 급여: {2000, 3000}, 부서 20 급여: {5000, 6000}일 때:

선택지 내용
급여가 2000 초과 5000 미만인 사원
급여가 3000 초과 5000 미만인 사원
급여가 2000 초과 6000 미만인 사원
급여가 3000 초과 6000 미만인 사원

정답: ①

해설: > ANY(2000, 3000) = > MIN(2000) = > 2000. < ALL(5000, 6000) = < MIN(5000) = < 5000. 따라서 급여가 2000 초과 5000 미만인 사원.


29번. 다음 테이블에서 SELECT COUNT(*), COUNT(salary), SUM(salary) FROM emp의 결과는?

emp_id salary
1 3000
2 NULL
3 5000
4 NULL
선택지 내용
COUNT(*)=4, COUNT(salary)=4, SUM(salary)=8000
COUNT(*)=4, COUNT(salary)=2, SUM(salary)=8000
COUNT(*)=2, COUNT(salary)=2, SUM(salary)=8000
COUNT(*)=4, COUNT(salary)=2, SUM(salary)=NULL

정답: ②

해설: COUNT(*)=4(전체), COUNT(salary)=2(NULL 제외), SUM(salary)=3000+5000=8000(NULL 무시).


30번. 다음 중 COMMIT에 대한 설명으로 올바른 것은?

선택지 내용
트랜잭션의 변경 사항을 취소한다
트랜잭션의 변경 사항을 영구적으로 반영한다
트랜잭션을 일시 중지한다
데이터베이스를 백업한다

정답: ②

해설: 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;

A: (1, 2, 3), B: (1, 2)

선택지 내용
2행
3행
5행
6행

정답: ②

해설: INNER JOIN: (1,1), (2,2) = 2행. LEFT JOIN: (1,1), (2,2), (3,NULL) = 3행. UNION (중복 제거): (1,1), (2,2), (3,NULL) = 3행.


33번. 다음 중 뷰를 통해 INSERT가 가능한 경우는?

선택지 내용
DISTINCT를 포함한 뷰
GROUP BY를 포함한 뷰
하나의 테이블을 기반으로 한 단순 뷰 (그룹 함수 없음)
JOIN을 포함한 복합 뷰

정답: ③

해설: 단순 뷰(하나의 테이블, 그룹 함수 없음, 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);

부서 10: {3000, 5000}, 부서 20: {2000, 4000}일 때:

선택지 내용
급여 > 5000 또는 급여 < 2000인 사원
급여 > 5000 또는 급여 < 4000인 사원
급여 > 3000 또는 급여 < 2000인 사원
모든 사원

정답: ①

해설: > ALL(3000, 5000) = > 5000. < ANY(2000, 4000) = < 4000? → 아니, < ANY< MAX이므로 < 4000. 하지만 이건 < 2000이 아니라 < 4000이다.

정답 수정: ②

해설: > ALL(3000, 5000) = > MAX(3000, 5000) = > 5000. < ANY(2000, 4000) = < MAX(2000, 4000) = < 4000. OR이므로 급여 > 5000 또는 급여 < 4000인 사원.


49번. 다음 중 PRIMARY KEY 제약조건의 특징으로 올바른 것은?

선택지 내용
NULL 값을 허용한다
중복 값을 허용한다
하나의 테이블에 여러 개 설정할 수 있다
NOT NULL + UNIQUE의 기능을 포함한다

정답: ④

해설: PRIMARY KEY는 NOT NULL + UNIQUE를 모두 만족하며, 하나의 테이블에 하나만 설정할 수 있다. 자동으로 고유 인덱스가 생성된다.


50번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name, salary
FROM employees
WHERE UPPER(name) LIKE 'KIM%';
name salary
kim 3000
KIM 4000
Kim 5000
Park 6000
선택지 내용
KIM만
kim, KIM만
kim, KIM, Kim 모두
모든 사원

정답: ③

해설: UPPER(name)은 name을 대문자로 변환. kim→KIM, KIM→KIM, Kim→KIM, Park→PARK. LIKE 'KIM%'에 매칭되는 것은 KIM으로 시작하는 것: kim, KIM, Kim = 3행.


제4회 정답표

번호 정답 번호 정답 번호 정답 번호 정답 번호 정답
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


제5회 모의고사


1과목. 데이터 모델링의 이해 (1~10번)


1번. 데이터 모델링의 3단계를 순서대로 올바르게 나열한 것은?

선택지 내용
물리 모델 → 논리 모델 → 개념 모델
논리 모델 → 개념 모델 → 물리 모델
개념 모델 → 논리 모델 → 물리 모델
개념 모델 → 물리 모델 → 논리 모델

정답: ③

해설: 데이터 모델링은 업무의 큰 그림(개념) → 상세 설계(논리) → 구현 설계(물리) 순서로 진행된다.


2번. 다음 중 엔티티가 아닌 것은?

선택지 내용
학생 (여러 명 존재)
교과서 (여러 권 존재)
대한민국 (하나만 존재)
주문 (여러 건 존재)

정답: ③

해설: 엔티티는 다수의 인스턴스가 존재해야 한다. "대한민국"은 하나뿐이므로 엔티티로 적합하지 않다. (단, "나라"라는 엔티티의 인스턴스로는 가능)


3번. 다음 테이블을 2NF로 정규화한 결과로 올바른 것은?

원본: (학번, 과목번호, 학생이름, 과목명, 성적)

PK: (학번, 과목번호)

함수 종속: 학번→학생이름, 과목번호→과목명, (학번, 과목번호)→성적

선택지 내용
학생(학번, 학생이름), 수강(학번, 과목번호, 과목명, 성적)
학생(학번, 학생이름), 과목(과목번호, 과목명), 수강(학번, 과목번호, 성적)
수강(학번, 과목번호, 학생이름, 과목명, 성적) — 그대로
학생(학번, 학생이름, 과목명), 수강(학번, 과목번호, 성적)

정답: ②

해설: 2NF는 부분 함수 종속을 제거해야 한다. 학생이름은 학번에만, 과목명은 과목번호에만 종속되므로 각각 분리한다. ②가 완전한 2NF 분해이다. (실제로는 ②가 이미 3NF이기도 하다)


4번. 다음 시나리오에서 발생하는 이상 현상의 유형은?

"학생 테이블에서 학생을 삭제하면, 해당 학생의 학과 정보(학과명, 학과사무실)도 함께 사라진다."

선택지 내용
삽입 이상
삭제 이상
갱신 이상
조회 이상

정답: ②

해설: 삭제 이상은 원하지 않는 데이터까지 함께 삭제되는 현상이다. 학생을 삭제했는데 학과 정보까지 사라지는 것이 삭제 이상이다.


5번. 다음 중 필수 참여(Total Participation)의 예는?

선택지 내용
부서에 아직 소속되지 않은 사원이 있을 수 있다
모든 사원은 반드시 하나의 부서에 소속되어야 한다
일부 부서에는 사원이 없을 수 있다
사원은 여러 부서에 소속될 수 있다

정답: ②

해설: "반드시"라는 표현이 필수 참여를 의미한다. 모든 사원이 반드시 관계(부서 소속)에 참여해야 하므로 필수 참여이다.


6번. 다음 중 3NF를 충족하지 않는 테이블은?

선택지 내용
사원(사원번호PK, 이름, 부서번호FK)
주문(주문번호PK, 고객IDFK, 상품번호FK, 수량)
학생(학번PK, 학과코드, 학과사무실) — 학번→학과코드→학과사무실
상품(상품번호PK, 상품명, 단가)

정답: ③

해설: ③에서 학번→학과코드→학과사무실은 이행 함수 종속이므로 3NF 미달. 학과사무실을 별도 테이블로 분리해야 3NF를 충족한다.


7번. 다음 중 관계의 차수(Degree)가 3인 관계의 예는?

선택지 내용
사원 — 부서 (2개 엔티티)
학생 — 과목 — 교수 (3개 엔티티)
고객 — 주문 (2개 엔티티)
상품 — 카테고리 (2개 엔티티)

정답: ②

해설: 관계의 차수는 참여하는 엔티티의 수이다. 학생—과목—교수는 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';

A: (1,active), (2,inactive), (3,active). B: (1,X), (2,Y), (3,Z)

선택지 내용
1행
2행
3행
0행

정답: ②

해설: INNER JOIN: (1,1), (2,2), (3,3) = 3행. WHERE A.status='active': (1,active)와 (3,active)만 남음 = 2행.


18번. 다음 중 집합 연산의 결과로 올바른 것은?

A = {1, 2, 3}, B = {2, 3, 4}

A UNION B = ?
A UNION ALL B = ?
A INTERSECT B = ?
A MINUS B = ?

선택지 내용
{1,2,3,4}, {1,2,2,3,3,4}, {2,3}, {1}
{1,2,3,4}, {1,2,3,4}, {2,3}, {1}
{1,2,3,4}, {1,2,2,3,3,4}, {1}, {2,3}
{2,3}, {1,2,2,3,3,4}, {1,2,3,4}, {1}

정답: ①

해설: UNION: {1,2,3,4}(중복제거). UNION ALL: {1,2,2,3,3,4}(중복허용). INTERSECT: {2,3}(교집합). MINUS: {1}(차집합, A에서 B를 뺌).


19번. 다음 쿼리에서 결과로 올바른 것은?

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;
employee_id name manager_id
1 대표 NULL
2 부장 1
3 차장 1
4 대리 2
5 사원 4
선택지 내용
LEVEL=3, path=/대표/부장/사원
LEVEL=4, path=/대표/부장/대리/사원
LEVEL=5, path=/대표/부장/차장/대리/사원
LEVEL=4, path=/부장/대리/사원

정답: ②

해설: 대표(1, LEVEL=1) → 부장(2, LEVEL=2) → 대리(4, LEVEL=3) → 사원(5, LEVEL=4). path=/대표/부장/대리/사원.


24번. 다음 ROLLUP 쿼리에서 생성되는 그룹의 수는?

SELECT a, b, c, SUM(d)
FROM t
GROUP BY ROLLUP(a, b, c);
선택지 내용
3개
4개
7개
8개

정답: ②

해설: ROLLUP(a, b, c): (a,b,c) → (a,b) → (a) → () = 4개. CUBE(a,b,c)이면 8개.


25번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name,
       CASE
           WHEN salary IS NULL THEN '미정'
           WHEN salary >= 5000 THEN '고급'
           WHEN salary >= 3000 THEN '중급'
           ELSE '초급'
       END AS grade
FROM employees;
name salary
A NULL
B 6000
C 3000
D 2000
선택지 내용
A:미정, B:고급, C:중급, D:초급
A:초급, B:고급, C:중급, D:초급
A:NULL, B:고급, C:중급, D:초급
A:미정, B:고급, C:초급, D:초급

정답: ①

해설: A(salary=NULL): IS NULL → '미정'. B(6000): >= 5000 → '고급'. C(3000): >= 5000 FALSE, >= 3000 TRUE → '중급'. D(2000): 모두 FALSE → '초급'.


26번. 다음 중 인덱스에 대한 설명으로 올바른 것은?

선택지 내용
인덱스는 테이블의 데이터를 정렬하여 저장하는 것이다
인덱스는 키 값과 해당 행의 주소(ROWID)를 저장한다
인덱스를 생성하면 INSERT 성능이 향상된다
모든 테이블에 반드시 인덱스를 생성해야 한다

정답: ②

해설: 인덱스는 키 값과 해당 행의 물리적 위치(ROWID)를 저장하는 별도의 구조이다. ①은 인덱스 자체가 정렬되어 저장되지만, 테이블 데이터를 정렬하는 것은 아니다. ③은 INSERT 시 인덱스도 갱신해야 하므로 성능 저하.


27번. 다음 쿼리에서 결과 행 수는?

SELECT *
FROM A INTERSECT B;

A = {1, 2, 3, 4, 5}, B = {3, 4, 5, 6, 7}

선택지 내용
2행
3행
5행
7행

정답: ②

해설: INTERSECT(교집합): 공통 원소 {3, 4, 5} = 3행.


28번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name, salary
FROM employees
WHERE dept_id = ANY (SELECT dept_id FROM departments WHERE location = '서울');
선택지 내용
서울 부서의 사원 중 가장 높은 급여의 사원
서울에 위치한 부서에 소속된 사원
서울 외 부서의 사원
에러 (ANY는 >, < 등과 함께 사용해야 함)

정답: ②

해설: = ANYIN과 동일하다. 서울에 위치한 부서의 dept_id 목록 중 하나라도 일치하는 사원을 반환한다.


29번. 다음 테이블에서 SELECT COUNT(*), COUNT(DISTINCT dept_id), COUNT(DISTINCT salary) FROM emp의 결과는?

emp_id dept_id salary
1 10 3000
2 10 3000
3 20 NULL
4 20 5000
선택지 내용
4, 2, 2
4, 2, 3
4, 3, 2
3, 2, 2

정답: ①

해설: COUNT(*)=4. COUNT(DISTINCT dept_id)={10,20}=2. COUNT(DISTINCT salary)={3000,5000}=2 (NULL 제외).


30번. 다음 중 DDL과 DML의 차이로 올바른 것은?

선택지 내용
DDL은 테이블의 데이터를 조작하고, DML은 테이블의 구조를 정의한다
DDL은 자동 커밋되고, DML은 수동 커밋된다
DDL은 ROLLBACK이 가능하고, DML은 불가능하다
DDL과 DML 모두 트랜잭션의 대상이다

정답: ②

해설: 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;
name salary
A 5000
B 5000
C 3000

B의 r과 rn은?

선택지 내용
r=1, rn=1
r=1, rn=2
r=2, rn=2
r=2, rn=1

정답: ②

해설: RANK: A=1, B=1(동순위), C=3. ROW_NUMBER: A=1, B=2(고유), C=3.


47번. 다음 중 CUBE(a)의 결과 그룹 조합은?

선택지 내용
(a)만
(a), ()
(a), (NULL)
②와 ③은 동일

정답: ④

해설: CUBE(a)는 (a)와 () = (a, NULL) 두 그룹. GROUP BY a와 동일하지만 총계 행이 추가된다. ②와 ③은 동일한 의미이다.


48번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name, salary
FROM employees
WHERE NOT EXISTS (SELECT 1 FROM departments WHERE dept_id = employees.dept_id);
선택지 내용
부서가 존재하는 사원
부서가 존재하지 않는 사원 (departments에 없는 부서의 사원)
모든 사원
결과 0행

정답: ②

해설: NOT EXISTS는 서브쿼리가 0행을 반환하면 TRUE. departments에 해당 사원의 dept_id가 없으면 TRUE → departments에 없는 부서의 사원이 반환된다.


49번. 다음 중 PRIMARY KEY와 UNIQUE 제약조건의 차이로 올바른 것은?

선택지 내용
PRIMARY KEY는 NULL을 허용하고, UNIQUE는 NULL을 허용하지 않는다
PRIMARY KEY는 하나의 테이블에 여러 개 설정할 수 있고, UNIQUE는 하나만 가능하다
PRIMARY KEY는 NULL을 허용하지 않고, 하나의 테이블에 하나만 설정 가능하다
둘 다 동일한 기능을 한다

정답: ③

해설: PRIMARY KEY = NOT NULL + UNIQUE. 하나의 테이블에 하나만 가능. UNIQUE는 NULL 허용(일부 DBMS에서는 여러 NULL 허용), 여러 개 설정 가능.


50번. 다음 쿼리에서 결과로 올바른 것은?

SELECT name, salary
FROM employees
WHERE LOWER(name) = 'kim chulsoo';
name salary
KIM CHULSOO 3000
Kim Chulsoo 4000
kim chulsoo 5000
PARK 6000
선택지 내용
KIM CHULSOO만
KIM CHULSOO, Kim Chulsoo만
KIM CHULSOO, Kim Chulsoo, kim chulsoo 모두
모든 사원

정답: ③

해설: LOWER(name)은 모두 소문자로 변환. KIM CHULSOO→kim chulsoo, Kim Chulsoo→kim chulsoo, kim chulsoo→kim chulsoo. 세 명 모두 매칭. PARK→park은 미매칭.


제5회 정답표

번호 정답 번호 정답 번호 정답 번호 정답 번호 정답
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


회차별 출제 주제 커버리지 요약

주제 1회 2회 3회 4회 5회
데이터 모델링 개념 O O O O O
정규화 (1NF~3NF) O O O O O
식별자 유형 O O O O O
관계 유형 (1:1, 1:N, M:N) O O O O O
무결성 제약조건 O O O O O
반정규화 O O O O -
DDL/DML/DCL/TCL O O O O O
SELECT 실행 순서 O O O O O
NULL 처리 O O O O O
GROUP BY + HAVING O O O O O
JOIN (모든 유형) O O O O O
서브쿼리 (상관/비상관) O O O O O
집합 연산 O O O O O
윈도우 함수 O O O O O
계층형 질의 O O O O O
ROLLUP/CUBE O O O O O
CASE WHEN O O O O O
뷰/인덱스/시퀀스 O O O O O
트랜잭션/격리 수준 O O O O O
GRANT/REVOKE O O O O O

#SQLD모의고사 #SQLD기출문제 #SQLD문제은행 #SQLD시험대비 #SQLD합격 #주제5