Skip to main content

[SQL] 쿼리문의 실행 순서


sql문의 실행 순서

image.png

FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT/OFF SET
  1. FROM
    테이블 or 조인 대상 결정
  2. ON
    조인시 조건 필터링
  3. JOIN
    여러 테이블 연결
  4. WHERE
    행(ROW) 단위 필터링
  5. GROUP BY
    그룹핑
  6. HAVING
    그룹핑된 결과에 대한 조건
  7. SELECT
    컬럼 선택, 별칭 정의
  8. DISTINCT
    중복 제거
  9. ORDER BY
    결과 정렬
  10. 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;