[SQL] 쿼리문의 실행 순서
sql문의 실행 순서
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT/OFF SET
- FROM
테이블 or 조인 대상 결정 - ON
조인시 조건 필터링 - JOIN
여러 테이블 연결 - WHERE
행(ROW) 단위 필터링 - GROUP BY
그룹핑 - HAVING
그룹핑된 결과에 대한 조건 - SELECT
컬럼 선택, 별칭 정의 - DISTINCT
중복 제거 - ORDER BY
결과 정렬 - LIMIT / OFFSET
결과 수 제한
쿼리 쓸 때 주의사항
1. WHER vs HAVING 구분
- WHERE은 그룹핑 전에 데이터를 필터링함 (행 단위 조건)
- HAVING은 그룹핑 후 필터링 (집계 함수 사용 시)
-- 예시
SELECT dept_id, COUNT(*) as cnt
FROM employees
WHERE salary > 3000 -- ✔️ 그룹핑 전에 필터
GROUP BY dept_id
HAVING COUNT(*) >= 5 -- ✔️ 그룹핑 후 조건
2. SELECT에서 사용하는 별칭(alias)은 WHERE, GROUP BY에서 못 씀
- SELECT는 실행 순서상 마지막이라, 앞에서 별칭을 바로 못 쓴다
- 대신, ORDER BY 에서는 SELECT에서 만든 별칭 사용 가능
SELECT salary * 12 AS annual_salary
FROM employees
WHERE annual_salary > 50000 -- ❌ 오류남 (annual_salary은 SELECT에서 만들어졌기 때문)
위처럼 쓰면 안 되고, 아래처럼 다시 써 줘야 한다.
SELECT salary * 12 AS annual_salary
FROM employees
WHERE salary * 12 > 50000 -- ✔️
3. ORDER BY에서는 컬럼명, 별칭, 컬럼 번호 사용 가능
SELECT name, age
FROM users
ORDER BY age DESC -- ✔️ 컬럼명
-- ORDER BY 2 DESC -- ✔️ 컬럼 번호 (2번째 컬럼)
-- ORDER BY age_alias -- ✔️ SELECT에서 만든 별칭
4. DISTINCT는 SELECT 다음에만 가능하고, 정렬 후에는 안 먹힘
SELECT DISTINCT name
FROM users
ORDER BY name ASC
5. GROUP BY에 SELECT에 없는 컬럼 쓰면 오류 발생 (DBMS마다 차이 있음)
MySQL은 ONLY_FULL_GROUP_BY 설정에 따라 허용/비허용이 갈림
-- 안전하게 쓰는 법
SELECT dept_id, COUNT(*) as cnt
FROM employees
GROUP BY dept_id
6. 집계 함수는 항상 그룹핑 없으면 전체에 대해 계산
-- 전체 행 수
SELECT COUNT(*) FROM employees;
-- 부서별 행 수
SELECT dept_id, COUNT(*) FROM employees GROUP BY dept_id;