glorypang 2025. 10. 23. 21:25
728x90
반응형
SMALL

기본 구조

SELECT [DISTINCT] 컬럼들 | *
FROM   테이블
WHERE  행 필터 조건
GROUP BY 컬럼들
HAVING 그룹 필터 조건
ORDER BY 컬럼 [ASC|DESC], ...
-- (선택) LIMIT/OFFSET

실제 실행 순서

  1. `FROM` → 2) `WHERE` → 3) `GROUP BY` → 4) `HAVING` → 5) `SELECT` → 6) `ORDER BY` → 7) `LIMIT`

절별 요점

SELECT

  • `SELECT *` 또는 `SELECT a, b`
  • 집계함수 예: `COUNT(*)`, `SUM(x)`, `AVG(x)`, `MIN()`, `MAX()`
  • `DISTINCT`로 중복 제거 가능

FROM

  • 기본 테이블 또는 조인 사용 가능: `FROM R JOIN S ON R.k = S.k`

WHERE (행 필터)

  • 그룹핑 전에 행 걸러냄
  • `AND`, `OR`, `NOT` 가능 → 괄호로 우선순위 명확히!
    • `A AND (B OR C)`

GROUP BY (그룹핑)

  • “그룹핑 하고 싶을 때, 합계/개수 등”
  • `SELECT`에 나오는 비집계 컬럼은 GROUP BY에 포함되어야 함(표준 규칙)

HAVING (그룹 조건)

  • 그룹핑 후에 집계결과로 필터
  • 예: `HAVING COUNT(*) >= 2`

ORDER BY (정렬)

  • `ASC`(기본), `DESC`
  • 여러 컬럼 가능: `ORDER BY a DESC, b ASC`

예시

1) WHERE + ORDER BY

SELECT a, b
FROM T
WHERE b >= 2 AND (a = 'x' OR a = 'y')
ORDER BY b DESC, a ASC;

2) GROUP BY + HAVING + 집계

SELECT a, COUNT(*) AS cnt, SUM(b) AS total_b
FROM T
WHERE b >= 1          -- 그룹 전 필터
GROUP BY a            -- a별 그룹
HAVING COUNT(*) >= 2  -- 그룹 후 필터
ORDER BY total_b DESC;

3) DISTINCT, LIMIT

SELECT DISTINCT a
FROM T
ORDER BY a
LIMIT 10 OFFSET 0;

헷갈리는 포인트

  • WHERE vs HAVING:
    • WHERE = 행 필터(집계 전), HAVING = 그룹 필터(집계 후)
  • AND/OR 우선순위:
    • AND가 OR보다 먼저 → 헷갈리면 괄호 사용
  • NULL 비교:
    • `= NULL` 안 됨 → `IS NULL` / `IS NOT NULL`
  • 집계컬럼 별칭:
    • 별칭은 `ORDER BY`에서 사용 가능: `ORDER BY total_b DESC`
728x90
반응형
LIST