SQL 문제를 문법 암기로만 풀면 쿼리가 조금 길어졌을 때 결과를 예측하기 어렵습니다. 핵심은 각 절이 어떤 행을 남기고, 어떤 열을 만들며, 언제 그룹으로 묶는지를 추적하는 것입니다. 작은 표를 직접 그려 결과 집합이 바뀌는 과정을 확인하세요.
작성 순서와 결과를 생각하는 순서를 구분합니다
SELECT가 문장 앞에 있어도 결과를 생각할 때는 FROM과 JOIN으로 대상 행을 만들고, WHERE로 행을 거른 뒤, GROUP BY와 HAVING을 적용하고, 마지막에 SELECT와 ORDER BY를 확인하는 편이 이해하기 쉽습니다. 실제 DBMS의 물리 실행 계획과 동일하다는 뜻이 아니라 학습자가 결과 집합을 추적하기 위한 논리적 순서입니다.
- FROM·JOIN출발 테이블과 결합된 행을 만든다.
- WHERE조건에 맞지 않는 행을 제거한다.
- GROUP·HAVING그룹을 만들고 그룹 조건을 적용한다.
- SELECT·ORDER출력 열을 결정하고 최종 순서를 정한다.
NULL은 빈 문자열이나 숫자 0이 아닙니다
NULL은 값이 알려지지 않았거나 적용할 수 없음을 나타냅니다. 일반 비교 연산자로 = NULL을 쓰지 않고 IS NULL 또는 IS NOT NULL을 사용합니다. 비교 결과가 참·거짓만이 아니라 미정이 될 수 있다는 점도 기억해야 합니다.
JOIN은 일치 여부가 아니라 남는 행을 그립니다
두 테이블을 작은 행 번호로 표시하고 결합 조건을 만족하는 쌍을 먼저 연결하세요. 외부 조인은 연결되지 않은 기준 테이블의 행을 마지막에 다시 추가하면 실수를 줄일 수 있습니다.
GROUP BY 문제는 행 수와 그룹 수를 분리합니다
WHERE 적용 뒤 남은 행 수와 GROUP BY 뒤 생성된 그룹 수는 다릅니다. 집계 함수는 각 그룹 안의 행을 계산하고, HAVING은 그 계산 결과를 기준으로 그룹을 제거합니다. 조건이 개별 행에 적용되는지 그룹 결과에 적용되는지부터 확인하세요.
오답은 쿼리 전체가 아니라 틀린 변환 단계로 복습합니다
정답 SQL만 다시 읽지 마세요. “LEFT JOIN에서 불일치 행을 누락”, “WHERE를 집계 뒤에 적용”, “COUNT(열)의 NULL 제외를 놓침”처럼 처음 잘못된 단계를 한 줄로 기록하세요. 다음 복습에서는 같은 함정이 있는 작은 표를 새로 만들어 결과를 회상하는 편이 좋습니다.
프로그래밍 문제와 마찬가지로 SQL도 중간 상태를 눈에 보이게 만드는 훈련입니다. 함께 준비한다면 C·Java·Python 코드 추적법도 이어서 확인하세요.