728x90
반응형
SMALL
기본 구조
SELECT [DISTINCT] 컬럼들 | *
FROM 테이블
WHERE 행 필터 조건
GROUP BY 컬럼들
HAVING 그룹 필터 조건
ORDER BY 컬럼 [ASC|DESC], ...
-- (선택) LIMIT/OFFSET
실제 실행 순서
- `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