WHERE·ORDER BY·조건식 완벽 정리

SQL 실행 순서, WHERE절 연산자, 논리 연산자, LIKE, ORDER BY, DISTINCT까지 한눈에 정리

1. SQL 실행 순서

SELECT문 실행 순서

SQL은 작성 순서와 실행 순서가 다릅니다. 이 순서를 정확히 알아야 별칭(Alias) 사용 가능 여부, WHERE vs HAVING 차이 등을 이해할 수 있습니다.

순서역할
1FROM대상 테이블 결정 (JOIN 포함)
2WHERE행 단위 조건 필터링
3GROUP BY그룹화
4HAVING그룹 단위 조건 필터링
5SELECT컬럼 선택, 별칭 부여, 연산
6ORDER 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 BA 이상 B 이하 (양쪽 포함)WHERE SAL BETWEEN 2000 AND 4000
IN (값1, 값2, ...)목록 중 하나와 일치WHERE DEPT_ID IN (10, 20, 30)
IS NULLNULL 여부 확인WHERE MGR_ID IS NULL
IS NOT NULLNULL이 아닌 행WHERE COMM IS NOT NULL

BETWEEN은 >= AND <= 와 동일합니다. IN은 여러 OR 조건과 동일합니다. NULL 비교는 반드시 IS NULL / IS NOT NULL을 사용해야 합니다 (= NULL은 결과가 항상 FALSE).

3. 논리 연산자: AND, OR, NOT

연산자별 의미

연산자의미예시
AND두 조건 모두 TRUE일 때 TRUEWHERE SAL > 3000 AND DEPT_ID = 10
OR하나라도 TRUE이면 TRUEWHERE 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 BNOT BETWEEN A AND B
IN (값1, 값2)NOT IN (값1, 값2)
IS NULLIS 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 정렬 순서

DBMSASC일 때 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 명시

개념을 확인했다면 문제로 실력을 검증해보세요