SELECT문은 테이블에서 원하는 행·열을 조회하는 SQL의 기본입니다. SQLD 제2과목에서는 이 단원 자체보다 "논리적 실행 순서" 를 알아야 풀리는 문제가 다른 단원까지 이어집니다. 순서를 알면 별칭을 어디서 쓸 수 있는지, WHERE와 HAVING이 왜 다른지가 한 번에 풀립니다.
이 단원, 시험에서 어디에 나오나 (출제 비중)
- 제2과목 「SQL 기본 및 활용」 = 40문항 · 80점(문항당 2점, 전체의 80%). 합격을 좌우하는 과목입니다.
- 제2과목은 긴 SQL을 주고 "최종 결과표"를 예측하게 하는 문제가 많습니다. 그 토대가 이 실행 순서라, 여기서 흔들리면 조인·그룹함수까지 연쇄로 틀립니다. (단원별 문항수는 공개되지 않습니다 — 출처: KDATA 출제기준.)
출제 포인트 — 시험이 실제로 묻는 것
- 논리적 실행 순서
FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY(최다 함정) - 별칭(alias)을 쓸 수 있는 위치 — WHERE·GROUP BY엔 못 쓰고 ORDER BY에서만
- WHERE(그룹 전) vs HAVING(그룹 후) 의 필터링 시점
① 논리적 실행 순서 — 작성 순서와 다르다
우리가 쓰는 순서는 SELECT … FROM … WHERE … 지만, DB가 실행하는 순서는 다릅니다.
그림 1. 실행 순서. FROM으로 테이블을 잡고 → WHERE로 행을 거른 뒤 → 그룹을 만들고 → HAVING으로 그룹을 거른 다음 → SELECT로 열을 고르고 → 마지막에 ORDER BY로 정렬합니다. (자작 도식)
| 순서 | 절 | 하는 일 |
|---|---|---|
| 1 | FROM | 대상 테이블·조인 |
| 2 | WHERE | 개별 행 필터(그룹 전) |
| 3 | GROUP BY | 행을 그룹으로 묶음 |
| 4 | HAVING | 그룹 필터(그룹 후) |
| 5 | SELECT | 열 선택·별칭 생성 |
| 6 | ORDER BY | 정렬(맨 마지막) |
② 별칭은 ORDER BY에서만 — 대표 함정
별칭은 5번(SELECT)에서 비로소 만들어집니다. 그래서 그보다 먼저 실행되는 WHERE·GROUP BY·HAVING에서는 별칭을 쓸 수 없습니다. 별칭을 쓸 수 있는 곳은 실행이 더 뒤인 ORDER BY 뿐입니다.
SELECT 급여 * 12 AS 연봉
FROM 사원
WHERE 연봉 >= 60000000 -- ✘ 오류: WHERE는 SELECT보다 먼저라 '연봉'을 모름
ORDER BY 연봉 DESC; -- ✔ ORDER BY는 SELECT 뒤라 별칭 사용 가능
WHERE에서 별칭을 쓰려면 별칭 대신 원래 식(급여 * 12 >= 60000000)을 써야 합니다.
③ WHERE와 HAVING은 "거르는 시점"이 다르다
같은 필터 같지만, WHERE는 그룹을 만들기 전 개별 행을, HAVING은 그룹을 만든 뒤 그룹을 거릅니다. 그래서 집계 함수 조건은 HAVING에만 쓸 수 있습니다.
SELECT 부서, AVG(급여)
FROM 사원
WHERE 입사일 >= '2020-01-01' -- 행 조건(그룹 전)
GROUP BY 부서
HAVING AVG(급여) >= 5000; -- 집계 조건(그룹 후) → WHERE엔 못 씀
(WHERE·HAVING의 자세한 차이는 [GROUP BY·HAVING] 단원에서 이어집니다.)
한 장 정리 (암기 카드)
- 실행 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.
- 별칭은 SELECT(5)에서 생성 →
WHERE·GROUP BY·HAVING엔 못 쓰고ORDER BY(6)에서만. - WHERE = 그룹 전 행, HAVING = 그룹 후 그룹(집계 조건은 HAVING).
- 헷갈리면 "쓰는 순서 ≠ 실행 순서"를 떠올린다.
참고 출처
- 시험 과목·배점: 한국데이터산업진흥원(KDATA) 데이터자격검정 (2026년 7월 확인)
- 논리적 실행 순서·별칭 사용 범위는 ANSI SQL 표준·오라클 SQL 처리 순서에 근거하며, 본문 설명·도식·예시는 자작입니다.