Skip to Content
BlogSQLD 자격증Claude가 생성한 SQL 기본 및 활용 문제

Claude가 생성한 SQL 기본 및 활용 문제

문제 1

다음 중 데이터 정의어(DDL, Data Definition Language)에 대한 설명으로 가장 올바르지 않은 것은? ① CREATE 구문을 사용하여 새로운 테이블이나 뷰 등 데이터베이스 객체를 생성한다. ② ALTER 구문을 사용하면 이미 생성된 테이블의 컬럼 이름, 데이터 타입, 제약조건 등을 변경할 수 있다. ③ TRUNCATE 구문은 테이블의 모든 행을 삭제하며, DDL에 속하기 때문에 수행 후 자동으로 COMMIT되어 복구(ROLLBACK)할 수 없다. ④ DELETE 구문은 테이블의 구조 자체를 삭제하는 DDL 명령어이며, 조건절(WHERE)을 사용할 수 없다.

정답 및 해석

정답 ④

DELETE는 DML(데이터 조작어)에 속하는 명령어이다.
테이블의 구조를 삭제하는 것이 아니라 테이블 내의 ‘행’을 삭제할때 사용하며 where절을 사용할 수 있다.

RUNCATE는 DDL 명령어이기 때문에 실행 즉시 데이터베이스에 자동 커밋이 발생한다.
따라서 복구가 불가능 하다.

📌 핵심 포인트: DDL vs DML (삭제 관련)

  • DELETE
    • DML (데이터 조작어)
    • 특정 행 또는 전체 행 삭제
    • ROLLBACK 가능
  • TRUNCATE
    • DDL (데이터 정의어)
    • 테이블 전체 초기화(전체행 삭제)
    • ROLLBACK 불가능
  • DROP
    • DDL (데이터 정의어)
    • 테이블 객체 구조 삭제
    • ROLLBACK 불가능


문제 2

다음 중 DCL(Data Control Language) 및 TCL(Transaction Control Language)에 대한 설명으로 가장 올바르지 않은 것은? ① GRANT 명령어는 사용자에게 특정 데이터베이스 객체에 대한 권한을 부여할 때 사용한다. ② REVOKE 명령어는 사용자에게 이미 부여된 권한을 회수할 때 사용한다. ③ COMMIT을 수행하면 트랜잭션에 의해 변경된 내용이 데이터베이스에 영구적으로 반영되며, 이전 상태로 ROLLBACK할 수 없게 된다. ④ SAVEPOINT를 지정하면 트랜잭션 내에서 임의의 지점을 설정할 수 있으며, ROLLBACK TO [저장점명]을 실행할 경우 해당 저장점 이전의 모든 변경 사항까지 일괄 취소된다.

정답 및 해석

정답 ④

AVEPOINT로 설정한 저장점으로 롤백할 때는 ROLLBACK TO [저장점명] 구문을 실행한다.
이 때 해당 저장점 이후에 수행된 변경 사항만 취소된다.

📌 핵심 정리: TCL (트랜잭션 제어어)

  • COMMIT: 변경 사항을 최종 확정하고 영구 저장함
  • ROLLBACK: 변경 사항을 모두 취소하고 트랜잭션 시작 전 상태로 되돌림
  • SAVEPOINT [이름]: 트랜잭션 내에 복구할 예약 포인트(저장점)를 생성함
  • ROLLBACK TO [이름]: 지정한 저장점 이후의 변경 내용만 취소하고, 그 이전 변경 상태는 유지함


문제 3

다음 중 SQL 문법의 실행 순서로 가장 올바른 것은? ① FROM ➔ WHERE ➔ GROUP BY ➔ HAVING ➔ SELECT ➔ ORDER BY ② SELECT ➔ FROM ➔ WHERE ➔ GROUP BY ➔ HAVING ➔ ORDER BY ③ FROM ➔ SELECT ➔ WHERE ➔ GROUP BY ➔ HAVING ➔ ORDER BY ④ FROM ➔ WHERE ➔ SELECT ➔ GROUP BY ➔ HAVING ➔ ORDER BY

정답 및 해석

정답 ①

📌 시험 출제 포인트 (주의할 점)

  • WHERE절에는 집계함수(SUM, AVG, COUNT 등)를 사용할 수 없음
  • WHERE절이나 GROUP BY절에서는 SELECT절에서 만든 별칭(Alias)을 사용할 수 없음
  • ORDER BY절에서는 SELECT절에서 만든 별칭(Alias)을 사용할 수 있음


문제 4

다음 중 NULL 처리 및 NULL 관련 함수에 대한 설명으로 가장 올바르지 않은 것은? ① NULL은 '값이 없음'을 의미하며, 0이나 공백 문자('')와는 다른 개념이다. ② NULL과의 연산(예: 10 + NULL, NULL * 5)의 결과는 무조건 NULL이 된다. ③ NVL(col1, col2) 또는 ISNULL(col1, col2) 함수는 col1이 NULL인 경우 col2 값을 반환한다. ④ aggregate 함수(예: SUM, AVG, COUNT 등) 수행 시 NULL 값은 기본적으로 0으로 치환되어 집계 계산에 참여한다.

정답 및 해석

정답 ④

집계 함수(Aggregate Function)는 NULL 값을 계산 대상에서 완전히 제외(무시)한다.
NVL (오라클) / ISNULL (SQL Server) 함수는 첫 번째 인자 값이 NULL일 때 대체할 지정 값을 반환하는 대표적인 NULL 처리 함수이다.

📌 시험 출제 포인트 (주의할 점)

  • 집계 함수인 COUNT(*)는 테이블의 전체 행 수(Row 수)를 세기 때문에 NULL이 포함된 행도 카운트


문제 5

다음 중 단일행 함수(Single-Row Function) 및 결과값에 대한 설명으로 가장 올바르지 않은 것은? ① LOWER('SQLd')의 결과는 'sqld'이다. ② LENGTH('SQL')의 결과는 3이다. ③ MOD(10, 3)의 결과는 10을 3으로 나눈 값 3이다. ④ SUBSTR('DATABASE', 2, 4)의 결과는 2번째 글자부터 4개의 글자인 'ATAB'이다.

정답 및 해석

정답 ③

①번 : LOWER(‘SQLd’) ➔ 모든 대문자를 소문자로 변환하여 ‘sqld’가 된다.
②번 : LENGTH(‘SQL’) ➔ 문자열의 길이를 반환하므로 3이다
③번 : MOD(10, 3) ➔ 10을 3으로 나눈 나머지인 1을 반환한다.
④번 : SUBSTR(‘DATABASE’, 2, 4) ➔ 2번째 글자부터 4글자인 ‘ATAB’를 반환한다.

📌 시험 출제 포인트 (주의할 점)

  • SUBSTR 세 번째 인자는 종료 인덱스가 아니라 가져올 글자 수이다.


문제 6

다음 중 NULL 관련 변환 함수(NVL, NULLIF, COALESCE 등)에 대한 설명으로 가장 올바르지 않은 것은? ① NVL2(col1, col2, col3) 함수는 col1이 NULL이 아니면 col2를 반환하고, col1이 NULL이면 col3를 반환한다. ② NULLIF(col1, col2) 함수는 두 값이 같으면 NULL을 반환하고, 두 값이 다르면 첫 번째 인자(col1)의 값을 반환한다. ③ COALESCE(col1, col2, col3, ...) 함수는 모든 인자가 NULL이 아닐 때만 동작하며, 인자 중 하나라도 NULL이 포함되어 있으면 무조건 NULL을 반환한다. ④ NVL(col1, col2) 함수는 col1이 NULL일 경우 col2로 대체하여 반환한다.

정답 및 해석

정답 ③

①번 : NVL2는 3개의 인자를 받아 1번째 인자가 NULL인지 여부에 따라 2번째 또는 3번째 인자를 선택하여 반환한다.
②번 : NULLIF는 두 값이 서로 같은지 비교하여, 같으면 NULL을 반환하고 다르면 첫 번째 인자(col1)를 반환한다.
③번 (정답) : COALESCE(col1, col2, col3, …) 함수는 인자들 중에서 NULL이 아닌 ‘첫 번째’ 위치의 값을 그대로 반환하는 함수이다.
④번 : NVL은 가장 기본이 되는 NULL 대체 함수로, 1번째 인자가 NULL일 때 2번째 인자로 치환한다.

📌 핵심 정리: NULL 관련 변환 함수 요약

  • NVL(A, B) : A가 NULL이면 B, 아니면 A 반환
  • NVL2(A, B, C) A가 NULL이 아니면 B, NULL이면 C 반환
  • NULLIF(A, B) A와 B가 같으면 NULL, 다르면 A 반환
  • COALESCE(A, B, C, …)인자 중 NULL이 아닌 첫 번째 값 반환


문제 7

다음 중 NULL 관련 변환 함수(NVL, NULLIF, COALESCE 등)에 대한 설명으로 가장 올바르지 않은 것은? ① NVL2(col1, col2, col3) 함수는 col1이 NULL이 아니면 col2를 반환하고, col1이 NULL이면 col3를 반환한다. ② NULLIF(col1, col2) 함수는 두 값이 같으면 NULL을 반환하고, 두 값이 다르면 첫 번째 인자(col1)의 값을 반환한다. ③ COALESCE(col1, col2, col3, ...) 함수는 모든 인자가 NULL이 아닐 때만 동작하며, 인자 중 하나라도 NULL이 포함되어 있으면 무조건 NULL을 반환한다. ④ NVL(col1, col2) 함수는 col1이 NULL일 경우 col2로 대체하여 반환한다.

정답 및 해석

정답 ③

①번 : NVL2는 3개의 인자를 받아 1번째 인자가 NULL인지 여부에 따라 2번째 또는 3번째 인자를 선택하여 반환한다.
②번 : NULLIF는 두 값이 서로 같은지 비교하여, 같으면 NULL을 반환하고 다르면 첫 번째 인자(col1)를 반환한다.
③번 (정답) : COALESCE(col1, col2, col3, …) 함수는 인자들 중에서 NULL이 아닌 ‘첫 번째’ 위치의 값을 그대로 반환하는 함수이다.
④번 : NVL은 가장 기본이 되는 NULL 대체 함수로, 1번째 인자가 NULL일 때 2번째 인자로 치환한다.

📌 핵심 정리: NULL 관련 변환 함수 요약

  • NVL(A, B) : A가 NULL이면 B, 아니면 A 반환
  • NVL2(A, B, C) A가 NULL이 아니면 B, NULL이면 C 반환
  • NULLIF(A, B) A와 B가 같으면 NULL, 다르면 A 반환
  • COALESCE(A, B, C, …)인자 중 NULL이 아닌 첫 번째 값 반환


문제 8

다음 중 ORDER BY 절(정렬)에 대한 설명으로 가장 올바르지 않은 것은? ① ORDER BY 절은 기본적으로 오름차순(ASC)으로 정렬되며, 내림차순 정렬을 원할 경우 DESC 키워드를 명시한다. ② ORDER BY 절에서는 SELECT 절에서 지정한 컬럼의 별칭(Alias)이나 컬럼의 순서 번호(1, 2, 3...)를 사용할 수 있다. ③ Oracle 기준, NULL 값은 정렬 시 가장 작은 값으로 취급되어 오름차순(ASC) 정렬 시 결과의 맨 처음에 나온다. ④ ORDER BY 절은 SQL 구문의 실행 순서 상 가장 마지막에 해석·수행된다.

정답 및 해석

정답 ③
Oracle에서는 NULL을 가장 큰 값으로 취급한다.
따라서 오름차순(ASC) 정렬 시 NULL은 맨 마지막에 나오고, 내림차순(DESC) 정렬 시 맨 처음에 나온다.
(※ 참고: SQL Server / MySQL 등에서는 NULL을 가장 작은 값으로 취급하여 오름차순 정렬 시 맨 처음에 위치한다. DBMS마다 차이가 있으나, SQLD 시험의 기준이 되는 Oracle에서는 가장 큰 값으로 처리한다.)

①번 : 기본값은 오름차순(ASC)이며, DESC를 명시하면 내림차순으로 정렬된다.
②번 : ORDER BY 절에서는 SELECT 절의 별칭(Alias)이나 컬럼 순서 번호(1, 2, 3…)를 지정하여 정렬할 수 있다.
④번 : ORDER BY 절은 SQL 구문 실행 순서의 가장 마지막(6번째)에 수행된다.

📌 핵심 정리: Oracle vs SQL Server의 NULL 정렬 차이

  • Oracle 기준 (SQLD 기본 표준)
    • NULL = 가장 큰 값
    • 오름차순(ASC) 정렬 ➔ NULL이 맨 뒤에 출력
    • 내림차순(DESC) 정렬 ➔ NULL이 맨 앞에 출력
    • NULLS FIRST / NULLS LAST 옵션으로 NULL의 정렬 위치를 강제로 지정 가능
  • SQL Server 기준
    • NULL = 가장 작은 값
    • 오름차순(ASC) 정렬 ➔ NULL이 맨 앞에 출력


문제 9

다음 중 JOIN(조인)에 대한 설명으로 가장 올바르지 않은 것은? ① 두 개 이상의 테이블을 연결하여 데이터를 조회하는 기법이다. ② INNER JOIN은 조인 조건에 일치하는(양쪽 테이블 모두 존재하는) 행만 결과 집합에 포함한다. ③ LEFT OUTER JOIN은 왼쪽 테이블의 모든 행을 유지하며, 오른쪽 테이블에 일치하는 값이 없으면 해당 컬럼을 NULL로 채워 반환한다. ④ 두 테이블 간에 외래키(FK) 제약조건이 물리적으로 생성되어 있지 않은 컬럼끼리는 SQL에서 JOIN 연산을 절대로 수행할 수 없다.

정답 및 해석

정답 ④
두 테이블 사이에 물리적으로 외래키(FK, Foreign Key) 제약조건이 선언되어 있지 않더라도, 데이터 타입과 의미가 호환되는 컬럼만 있다면 SQL 조인(JOIN)은 얼마든지 가능하다.
FK 제약조건은 데이터 무결성을 유지하기 위한 제약일 뿐, JOIN 수행의 필수 조건이 아니다.

①번 : 조인은 관계형 데이터베이스에서 둘 이상의 테이블을 결합하여 가상으로 하나의 넓은 표처럼 조회하는 핵심 기법이다.
②번 : INNER JOIN은 조인 조건(ON 절)을 만족하는 교집합 데이터만 추출한다.
③번 : LEFT OUTER JOIN은 왼쪽(기준) 테이블의 행을 모두 보장하며, 오른쪽 테이블에 대응되는 행이 없으면 NULL로 매핑하여 반환한다.

📌 핵심 정리: JOIN과 FK(외래키)의 관계

  • FK(외래키) 제약조건: 부모-자식 데이터 간 무결성을 지키기 위한 DB 규칙 (예: 존재하지 않는 부모 키를 자식이 참조하지 못하게 막음)
  • JOIN 연산: 테이블 간 연결고리가 되는 컬럼을 ON 절이나 WHERE 절에 명시하기만 하면 FK 선언 여부와 무관하게 언제든 수행 가능


문제 10

다음 중 서브쿼리(Subquery)에 대한 설명으로 가장 올바르지 않은 것은? ① 서브쿼리는 메인쿼리 내부에서 괄호()로 감싸서 작성한다. ② 단일행 서브쿼리는 결과가 1개 행만 반환되므로 단일행 연산자(=, >, <, >= 등)를 사용한다. ③ 다중행 서브쿼리는 결과가 2개 이상의 행으로 반환되므로 다중행 연산자(IN, ANY, ALL, EXISTS 등)를 사용해야 한다. ④ 서브쿼리 내에서는 결과 정렬이 필요하므로 ORDER BY 절을 제약 없이 자유롭게 사용할 수 있다.

정답 및 해석

정답 ④
일반적인 서브쿼리(특히 WHERE 절 서브쿼리) 내에서는 ORDER BY 절을 사용할 수 없다.
서브쿼리는 메인쿼리 조건 처리의 일부로 수행되므로 정렬이 불필요하며, 구문 오류(Syntax Error)를 발생시킨다.
(※ 예외: 인라인 뷰(Inline View, FROM 절에 위치하는 서브쿼리)나 TOP-N 쿼리를 작성할 때처럼 정렬 결과가 메인 쿼리에 영향을 주는 일부 특수 상황에서는 사용이 가능하지만, 일반 서브쿼리에서는 원칙적으로 제약된다.)

①번 : 서브쿼리는 메인쿼리와 연산 우선순위를 구분하고 가독성을 높이기 위해 반드시 괄호()로 감싸야 한다.
②번 : 단일행 서브쿼리는 반환되는 결과 행이 정확히 1개이므로 =, >, <, >=, <= 등의 비교 연산자를 사용한다.
③번 : 다중행 서브쿼리는 결과 행이 2개 이상일 수 있으므로 IN, ANY/SOME, ALL, EXISTS와 같은 다중행 전용 연산자를 사용해야 한다.

📌 핵심 정리: 단일행 vs 다중행 서브쿼리 연산자

구분단일행 서브쿼리다중행 서브쿼리
반환 행 수정확히 1개 행2개 이상의 행
사용 연산자=, >, <, >=, <=, <>IN, ANY, ALL, EXISTS
주요 특징2개 이상의 행이 반환되면 “Single-row subquery returns more than one row” 에러 발생IN: 하나라도 일치하면 참 / EXISTS: 존재 여부만 체크(성능 우수)
  • IN 하나라도 일치
  • ANY 하나라도 조건 만족
  • ALL 전부 조건 만족
  • EXISTS 존재 여부 확인


문제 11

다음 중 집합 연산자(Set Operator)에 대한 설명으로 가장 올바르지 않은 것은? ① UNION은 두 집합의 합집합을 구하며, 중복된 행을 제거하는 과정에서 내부적으로 정렬(Sort) 연산이 발생할 수 있다. ② UNION ALL은 중복된 행을 제거하지 않고 그대로 병합하므로, UNION에 비해 성능상 이점이 있다. ③ INTERSECT는 두 집합의 교집합을 구하며, 공통으로 존재하는 행만 결과에 포함한다. ④ Oracle 기준 MINUS (또는 SQL Server 기준 EXCEPT) 연산자는 두 집합의 차집합을 구하며, 순서(상위 쿼리 - 하위 쿼리)에 영향을 받지 않는다.

정답 및 해석

정답 ④
차집합 연산자(MINUS / EXCEPT)는 쿼리의 작성 순서(상위 쿼리 - 하위 쿼리)에 따라 결과가 완전히 달라진다.
예를 들어 A - B(집합 A에서 B를 뺌)와 B - A(집합 B에서 A를 뺌)는 서로 다른 결과 집합을 반환한다.

①번 : UNION은 두 쿼리의 결과 집합을 합친 후 중복된 행을 제거한다. 이 과정에서 중복 제거 및 정렬(Sort) 작업이 수행될 수 있다.
②번 : UNION ALL은 중복 제거 과정을 거치지 않고 결과를 그대로 합쳐서 출력하므로, 정렬 작업이 발생하지 않아 UNION보다 실행 속도가 빠르다.
③번 : INTERSECT는 두 결과 집합의 교집합(공통으로 존재하는 행)을 반환한다.

📌 핵심 정리: 집합 연산자(Set Operator) 특징

연산자연산 종류중복 제거 여부정렬 연산 발생 여부
UNION합집합O발생함
UNION ALL합집합X발생하지 않음 (빠름)
INTERSECT교집합O발생함
MINUS / EXCEPT차집합 (순서 중요)O발생함


문제 12

다음 중 그룹 함수 및 그룹화 연산자(ROLLUP, CUBE, GROUPING SETS)에 대한 설명으로 가장 올바르지 않은 것은? ① GROUP BY 절을 사용할 때, 그룹화된 결과에 조건 필터링을 적용하려면 WHERE 절이 아닌 HAVING 절을 사용해야 한다. ② ROLLUP(A, B)는 계층적 구조의 소계 및 총계를 구하며, 인자의 순서가 변경되면 생성되는 소계의 조합 방식도 달라진다. ③ CUBE(A, B)는 지정된 컬럼들의 모든 가능한 조합($2^N$개)에 대해 다차원 소계 및 총계를 생성한다. ④ CUBE(A, B)에서 컬럼의 작성 순서를 CUBE(B, A)로 바꾸면, 생성되는 소계 조합의 전체 종류(항목 집합) 자체가 완전히 변경된다.

정답 및 해석

정답 ④
차집합 연산자(MINUS / EXCEPT)는 쿼리의 작성 순서(상위 쿼리 - 하위 쿼리)에 따라 결과가 완전히 달라진다.
예를 들어 A - B(집합 A에서 B를 뺌)와 B - A(집합 B에서 A를 뺌)는 서로 다른 결과 집합을 반환한다.

①번 : UNION은 두 쿼리의 결과 집합을 합친 후 중복된 행을 제거한다. 이 과정에서 중복 제거 및 정렬(Sort) 작업이 수행될 수 있다.
②번 : UNION ALL은 중복 제거 과정을 거치지 않고 결과를 그대로 합쳐서 출력하므로, 정렬 작업이 발생하지 않아 UNION보다 실행 속도가 빠르다.
③번 : INTERSECT는 두 결과 집합의 교집합(공통으로 존재하는 행)을 반환한다.

📌 핵심 정리: 집합 연산자(Set Operator) 특징

연산자연산 종류중복 제거 여부정렬 연산 발생 여부
UNION합집합O발생함
UNION ALL합집합X발생하지 않음 (빠름)
INTERSECT교집합O발생함
MINUS / EXCEPT차집합 (순서 중요)O발생함


문제 12

다음 중 그룹 함수 및 그룹화 연산자(ROLLUP, CUBE, GROUPING SETS)에 대한 설명으로 가장 올바르지 않은 것은? ① GROUP BY 절을 사용할 때, 그룹화된 결과에 조건 필터링을 적용하려면 WHERE 절이 아닌 HAVING 절을 사용해야 한다. ② ROLLUP(A, B)는 계층적 구조의 소계 및 총계를 구하며, 인자의 순서가 변경되면 생성되는 소계의 조합 방식도 달라진다. ③ CUBE(A, B)는 지정된 컬럼들의 모든 가능한 조합(2^N개)에 대해 다차원 소계 및 총계를 생성한다. ④ CUBE(A, B)에서 컬럼의 작성 순서를 CUBE(B, A)로 바꾸면, 생성되는 소계 조합의 전체 종류(항목 집합) 자체가 완전히 변경된다.

정답 및 해석

정답 ④
CUBE(A, B)는 A와 B 컬럼으로 만들 수 있는 모든 집계 조합인 (A, B), (A), (B), (전체)를 생성한다.
작성 순서를 CUBE(B, A)로 바꾼다 하더라도 생성되는 소계 항목의 ‘종류(집합)‘는 (B, A), (B), (A), (전체)로 완전히 동일하다. (출력되는 순서만 살짝 달라질 뿐이다.)
따라서 “소계 조합의 전체 종류 자체가 완전히 변경된다”는 설명은 틀린 설명이다.

①번 : 그룹화된 결과에 집계 조건(예: SUM(SAL) >= 1000)을 적용할 때는 HAVING 절을 사용한다.
②번 : ROLLUP(A, B)는 계층 구조(다단계) 소계를 구한다.

  • ROLLUP(A, B) ➔ (A, B), (A), (전체) 소계 생성
  • ROLLUP(B, A) ➔ (B, A), (B), (전체) 소계 생성
    이처럼 ROLLUP은 순서에 따라 소계 조합 방식이 완전히 달라지므로, 순서가 매우 중요하다.

③번 : CUBE는 2^N개(컬럼이 2개면 2^2 = 4개)의 모든 가능한 다차원 소계 조합을 구한다.

📌 핵심 정리: ROLLUP vs CUBE 차이점 (시험 최다 출제!)

컬럼이 A, B 2개일 때:

구분생성되는 소계 조합순서 변경 시 결과
ROLLUP(A, B)(A, B), (A), (전체)조합이 변경됨 (순서 중요!)
CUBE(A, B)(A, B), (A), (B), (전체)조합 종류 동일 (순서 상관없음)


문제 13

다음 중 윈도우 함수(Window Function)에 대한 설명으로 가장 올바르지 않은 것은? ① RANK() 함수는 동일한 순위가 존재할 경우 공동 순위를 부여하고, 그 다음 순위는 건너뛴다. (예: 1, 2, 2, 4) ② DENSE_RANK() 함수는 동일한 순위가 존재해도 다음 순위를 건너뛰지 않고 연속하여 부여한다. (예: 1, 2, 2, 3) ③ ROW_NUMBER() 함수는 값의 동일 여부와 관계없이 무조건 각 행에 고유한 연속 번호를 부여한다. (예: 1, 2, 3, 4) ④ 윈도우 함수는 다른 일반 집계 함수와 달리 OVER() 절을 사용하지 않고, GROUP BY 절과 함께 독립적으로 명시하여 사용한다.

정답 및 해석

정답 ④
윈도우 함수(Window Function)는 반드시 OVER() 절을 함께 명시하여 파티션(분할) 범위나 정렬 순서를 지정해야 한다.
또한, 기존의 GROUP BY 절처럼 행의 개수를 줄이지 않고 각 행의 형태를 유지한 채 계산 결과를 추가하는 특성을 가진다.

①번 : RANK()는 공동 순위가 발생하면 그 개수만큼 다음 순위를 건너뛴다. (예: 1위, 2위, 2위, 4위)
②번 : DENSE_RANK()는 공동 순위가 있어도 중간 순위를 비우지 않고 ‘조밀하게(Dense)’ 순위를 매긴다. (예: 1위, 2위, 2위, 3위)
③번 : ROW_NUMBER()는 동일한 값이라도 무조건 유일한 행 번호를 1부터 순서대로 부여한다. (예: 1, 2, 3, 4)

📌 핵심 정리: 순위 관련 윈도우 함수 3대장

값이 100, 90, 90, 80일 때의 순위 결과 비교:

함수명부여되는 순위 예시특징
RANK()1, 2, 2, 4중복 순위만큼 다음 순위를 건너뜀
DENSE_RANK()1, 2, 2, 3중복 순위가 있어도 연속된 순위 부여
ROW_NUMBER()1, 2, 3, 4동일한 값이어도 무조건 고유 번호 부여


문제 14

다음 중 계층형 쿼리(Hierarchical Query)에 대한 설명으로 가장 올바르지 않은 것은? ① START WITH 절은 계층 구조의 최상위 루트(Root) 노드가 될 행을 지정하는 조건절이다. ② CONNECT BY 절은 부모-자식 노드 간의 연결 관계 조건을 명시한다. ③ PRIOR 키워드는 CONNECT BY 절에서 사용되며, 바로 직전에 배치된 컬럼의 위치에 따라 상향식(Bottom-Up) 또는 하향식(Top-Down) 탐색이 결정된다. ④ ORDER BY 절을 사용할 때 ORDER SIBLINGS BY를 사용하면 전체 계층 구조가 무너지면서 일반적인 정렬과 동일하게 동작한다.

정답 및 해석

정답 ④
일반 ORDER BY 절을 사용하면 계층 구조가 무너지면서 전체 데이터를 기준으로 정렬된다.
하지만 ORDER SIBLINGS BY 절을 사용하면 계층 구조(부모-자식 관계)를 그대로 유지하면서 같은 형제 노드(Siblings)들끼리만 정렬된다.
따라서 “전체 계층 구조가 무너진다”는 설명은 틀렸다.

①번 : START WITH 절은 계층 탐색을 시작할 최상위 행(루트 노드)의 조건을 지정한다. (예: START WITH manager_id IS NULL)
②번 : CONNECT BY 절은 자식 노드와 부모 노드가 어떻게 연결되는지 조건을 기술한다.
③번 : PRIOR 키워드의 위치에 따라 탐색 방향이 달라진다.

  • CONNECT BY PRIOR emp_id = mgr_id ➔ 부모에서 자식으로 내려가는 하향식(Top-Down) 탐색
  • CONNECT BY emp_id = PRIOR mgr_id ➔ 자식에서 부모로 올라가는 상향식(Bottom-Up) 탐색
    📌 핵심 정리: 계층형 쿼리 필수 키워드
  • START WITH : 계층 구조의 시작점(루트) 지정
  • CONNECT BY : 부모-자식 간의 연결 조건 지정
  • PRIOR : 바로 이전에 방문한(직전) 행을 참조
  • ORDER SIBLINGS BY : 계층 트리 형태를 유지하며 동일 레벨(형제 노드)끼리 정렬
  • LEVEL : 현재 행의 깊이(계층 단계)를 나타내는 가상 컬럼 (루트는 1)


문제 15

다음 중 DML(데이터 조작어) 및 트랜잭션에 대한 설명으로 가장 올바르지 않은 것은? ① INSERT INTO tbl_name VALUES (...) 구문은 테이블에 새로운 행을 추가한다. ② UPDATE 구문 수행 시 WHERE 절을 생략하면 테이블 내의 모든 행의 데이터가 수정된다. ③ DELETE FROM tbl_name 구문은 테이블의 모든 데이터를 삭제하며, 수행 후 ROLLBACK을 통해 데이터를 복구할 수 없다. ④ TRUNCATE TABLE tbl_name 구문은 DDL 명령어에 해당하며, DELETE보다 속도가 빠르고 수행 후 즉시 COMMIT되어 ROLLBACK이 불가능하다.

정답 및 해석

정답 ③
DELETE는 DML(데이터 조작어) 명령어이다.
수행 후 바로 자동 커밋이 되는 것이 아니므로, COMMIT을 실행하기 전이라면 ROLLBACK을 통해 취소 및 데이터 복구가 가능하다.
(또한 Undo 데이터를 생성하므로 Disk I/O가 커서 데이터 복구가 불가능하다는 설명은 틀렸다.)

①번 : INSERT 구문은 테이블에 신규 데이터를 추가하는 DML 명령어이다.
②번 : UPDATE 문에서 WHERE 절을 생략하면 테이블의 전체 행을 대상으로 값이 수정되므로 주의해야 한다.
④번 : TRUNCATE는 DDL(데이터 정의어) 명령어이다. 저장 공간 자체를 초기화하는 방식으로 작동하여 DELETE보다 속도가 훨씬 빠르지만, 수행 즉시 Implicit Commit(자동 커밋)이 발생하여 ROLLBACK이 불가능하다.

📌 핵심 정리: DELETE vs TRUNCATE vs DROP 비교 (시험 단골!)

구분DELETETRUNCATEDROP
명령어 종류DML (데이터 조작어)DDL (데이터 정의어)DDL (데이터 정의어)
삭제 대상데이터 (행 단위)데이터 (전체 행)데이터 + 테이블 구조 자체
ROLLBACK 여부가능 (O)불가능 (X)불가능 (X)
처리 속도상대적으로 늦음매우 빠름매우 빠름
저장 공간삭제 후 공간 유지삭제 후 공간 반납공간 및 객체 삭제


마지막 수정