[SQLD 2과목] SQL 활용2 | 서브쿼리/집합 연산자/계층 쿼리/TOP N 쿼리 총정리
2026년 11월 9일 공유
SQLD 핵심 문법 종합 정리
개요
SQLD에서 자주 출제되는 서브쿼리, 집합 연산자, 계층형 쿼리, Top-N 쿼리의 핵심 개념과 대표적인 함정을 정리한다. 각 문법의 용도뿐 아니라 결과 형태와 실행 순서를 함께 이해하는 것이 중요하다.
핵심 메시지
- 서브쿼리는 위치, 반환 형태, 메인 쿼리와의 연관성으로 구분한다.
- 집합 연산자는 합집합·교집합·차집합의 차이와 쿼리 순서를 확인한다.
- 계층형 쿼리는 시작점, 연결 방향, 필터 적용 위치, 정렬 방식이 핵심이다.
- Top-N 쿼리는 DBMS별 문법과 정렬 후 행 제한 여부, 동점자 처리 방식을 구별한다.
주요 내용
1. 서브쿼리
위치에 따른 구분
- SELECT 절: 스칼라 서브쿼리. 단일 값을 반환한다.
- FROM 절: 인라인 뷰. 메인 쿼리 실행 중 사용하는 동적 테이블이다.
- WHERE 절: 중첩 서브쿼리. 조건 필터링에 사용한다.
반환 형태와 연산자
- 단일행 서브쿼리: 한 행을 반환하며
=,<,>등의 비교 연산자를 사용할 수 있다.
- 다중행 서브쿼리: 여러 행을 반환하므로
IN,ANY,ALL,EXISTS등의 다중행 연산자를 사용한다. 여러 행이 반환될 수 있는 자리에 단일행 비교 연산자를 사용하면 오류가 발생할 수 있다.
- 다중 컬럼 서브쿼리: 여러 컬럼을 함께 반환하며, 메인 쿼리에서도 대응되는 여러 컬럼을 비교해야 한다.
- 스칼라 서브쿼리는 반드시 단일 컬럼·단일 행 값을 반환한다. 여러 행을 반환하면 오류가 나고, 행이 없으면
NULL을 반환한다. 연관·비연관 형태 모두 가능하다.
연관·비연관 서브쿼리
- 연관 서브쿼리: 서브쿼리에서 메인 쿼리의 컬럼을 참조한다. 메인 쿼리의 각 행과 관련해 평가된다.
- 비연관 서브쿼리: 메인 쿼리와 독립적으로 작성된다.
- 연관 여부는 서브쿼리 안에서 메인 쿼리의 컬럼을 참조하는지 확인해 판단한다.
다중행 연산자
- IN: 값이 서브쿼리 결과 목록에 포함되는지 비교한다.
- EXISTS: 조건에 맞는 행이 하나라도 존재하는지 확인한다. 존재 여부만 중요하므로
SELECT 1등을 사용할 수 있다.
- NOT EXISTS: 조건에 맞는 행이 없는 경우를 찾는다.
NOT IN은 서브쿼리 결과에NULL이 있으면 예상과 다른 결과가 나올 수 있어 주의한다.
- ANY: 비교 조건을 하나 이상의 값이 만족하면 참이다.
- ALL: 비교 조건을 모든 값이 만족해야 참이다.
> ANY는 최솟값보다 큰 경우,> ALL은 최댓값보다 큰 경우를 판단하는 식으로 이해할 수 있다.
2. 집합 연산자
- UNION: 두 결과를 합치고 중복 행을 제거한다.
- UNION ALL: 중복을 제거하지 않고 결과를 합친다.
- INTERSECT: 두 결과에 공통으로 존재하는 행을 반환한다.
- MINUS 또는 SQL Server의 EXCEPT: 첫 번째 결과에서 두 번째 결과를 뺀다.
A MINUS B와B MINUS A의 결과는 다를 수 있다.
- 집합 연산에 포함된 각 쿼리는 컬럼 수와 대응 컬럼의 데이터 타입을 맞춰야 한다.
ORDER BY는 전체 집합 결과의 마지막에 한 번 적용한다. 각 쿼리에서 별도로 정렬하려는 경우에는 해당 DBMS의 문법을 확인해야 한다.
공집합
- 조건을 만족하는 행이 없는 결과를 공집합이라고 한다. 이는
NULL과 다르다.
SELECT결과가 비어 있어도 집계 함수 결과는 다를 수 있다.
SUM은NULL을 반환한다.
COUNT(*)는0을 반환한다.
CREATE TABLE ... AS SELECT ... WHERE 1=2와 같은 방식으로 데이터 없이 테이블 구조를 만들 수 있다.
3. 뷰
뷰는 실제 데이터를 저장하는 테이블이 아니라, 저장된 쿼리를 통해 제공되는 가상 테이블이다.
- 장점:
- 필요한 컬럼만 노출해 정보 접근을 제한할 수 있다.
- 복잡한 조인·집계 쿼리를 단순화할 수 있다.
- 뷰를 통해 논리적 독립성을 제공할 수 있다.
- 일반적인 뷰는 데이터를 저장하지 않으며, 뷰를 사용한다고 조회가 반드시 빨라지는 것은 아니다. 일반적인 뷰 자체에 인덱스를 직접 생성할 수 있는지는 DBMS와 뷰의 종류에 따라 다르다.
4. 계층형 쿼리
계층형 쿼리는 조직도처럼 상위·하위 관계를 표현한다.
- START WITH: 계층 탐색의 시작 행을 지정한다.
- CONNECT BY PRIOR: 행 사이의 연결 관계와 탐색 방향을 지정한다.
PRIOR의 앞뒤에 어떤 컬럼이 놓이는지에 따라 상위에서 하위로 내려가는지, 하위에서 상위로 올라가는지 달라진다. 방향을 판단할 때 부모·자식 컬럼의 위치를 확인한다.
조건과 실행 흐름
START WITH는 탐색의 출발점을 정한다.
CONNECT BY조건은 계층을 연결한다. 이 단계의 조건으로 특정 경로가 끊기면 그 하위 행도 탐색되지 않을 수 있다.
WHERE조건은 만들어진 결과에서 행을 필터링한다. 특정 행이 제외되어도 이미 연결된 하위 행은 결과에 남을 수 있다.
계층형 가상 컬럼·함수
LEVEL: 시작 행을 1로 하는 계층 깊이를 나타낸다.
CONNECT_BY_ROOT: 현재 행의 루트 행 값을 반환한다.
CONNECT_BY_ISLEAF: 하위 행이 없는 말단 행이면 1을 반환한다.
계층 구조를 유지하는 정렬
- 일반
ORDER BY는 전체 결과를 정렬해 계층의 표시 순서를 깨뜨릴 수 있다.
ORDER SIBLINGS BY는 같은 수준의 형제 행끼리 정렬하면서 계층 구조를 유지한다.
5. Top-N 쿼리와 행 제한
Oracle의 ROWNUM
ROWNUM은 정렬 전에 부여되므로, 원하는 상위 행을 얻으려면 인라인 뷰 안에서 먼저 정렬한 뒤 바깥 쿼리에서ROWNUM으로 제한한다.
ROWNUM <= 3처럼 앞에서부터 제한할 수 있지만,ROWNUM = 2처럼 특정 중간 번호만 지정하는 조건은 일반적으로 원하는 결과를 얻지 못한다.
SQL Server의 TOP
TOP n으로 상위 행을 제한하며, 원하는 순위를 얻으려면ORDER BY를 함께 지정한다.
WITH TIES를 사용하면 마지막 행과 같은 정렬 값을 가진 행도 포함하므로 지정한 건수보다 더 많이 반환될 수 있다.
OFFSET·FETCH
OFFSET n ROWS는 정렬된 결과에서 앞의 n개 행을 건너뛴다.
FETCH FIRST n ROWS ONLY는 그 다음 n개 행만 반환한다.
WITH TIES를 지정하면 마지막 행과 같은 정렬 값을 가진 행이 추가될 수 있다.
- 백분율로 행 수를 지정하는 문법에서는 결과 건수 계산 방식이 DBMS별로 다를 수 있으므로 해당 DBMS의 규칙을 확인한다.