서브쿼리와 복합 SQL
서브쿼리의 결과 형태를 확인한 뒤 바깥 행마다 조건을 평가한다.
실기 학습 목표
서브쿼리의 결과 형태를 확인한 뒤 바깥 행마다 조건을 평가한다.
핵심 이론
스칼라 서브쿼리는 한 열·최대 한 행을 기대한다. 여러 행을 반환하면 오류이며 0행은 NULL로 취급되는 것이 일반적이다. IN은 후보 값 중 일치 여부를 확인한다.
EXISTS는 반환값 자체가 아니라 행 존재 여부다. 상관 서브쿼리는 바깥 행의 값을 참조하므로 바깥 행별로 관계를 확인한다.
ANY는 적어도 하나와의 비교가 TRUE인지, ALL은 모두에 대한 비교가 TRUE인지 본다. 빈 집합에서 ANY는 FALSE, ALL은 TRUE다. NULL이 섞이면 UNKNOWN 가능성을 따로 계산한다.
NOT IN의 목록에 NULL이 있으면 기대와 달리 행이 사라질 수 있다. NULL 처리 조건을 명시하거나 NOT EXISTS와 비교한다. 최종 집계·정렬은 바깥 SELECT 기준으로 수행한다.
개념 도식
서브쿼리의 결과 형태를 먼저 판별한다
서브쿼리는 한 값, 값들의 목록, 여러 열의 표 중 무엇을 돌려주는지 확인해야 한다. IN은 목록에 속하는지, EXISTS는 조건을 만족하는 행이 하나라도 있는지를 본다. EXISTS 안의 SELECT 1은 숫자 1을 바깥 결과로 내보내라는 뜻이 아니다.
상관 서브쿼리는 바깥 행에 따라 안쪽 조건이 달라진다. 점수가 20·40인 A그룹, 10·30인 B그룹에서 같은 그룹 평균보다 큰 행을 찾으면 평균표는 A=30·B=20이고, 각각 40과 30인 행이 남는다. 전체 평균을 한 번 계산해서 모든 행에 적용하면 다른 문제를 푼 셈이다.
- 바깥 행의 키 또는 그룹값을 적는다.
- 그 값과 연결되는 안쪽 행만 모은다.
- 안쪽 집계값·존재 여부를 계산한다.
- 바깥 조건의 참·거짓을 결정하고 최종 정렬을 적용한다.
NOT IN 목록에 NULL이 있으면 일치하지 않는 값도 UNKNOWN 판정의 영향을 받을 수 있다. NOT EXISTS와 무조건 같은 결과라고 가정하지 않는다. 빈 결과에 대한 ALL은 참인 반면 ANY는 거짓이며, NULL이 섞이면 비교의 3값 논리를 확인한다. 실기에서는 작은 표의 결과를 계산하는 데 집중한다.
풀이 예시
아래 테이블에 대해 SQL을 실행한 결과를 열의 순서대로 쓰시오. NULL은 NULL로 표기한다.
[Applicant]
| id |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
[Rejected]
| id |
|---|
| 2 |
| NULL |
[실행할 SQL]
SELECT a.id FROM Applicant a WHERE NOT EXISTS (SELECT 1 FROM Rejected r WHERE r.id=a.id) ORDER BY a.id;
예시 정답
1
3
4
풀이 과정
상관 서브쿼리는 현재 id와 같은 반려 행이 실제로 있는지 검사한다. 2만 대응 행이 있다. NULL과의 비교는 참이 되지 않으므로 다른 지원자까지 제외하지 않는다.
답안 점검
위 풀이 예시의 답을 가린 뒤, 핵심 이론의 규칙을 적용해 직접 풀어 보세요. 코드와 계산 문제는 중간값·단위·최종 출력의 순서를, 용어 문제는 지문의 핵심 단서와 답의 의미를 점검하세요. 해설과 다른 부분이 있으면 어느 조건을 놓쳤는지 확인하고 연결된 실기 문제로 다시 연습하세요.