대상을 정한다
FROM어떤 테이블에서 행을 가져올지 먼저 정합니다. 이후 모든 필터와 계산은 이 출발 집합 위에서 일어납니다.
조인이 있다면 이 단계에서 행의 폭과 수가 사실상 결정됩니다.
SQL을 쓸 때는 SELECT부터 적지만, 실제로는 어디서 행을 가져오고 어떻게 줄일지가 먼저 결정됩니다. 그래서 결과가 이상하면 절을 따로 보지 말고, 행이 만들어지는 흐름으로 읽어야 원인을 빠르게 찾을 수 있습니다.
한 쿼리를 읽는 기준
SELECT user_id, COALESCE(phone, '미등록') AS phone FROM users WHERE status = 'active' AND deleted_at IS NULL ORDER BY created_at DESC LIMIT 5;
대상을 정한다
FROM어떤 테이블에서 행을 가져올지 먼저 정합니다. 이후 모든 필터와 계산은 이 출발 집합 위에서 일어납니다.
조인이 있다면 이 단계에서 행의 폭과 수가 사실상 결정됩니다.
필요한 행만 남긴다
WHERE / GROUP BY / HAVINGWHERE는 개별 행을 거르고, GROUP BY는 묶고, HAVING은 묶인 결과를 다시 고릅니다.
NULL 비교는 IS NULL, 복합 조건은 괄호를 써야 의도한 결과가 유지됩니다.
보여줄 모양을 만든다
SELECT / DISTINCT / AS / CASE / COALESCE여기서 컬럼, 계산식, 별칭, NULL 대체값이 정해집니다. 별칭은 이 단계에서 생기므로 WHERE에서 바로 쓸 수 없습니다.
즉, SELECT는 첫 문장이지만 실행 흐름에서는 거의 마지막에 가깝습니다.
보내기 전에 정리한다
ORDER BY / LIMIT마지막으로 정렬 순서를 잡고, 몇 행만 보여줄지 제한합니다. 사용자가 보는 최종 결과는 이 단계에서 마무리됩니다.
다음 절에서 배우는 정렬과 제한은 이 최종 출력 단계를 다루는 도구입니다.
FROM → WHERE → GROUP BY/HAVING → SELECT → ORDER BY/LIMIT
순서로 확인합니다. 행을 먼저 고르고, 보여줄 값을 나중에 만든다는 흐름만 기억해도
SELECT의 대부분이 정리됩니다.