우리가 쓰는 순서:
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
실제 실행 순서:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
일반적인 실행 순서 상세
순서
절
역할
1
FROM / JOIN
테이블을 가져와 결합
2
ON
JOIN 조건 적용
3
WHERE
개별 행 필터
4
GROUP BY
행을 그룹으로 묶기
5
HAVING
그룹 필터
6
SELECT
출력할 컬럼 결정
7
DISTINCT
중복 제거
8
ORDER BY
정렬
9
LIMIT
행 수 제한
ORDER BY에서 SELECT별칭을 쓸 수 있는 이유
ORDER BY 는 SELECT 이후에 실행됩니다.
그래서 SELECT 에서 정의한 별칭을 ORDER BY 에서 사용할 수 있습니다.
SELECT COUNT(*) AS 좋아요수 ← 6번째 실행 (별칭 정의)
FROM like_log
GROUP BY post_id
ORDER BY 좋아요수 DESC; ← 8번째 실행 (별칭 사용 가능)
WHERE에서 집계함수를 쑬 수 없는 이유
WHERE 는 3번째 실행, 집계함수는 GROUP BY(4번) 이후에 계산됩니다.
아직 집계가 안 된 상태에서 집계 결과를 조건으로 쓸 수 없습니다.
WHERE COUNT(*) >= 3 -- 오류! 아직 COUNT 결과가 없음 (3번째 실행)
HAVING COUNT(*) >= 3 -- 정상! GROUP BY 이후에 COUNT 결과 존재 (5번째 실행)
LIMIT와 OFFSET
use shop;
-- 1 페이에 5건 보여 줌
select * from product order by id limit 5 offset 0;
-- 2 페이지에 5건을 또 보여 줘야 함.
select * from product order by id limit 5 offset 5;
-- 3 페이지에 5건을 또 보여 줘야 함.
-- 1 페이지당 5건 /
-- 3 페이지라면 몇 건을 건너 뛰어야 할까? 10건
select * from product order by id limit 5 offset 10;
-- 4 페이지라면 몇 건을 건너 뛰어야 할까? 15건
select * from product order by id limit 5 offset 15;