WHERE 절은 SELECT 문에서 조회할 데이터의 조건을 지정하여, 특정 조건을 만족하는 행(Row)만 필터링하는 역할을 함. FROM 절 다음에 위치하며, 데이터 조회 시 가장 핵심적인 필터링 기능을 수행함.
WHERE 절의 가장 기본적인 조건식은 비교 연산자를 통해 구성됨. 컬럼의 값이 특정 값과 일치하는지, 다른지, 혹은 대소 관계를 비교함.
| 연산자 | 의미 | 설명 |
|---|---|---|
= | 같다 | 지정된 값과 정확히 일치함. |
<> 또는 != | 같지 않다 | 지정된 값과 일치하지 않음. <>가 ANSI SQL 표준임. |
> | 초과 (크다) | 지정된 값보다 큼. |
< | 미만 (작다) | 지정된 값보다 작음. |
>= | 이상 (크거나 같다) | 지정된 값보다 크거나 같음. |
<= | 이하 (작거나 같다) | 지정된 값보다 작거나 같음. |
/*
* -- 비교 연산자 사용 예시 --
* User 테이블에서 name 컬럼의 값이 'ryan'인 사용자의 모든 정보를 조회함.
* 문자열 리터럴(값)은 작은따옴표('')로 감싸는 것이 표준임.
*/
SELECT
*
FROM
User
WHERE
name = 'ryan';
둘 이상의 조건을 결합하여 복합적인 조건을 만들 때 사용함.
AND: 두 조건을 모두 만족하는 경우 TRUE를 반환함.OR: 두 조건 중 하나라도 만족하는 경우 TRUE를 반환함.NOT: 뒤따르는 조건의 결과를 부정함./*
* -- AND 연산자 예시 --
* Post 테이블에서 user_id가 1이면서(AND) post_type이 'video'인 게시물을 조회함.
*/
SELECT
*
FROM
Post
WHERE
user_id = 1
AND post_type = 'video';
/*
* -- OR 연산자 예시 --
* Post 테이블에서 user_id가 1이거나(OR) post_type이 'video'인 모든 게시물을 조회함.
* (user_id가 1인 모든 게시물 + user_id가 1이 아닌 사용자의 'video' 게시물)
*/
SELECT
*
FROM
Post
WHERE
user_id = 1
OR post_type = 'video';
비교/논리 연산자 외에 SQL은 더 효율적인 필터링을 위한 다양한 연산자를 제공함.
BETWEEN a AND ba와 b를 포함하는 범위 (>= a AND <= b와 동일함)NOT BETWEEN a AND b는 해당 범위를 제외한 값을 조회함.-- registration_date가 2022-01-01과 2022-12-31 사이인 사용자를 조회함 (양 끝 날짜 포함)
SELECT
name,
registration_date
FROM
User
WHERE
registration_date BETWEEN '2022-01-01' AND '2022-12-31';
IN (list)OR 조건을 사용하는 것보다 간결하고 성능상 이점이 있을 수 있음.NOT IN (list)는 해당 리스트에 포함되지 않는 값을 조회함.-- user_id가 1, 9, 21 중 하나에 해당하는 사용자 정보를 조회함
SELECT
*
FROM
User
WHERE
user_id IN (1, 9, 21);
LIKE%: 0개 이상의 모든 문자를 의미함. (ex: p% -> 'p'로 시작하는 모든 문자열)_: 정확히 1개의 문자를 의미함. (ex: r_an -> 'ryan', 'rian' 등은 일치, 'raan'은 불일치)-- name이 'p'로 시작하는 모든 사용자를 조회
SELECT name FROM User WHERE name LIKE 'p%';
-- name이 'chu'로 끝나는 모든 사용자를 조회
SELECT name FROM User WHERE name LIKE '%chu';
-- 게시물 내용(content)에 '#일상'이라는 문자열이 포함된 모든 게시물을 조회
SELECT post_id, content FROM Post WHERE content LIKE '%#일상%';
IS NULLNULL인 데이터를 조회하기 위해 사용함.NULL은 '값이 없음'을 의미하는 특별한 상태로, 0이나 공백('')과는 다름.= NULL 형태로는 절대 비교할 수 없으며, 반드시 IS NULL 또는 IS NOT NULL을 사용해야 함.-- manager_id 컬럼의 값이 NULL인 사용자를 조회
SELECT
*
FROM
User
WHERE
manager_id IS NULL;
-- manager_id 컬럼에 값이 있는(NULL이 아닌) 사용자를 조회
SELECT
*
FROM
User
WHERE
manager_id IS NOT NULL;
WHERE 절에 여러 연산자가 함께 사용될 경우, 정해진 우선순위에 따라 실행됨.
()=, >, < 등), SQL 연산자 (BETWEEN, LIKE, IN 등)NOTANDOR※ 실전 팁:
AND가OR보다 항상 먼저 실행됨. 의도치 않은 결과를 피하기 위해,OR조건을 여러AND조건과 함께 사용할 때는 괄호()로 묶어 실행 순서를 명확히 지정해주는 것이 바람직함.
NULL 비교: WHERE column = NULL은 틀린 문법. 반드시 WHERE column IS NULL을 사용해야 한다는 점은 단골 출제 포인트임.BETWEEN의 범위: BETWEEN 연산자는 경계값을 포함한다는 점을 기억해야 함.LIKE 와일드카드: %와 _의 차이점을 명확히 구분하는 문제가 자주 출제됨.NOT 연산자 위치: NOT IN, NOT BETWEEN, IS NOT NULL 등 NOT의 위치에 주의해야 함.AND와 OR 혼합 조건식의 결과를 묻는 문제가 출제될 수 있음.TO_DATE() 함수는 Oracle에서 사용하는 함수임. DBMS마다 날짜 형식의 문자열을 다루는 방식이 다름.| DBMS | 문법 예시 |
|---|---|
| Oracle | WHERE registration_date BETWEEN TO_DATE('2022-01-01', 'YYYY-MM-DD') AND TO_DATE('2022-12-31', 'YYYY-MM-DD') |
| MySQL | WHERE registration_date BETWEEN '2022-01-01' AND '2022-12-31' (자동 형 변환) 또는 STR_TO_DATE() 함수 사용 |
| SQL Server | WHERE registration_date BETWEEN '2022-01-01' AND '2022-12-31' 또는 CONVERT(DATE, '2022-01-01') 사용 |