[SQLD] 02. WHERE 절

TJK·2025년 7월 22일

WHERE 절 - 조건 필터링

WHERE 절은 SELECT 문에서 조회할 데이터의 조건을 지정하여, 특정 조건을 만족하는 행(Row)만 필터링하는 역할을 함. FROM 절 다음에 위치하며, 데이터 조회 시 가장 핵심적인 필터링 기능을 수행함.


1. 비교 연산자 (Comparison Operators)

WHERE 절의 가장 기본적인 조건식은 비교 연산자를 통해 구성됨. 컬럼의 값이 특정 값과 일치하는지, 다른지, 혹은 대소 관계를 비교함.

연산자의미설명
=같다지정된 값과 정확히 일치함.
<> 또는 !=같지 않다지정된 값과 일치하지 않음. <>가 ANSI SQL 표준임.
>초과 (크다)지정된 값보다 큼.
<미만 (작다)지정된 값보다 작음.
>=이상 (크거나 같다)지정된 값보다 크거나 같음.
<=이하 (작거나 같다)지정된 값보다 작거나 같음.
/*
 * -- 비교 연산자 사용 예시 --
 * User 테이블에서 name 컬럼의 값이 'ryan'인 사용자의 모든 정보를 조회함.
 * 문자열 리터럴(값)은 작은따옴표('')로 감싸는 것이 표준임.
 */
SELECT
    *
FROM
    User
WHERE
    name = 'ryan';

2. 논리 연산자 (Logical Operators)

둘 이상의 조건을 결합하여 복합적인 조건을 만들 때 사용함.

  • 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';

3. 주요 SQL 연산자

비교/논리 연산자 외에 SQL은 더 효율적인 필터링을 위한 다양한 연산자를 제공함.

3.1 BETWEEN a AND b

  • 특정 범위 내의 값을 조회할 때 사용함.
  • ab포함하는 범위 (>= 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';

3.2 IN (list)

  • 리스트(집합)에 포함된 값 중 하나라도 일치하는 데이터를 조회함.
  • 여러 개의 OR 조건을 사용하는 것보다 간결하고 성능상 이점이 있을 수 있음.
  • NOT IN (list)는 해당 리스트에 포함되지 않는 값을 조회함.
-- user_id가 1, 9, 21 중 하나에 해당하는 사용자 정보를 조회함
SELECT 
    *
FROM 
    User
WHERE 
    user_id IN (1, 9, 21);

3.3 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 '%#일상%';

3.4 IS NULL

  • 컬럼의 값이 NULL인 데이터를 조회하기 위해 사용함.
  • 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;

4. 심화 개념: 연산자 우선순위

WHERE 절에 여러 연산자가 함께 사용될 경우, 정해진 우선순위에 따라 실행됨.

  1. 괄호 ()
  2. 비교 연산자 (=, >, < 등), SQL 연산자 (BETWEEN, LIKE, IN 등)
  3. NOT
  4. AND
  5. OR

※ 실전 팁: ANDOR보다 항상 먼저 실행됨. 의도치 않은 결과를 피하기 위해, OR 조건을 여러 AND 조건과 함께 사용할 때는 괄호()로 묶어 실행 순서를 명확히 지정해주는 것이 바람직함.


5. 시험 문제 유형 및 함정 포인트

  • NULL 비교: WHERE column = NULL은 틀린 문법. 반드시 WHERE column IS NULL을 사용해야 한다는 점은 단골 출제 포인트임.
  • BETWEEN의 범위: BETWEEN 연산자는 경계값을 포함한다는 점을 기억해야 함.
  • LIKE 와일드카드: %_의 차이점을 명확히 구분하는 문제가 자주 출제됨.
  • NOT 연산자 위치: NOT IN, NOT BETWEEN, IS NOT NULLNOT의 위치에 주의해야 함.
  • 연산자 우선순위: 괄호가 없는 ANDOR 혼합 조건식의 결과를 묻는 문제가 출제될 수 있음.

6. DBMS별 문법 차이

  • 날짜/시간 데이터 처리: 예제 코드의 TO_DATE() 함수는 Oracle에서 사용하는 함수임. DBMS마다 날짜 형식의 문자열을 다루는 방식이 다름.
DBMS문법 예시
OracleWHERE registration_date BETWEEN TO_DATE('2022-01-01', 'YYYY-MM-DD') AND TO_DATE('2022-12-31', 'YYYY-MM-DD')
MySQLWHERE registration_date BETWEEN '2022-01-01' AND '2022-12-31' (자동 형 변환) 또는 STR_TO_DATE() 함수 사용
SQL ServerWHERE registration_date BETWEEN '2022-01-01' AND '2022-12-31' 또는 CONVERT(DATE, '2022-01-01') 사용
profile
Hello world!

0개의 댓글