본문 바로가기
CS/데이터베이스

[DB] SQL - WHERE에 들어갈 수 있는 조건들

by dingwoon 2024. 11. 13.

WHERE뒤의 condition에는 다양한 조건이 올 수 있다.

1 비교 연산자

=, !=, <>, <, >, <=, >=

-- 동적 쿼리 작성 시의 특수 예시
-- 동적 쿼리 작성 시나 여러 조건을 추가하는 경우에 구조를 단순화하기 위해
-- 항상 참인 `1=1` 조건을 AND로 묶어서 추가하는 경우가 있음.
SELECT * 
FROM employees 
WHERE 1=1
AND department = 'Sales'
AND salary > 50000;

2 논리 연산자

AND, OR, NOT

3 패턴 일치/불일치

LIKE, NOT LIKE

와일드 카드로 '_'와 '%'가 사용됨.
'_'는 정확히 한 문자를 대체하고, '%'는 0개 이상의 문자를 대체함.

-- LIKE
-- 예시: J로 시작하는 모든
SELECT * FROM employees WHERE name LIKE 'J%';
-- 예시: 3글자고 앞과 뒤가 A, B인 모든
SELECT * FROM items WHERE code LIKE 'A_B';

-- NOT LIKE
-- 예시: A로 시작하지 않는
SELECT * FROM employees WHERE name NOT LIKE 'A%';
-- 예시: Discount를 포함하지 않는
SELECT * FROM products WHERE description NOT LIKE '%Discount%';
-- 예시: .jpg가 아닌 
SELECT * FROM files WHERE filename NOT LIKE '%.jpg';

4 지정된 범위 내의 값/범위를 벗어난 값

BETWEEN ... AND ..., NOT BETWEEN ... AND ...

AND의 앞, 뒤를 포함한 사이에 있는 값에 대한 조건임.
앞 뒤의 순서가 바뀌면 결과가 바뀔 수 있음.
AND 앞쪽이 뒤쪽보다 크면 결과를 반환하지 않음.

-- 예시: 100과 500 사이
SELECT * FROM orders WHERE amount BETWEEN 100 AND 500;
-- 예시: 날짜 범위
SELECT * FROM events WHERE event_date BETWEEN '2024-01-01' AND '2024-12-31';
-- 예시: 문자 범위. A와 M을 포함한 그 안의 모든 문자열을 반환함.
SELECT * FROM employee WHERE last_name BETWEEN 'A' AND 'M';
-- 예시: NOT BETWEEN -> A부터 M까지의 모든 문자열은 포함되지 않음.
-- M은 포함되지 않지만, M으로 시작하는 모든 문자열은 포함됨.
SELECT * FROM employees WHERE last_name NOT BETWEEN 'A' AND 'M';

5 지정된 리스트에 포함된 값/포함되지 않은 값

IN, NOT IN

SELECT * FROM employees WHERE department IN ('HR', 'Sales', 'IT');
SELECT * FROM employees WHERE department NOT IN ('HR', 'Sales', 'IT');
-- 서브쿼리의 결과를 리스트로 활용 가능
SELECT * 
FROM employees 
WHERE department_id IN (
    SELECT department_id 
    FROM departments 
    WHERE location = 'New York'
);

6 값이 NULL인/NULL이 아닌 경우

IS NULL, IS NOT NULL

NULL은 0이나 빈 문자열(’’)과 다름. NULL은 말 그대로 데이터가 존재하지 않음을 뜻함.
NULL=!= 같은 비교 연산자로 비교할 수 없음.
NULL값은 특별한 의미를 가지기 때문에 SQL 작성 시에 반드시 적절하게 처리해야 함.

-- IS NULL 예시
SELECT * FROM employees WHERE email IS NULL;
-- IS NOT NULL 예시
SELECT * FROM employees WHERE phone_number IS NOT NULL;

7 EXISTS, ANY(SOME), ALL

이 조건은 SQL에서 서브쿼리와 함께 사용되어 특정 조건을 평가할 때 사용됨.
각각의 키워드는 서브쿼리의 결과에 따라 행을 필터링하는 방식이 다름.

  • EXISTS

    서브쿼리의 결과가 하나 이상 존재할 경우 참(True)으로 평가

    SELECT 1: EXISTS를 사용할 때 존재 여부만 확인하면 되기 때문에 값을 가져오지 않고 1이라는 상수를 반환하게 함. (SELECT 0으로 해도 상관 없음. 어떤 값이든 반환만 하면 됨.)

      SELECT * 
      FROM departments 
      WHERE EXISTS (
          SELECT 1 
          FROM employees 
          WHERE departments.department_id = employees.department_id
      );
  • ANY 또는 SOME

    서브쿼리의 결과 중 하나라도 조건을 만족하면 참으로 평가

    ANYSOME동의어로, 동일하게 동작함.

      SELECT * 
      FROM employees 
      WHERE salary > ANY (
          SELECT salary 
          FROM employees 
          WHERE department_id = 10
      );
  • ALL

    서브쿼리의 결과가 모두 조건을 만족해야 참으로 평가

      SELECT * 
      FROM employees 
      WHERE salary > ALL (
          SELECT salary 
          FROM employees 
          WHERE department_id = 10
      );