WHERE·ORDER BY·조건식 완벽 정리
SQL 실행 순서, WHERE절 연산자, 논리 연산자, LIKE, ORDER BY, DISTINCT까지 한눈에 정리
1. SQL 실행 순서
SELECT문 실행 순서
SQL은 작성 순서와 실행 순서가 다릅니다. 이 순서를 정확히 알아야 별칭(Alias) 사용 가능 여부, WHERE vs HAVING 차이 등을 이해할 수 있습니다.
| 순서 | 절 | 역할 |
|---|---|---|
| 1 | FROM | 대상 테이블 결정 (JOIN 포함) |
| 2 | WHERE | 행 단위 조건 필터링 |
| 3 | GROUP BY | 그룹화 |
| 4 | HAVING | 그룹 단위 조건 필터링 |
| 5 | SELECT | 컬럼 선택, 별칭 부여, 연산 |
| 6 | ORDER BY | 최종 정렬 |
실행 순서의 핵심 포인트
- SELECT 별칭은 ORDER BY에서만 사용 가능 — WHERE, GROUP BY, HAVING보다 SELECT가 늦게 실행되기 때문
- WHERE에서 집계함수 사용 불가 — GROUP BY보다 먼저 실행되므로 SUM, COUNT 등은 HAVING에서 사용
- ORDER BY에서 SELECT에 없는 컬럼도 사용 가능 — FROM의 테이블 컬럼을 참조할 수 있음 (단, DISTINCT 사용 시 제한)
2. WHERE절 비교 연산자
기본 비교 연산자
| 연산자 | 의미 | 예시 |
|---|---|---|
| = | 같다 | WHERE DEPT_ID = 10 |
| <> (!=) | 같지 않다 | WHERE STATUS <> 'D' |
| <, > | 작다, 크다 | WHERE SAL > 3000 |
| <=, >= | 작거나 같다, 크거나 같다 | WHERE AGE >= 20 |
BETWEEN, IN, IS NULL
| 연산자 | 의미 | 예시 |
|---|---|---|
| BETWEEN A AND B | A 이상 B 이하 (양쪽 포함) | WHERE SAL BETWEEN 2000 AND 4000 |
| IN (값1, 값2, ...) | 목록 중 하나와 일치 | WHERE DEPT_ID IN (10, 20, 30) |
| IS NULL | NULL 여부 확인 | WHERE MGR_ID IS NULL |
| IS NOT NULL | NULL이 아닌 행 | WHERE COMM IS NOT NULL |
BETWEEN은 >= AND <= 와 동일합니다. IN은 여러 OR 조건과 동일합니다. NULL 비교는 반드시 IS NULL / IS NOT NULL을 사용해야 합니다 (= NULL은 결과가 항상 FALSE).
3. 논리 연산자: AND, OR, NOT
연산자별 의미
| 연산자 | 의미 | 예시 |
|---|---|---|
| AND | 두 조건 모두 TRUE일 때 TRUE | WHERE SAL > 3000 AND DEPT_ID = 10 |
| OR | 하나라도 TRUE이면 TRUE | WHERE DEPT_ID = 10 OR DEPT_ID = 20 |
| NOT | 조건의 반대 | WHERE NOT DEPT_ID = 10 |
우선순위: NOT > AND > OR
괄호 없이 사용하면 NOT이 가장 먼저, 그다음 AND, 마지막 OR이 평가됩니다.
-- 의도: DEPT가 10이거나 20이면서 SAL > 3000
WHERE DEPT_ID = 10 OR DEPT_ID = 20 AND SAL > 3000
-- 실제 해석: DEPT=10 OR (DEPT=20 AND SAL>3000)
-- AND가 OR보다 먼저 평가됨!
-- 의도대로 하려면 괄호 필요:
WHERE (DEPT_ID = 10 OR DEPT_ID = 20) AND SAL > 3000
시험에서 괄호 없는 복합 조건의 결과를 묻는 문제가 자주 출제됩니다. 반드시 우선순위를 기억하세요.
NOT 활용
| 원래 조건 | NOT 적용 |
|---|---|
| BETWEEN A AND B | NOT BETWEEN A AND B |
| IN (값1, 값2) | NOT IN (값1, 값2) |
| IS NULL | IS NOT NULL |
| LIKE '%abc%' | NOT LIKE '%abc%' |
NOT IN에 NULL이 포함되면 결과가 항상 공집합이 됩니다. 예: NOT IN (10, NULL) → 항상 FALSE.
4. LIKE 와일드카드
와일드카드 문자
| 문자 | 의미 | 예시 | 매칭 |
|---|---|---|---|
| % | 0개 이상의 아무 문자 | LIKE '김%' | 김, 김철수, 김미영 등 |
| _ (언더스코어) | 정확히 1개의 아무 문자 | LIKE '김_' | 김X (2글자만, 김철수는 불일치) |
LIKE 패턴 예시
| 패턴 | 의미 |
|---|---|
| LIKE '%개발%' | '개발'을 포함하는 모든 문자열 |
| LIKE '김__' | '김'으로 시작하는 3글자 |
| LIKE '___' | 정확히 3글자인 문자열 |
| LIKE '%팀' | '팀'으로 끝나는 모든 문자열 |
ESCAPE 문자
%나 _를 실제 문자로 검색하고 싶을 때 ESCAPE를 사용합니다.
-- '10%' 문자열을 포함하는 행 찾기
WHERE COL LIKE '%10\%%' ESCAPE '\'
-- \를 이스케이프 문자로 지정 → \% 는 실제 % 문자를 의미
5. ORDER BY
기본 사용법
| 키워드 | 의미 | 기본값 |
|---|---|---|
| ASC | 오름차순 (작은 값 → 큰 값) | 기본값 (생략 가능) |
| DESC | 내림차순 (큰 값 → 작은 값) | 명시 필요 |
다양한 정렬 기준
-- 컬럼명으로 정렬
ORDER BY SAL DESC, NAME ASC
-- 컬럼 순서번호로 정렬 (SELECT절의 순서)
ORDER BY 3 DESC, 1 ASC
-- 별칭으로 정렬
SELECT SAL * 12 AS 연봉 FROM EMP ORDER BY 연봉 DESC
-- 연산식으로 정렬
ORDER BY SAL + COMM DESC
여러 컬럼으로 정렬 시 왼쪽부터 우선 적용됩니다. 첫 번째 기준이 같으면 두 번째 기준으로 정렬합니다.
NULL 정렬 순서
| DBMS | ASC일 때 NULL 위치 | DESC일 때 NULL 위치 |
|---|---|---|
| Oracle | 마지막 (LAST) | 처음 (FIRST) |
| SQL Server | 처음 (FIRST) | 마지막 (LAST) |
Oracle: NULL을 가장 큰 값으로 취급. SQL Server: NULL을 가장 작은 값으로 취급. Oracle에서는 NULLS FIRST / NULLS LAST로 순서를 제어할 수 있습니다.
ORDER BY 주의사항
- ORDER BY가 없으면 정렬을 보장하지 않음 — DBMS가 임의 순서로 반환할 수 있음
- ORDER BY는 SQL 실행 순서의 가장 마지막 — SELECT 별칭 사용 가능, 성능에 영향
- 컬럼 순서번호는 SELECT절 기준 — ORDER BY 1은 SELECT절의 첫 번째 컬럼
6. DISTINCT
기본 개념
SELECT 결과에서 중복 행을 제거합니다. SELECT절의 모든 컬럼 조합이 동일한 행을 하나로 합칩니다.
-- DEPT_ID의 중복 제거
SELECT DISTINCT DEPT_ID FROM EMP;
-- 두 컬럼 조합의 중복 제거
SELECT DISTINCT DEPT_ID, JOB FROM EMP;
DISTINCT 주의사항
- DISTINCT는 SELECT절 맨 앞에 한 번만 — SELECT DISTINCT COL1, COL2는 두 컬럼 조합이 동일한 행 제거
- DISTINCT 사용 시 ORDER BY에 SELECT에 없는 컬럼 사용 불가 — 중복 제거 후 어떤 값을 기준으로 정렬할지 모호하기 때문
- NULL도 하나의 값으로 취급 — DISTINCT 적용 시 여러 NULL은 하나로 합쳐짐
7. 시험 포인트
SQLD 빈출 핵심 정리
- 1. SQL 실행 순서 암기 — FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY (가장 많이 출제)
- 2. WHERE에서 별칭 사용 불가 — SELECT보다 WHERE가 먼저 실행되므로 별칭을 인식하지 못함
- 3. 논리 연산자 우선순위: NOT > AND > OR — 괄호 없는 복합 조건 해석 문제 빈출
- 4. NULL 비교는 IS NULL만 가능 — = NULL, <> NULL은 항상 UNKNOWN(FALSE 취급)
- 5. NOT IN에 NULL 포함 시 결과 공집합 — NOT IN (1, 2, NULL) → 모든 행이 FALSE
- 6. BETWEEN은 양쪽 경계값 포함 — BETWEEN 1 AND 3 = (1, 2, 3)
- 7. LIKE에서 %는 0개 이상, _는 정확히 1개 — '%'만 쓰면 모든 문자열, '_'만 쓰면 1글자만 매칭
- 8. Oracle NULL 정렬: ASC → LAST, DESC → FIRST — SQL Server는 반대 (ASC → FIRST, DESC → LAST)
- 9. ORDER BY 없으면 정렬 보장 안 됨 — 특정 순서가 필요하면 반드시 ORDER BY 명시
개념을 확인했다면 문제로 실력을 검증해보세요