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
서브쿼리의 결과 중 하나라도 조건을 만족하면 참으로 평가
ANY
와SOME
은 동의어로, 동일하게 동작함.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 );
'CS > 데이터베이스' 카테고리의 다른 글
[DB] 트랜잭션 격리 수준 (Transaction Isolation Level) (3) | 2024.09.14 |
---|