학습 목표
SELECT의 논리 처리 순서를 따라 결과 행을 줄이고 정렬한다.
본문
핵심 이론
기본 흐름은 FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY이다. 실제 DB 실행 계획과 논리적 의미 순서를 혼동하지 않는다.
WHERE는 조건 결과가 TRUE인 행만 남긴다. 비교·BETWEEN·
DISTINCT는 선택된 열 조합의 중복을 제거한다. ORDER BY가 없으면 행 순서를 보장하지 않는다. 동률까지 순서를 요구하면 추가 정렬 키가 필요하다.
NULL은 =NULL로 검사하지 않고 IS NULL/IS NOT NULL을 쓴다. LIKE의 %는 0개 이상 문자, _는 한 문자다. 문자 정렬·NULL 정렬 위치 등 DBMS별 조건은 문제의 명시를 따른다.
개념 도식
SQL은 행 선택과 열 선택을 나눠 계산한다
학습용 논리 순서는 FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY다. 실제 DBMS의 물리 실행 순서를 뜻하는 것은 아니다. 간단한 SELECT도 원본 표에서 WHERE를 만족하는 행을 먼저 표시하고, 그 행에서 요구 열을 꺼내야 중복과 정렬을 정확히 셀 수 있다.
예를 들어 (A,10)·(A,20)·(B,5) 중 값이 10 이상인 행은 앞의 두 개다. 분류 열만 SELECT하면 A가 두 번 나오고 DISTINCT를 붙이면 한 번 나온다. 조건을 만족하는 행 수 2와 최종 결과 행 수 1은 다르다.
AND는 양쪽이 모두 참이어야 하고 OR는 한쪽만 참이어도 통과한다. 괄호를 먼저 적용하며 일반적으로 AND가 OR보다 우선한다. NULL 비교 결과가 UNKNOWN이면 WHERE를 통과하지 않는다. NULL 확인에는 IS NULL을 쓴다.
LIKE에서 %는 길이 0 이상 문자열, _는 문자 하나에 대응한다. 리터럴 밑줄을 찾는 문제라면 ESCAPE 조건을 확인한다. ORDER BY는 첫 기준이 같을 때 다음 기준을 사용한다. DESC·
풀이 예시
아래 테이블에 대해 SQL을 실행한 결과를 열의 순서대로 쓰시오. NULL은 NULL로 표기한다.
[Signal]
| id | ready | delay |
|---|---|---|
| 1 | 1 | 9 |
| 2 | 0 | 12 |
| 3 | 1 | NULL |
| 4 | 0 | 3 |
| 5 | 1 | 2 |
[실행할 SQL]
SELECT id FROM Signal WHERE (ready=1 AND delay<=5) OR delay IS NULL ORDER BY id;
정답과 풀이 보기
예시 정답
3
5
풀이 과정
3번은 delay IS NULL을 만족한다. 5번은 ready=1이면서 delay<=5이다. 4번의 지연은 짧아도 ready=0이므로 제외된다.