1. 조건 평가
: WHERE절에는 AND 또는 OR로 구분된 하나 이상의 조건이 포함될 수 있음
SELECT ...
FROM ...
WHERE FIRTST_NAME = 'STEVEN'
AND CREATE_DATE > '2006-01-01'
--혹은
OR CREATE_DATE > '2006-01-01'
- 괄호 사용 : 조건이 3개 이상이 될 경우, 서버와 다른 사람을 위해서 괄호를 사용해서 의도를 명확하게 하는 것이 좋음
SELECT ...
FROM ...
WHERE (FIRST_NAME = 'STEVEN' OR LAST_NAME = 'YOUNG')
AND CREATE_DATE > '2006-01-01'
- NOT사용
SELECT ...
FROM ...
WHERE NOT(FIRST_NAME = 'STEVEN' OR LAST_NAME = 'YOUNG')
AND CREATE_DATE > '2006-01-01'
SELECT ...
FROM ...
WHERE FIRST_NAME <> 'STEVEN'
AND LAST_NAME <> 'YOUNG'
AND CREATE_DATE > '2006-01-01'
2. 조건 작성
: 서버가 단일 조건을 구성하는 항목 (조건은 하나 이상의 연산자와 결합된 하나 이상의 표현식으로 구성됨)
- 표현식
- 숫자 혹은 문자열
- 테이블 혹은 뷰의 열
- 내장함수(concat(’Learning’, ‘ ‘, ‘SQL’’) 등)
- 서브쿼리
- 표현식 목록((’Boston’, ‘New York’, ‘L.A’) 등)
- 연산자
- 비교연산자 : =, ≠, >, <, <>, LIKE, IN, BETWEEN 등
- 산술연산자 : +, -, *, /
3. 조건 유형
1) 동등조건
- 동등조건(열 = 표현 or 값) : 특정 열과 다른 표현/값을 동일시 함
TITLE = 'RIVER OUTLAW'
FILM_ID = (SELECT FILM_ID FROM FILM WHERE TITLE = 'RIVER OUTLAW'
SELECT C.EMAIL
FROM CUSTOMER C
INNER JOIN RENTAL R
ON C.CUSTOMER_ID = R.CUSTOMER_ID
WHERE DATE(R.RENTAL_DATE) = '2005-06-14';
- 부등조건
SELECT C.EMAIL
FROM CUSTOMER C
INNER JOIN RENTAL R
ON C.CUSTOMER_ID = R.CUSTOMER_ID
WHERE DATE(R.RENTAL_DATE) <> '2005-06-14';
- 동등 조건을 사용해서 데이터 변경하기
DELETE FROM RENTAL
WHERE YEAR(RENTAL_DATE) = 2004;
DELETE FROM RENTAL
WHERE YEAR(RENTAL_DATE) <> 2005 AND YEAR(RENTAL_DATE_ <> 2006;
2) 범위조건
: 표현식이 다른 표현식과 같은지 확인하면서 해당 식이 특정 범위 내에 있는지를 확인(주로 숫자, 시간 비교)
SELECT CUSTOMER_ID, RENTAL_DATE
FROM RENTAL
WHERE RENTAL_DATE < '2005-05-25';
SELECT CUSTOMER_ID, RENTAL_DATE
FROM RENTAL
WHERE RENTAL_DATE <= '2005-06-16'
AND RENTAL_DATE >= '2005-06-15'
- BETWEEN연산자
SELECT CUSTOMER_ID, RENTAL_DATE
FROM RENTAL
WHERE RENTAL_DATE BETWEEN '2005-06-14' AND '2005-06-16';
SELECT CUSTOMER_ID, PAYMENT_DATE, AMOUNT
FROM PAYMENT
WHERE AMOUNT BETWEEN 10.0 AND 11.99;
* 범위의 하한값을 먼저 지정하고 상한값을 그 다음 지정해야 함
- 문자열 범위
SELECT LAST_NAME, FIRST_NAME
FROM CUSTOMER
WHERE LAST_NAME BETWEEN 'FA' AND 'FR';
SELECT LAST_NAME, FIRST_NAME
FROM CUSTOMER
WHERE LAST_NAEM BETWEEN 'FA' AND 'FRB';
3) 멤버쉽조건
: 경우에 따라 표현식을 단일 값, 혹은 범위로 제한하는 것 말고 집합으로 제한할 수도 있음
-- 등급이 G 혹은 PG인 모든 영화 찾기
SELECT TITLE, RATING
FROM FILM
WHERE RATING = 'G' OR RATING = 'PG';
SELECT TITLE, RATING
FROM FILM
WHERE RATING IN ('G', 'PG');
- 서브쿼리 사용
SELECT TITLE, RATING
FROM FILM
WHERE RATING IN (SELECT RATING FROM FILM WHERE TITLE LIKE '%PET%');
서브쿼리 수행 후 그 결과 값을 가지고 메인 쿼리 실행
NOT IN 사용
SELECT TITLE, RATING
FROM FILM
WHERE RATING NOT IN('PG-13', 'R', 'NC-17');
4) 일치조건
: 부분 문자열의 일치
SELECT LAST_NAME, FIRST_NAME
FROM CUSTOMER
WHERE LEFT(LAST_NAME, 1) = 'Q';
-- 유연성이 뛰어나지는 못함
- 와일드 카드
- _ : 정확히 한 문자
- % : 개수에 상관없이 모든 문자
✣ 와일드 카드 사용시 와일드 카드가 문자열의 맨 앞에 오게 되면(예: %on) table full scan을 타기 때문에 주의해야 하고
또한 조회할 때 NULL은 포함되지 않기 때문에 와일드카드를 사용할 때는 NULL값을 항상 염두에 두고 사용해야 한다.
SELECT LAST_NAME, FIRST_NAME
FROM CUSTOMER
WHERE LAST_NAME LIKE '_A_T%S';
SELECT LAST_NAME, FIRST_NAME
FROM CUSTOMER
WHERE LAST_NAME LIKE 'Q%' OR LAST_NAME LIKE 'Y%';
- 정규표현식
SELECT LAST_NAME, FIRST_NAME
FROM CUSTOMER
WHERE LAST_NAME REGEXP '^[QY]';
4. NULL
NULL
해당사항 없음
아직 알려지지 않은 값
정의되지 않은 값
NULL일 수는 있지만 NULL과 같을 수는 없음(두 NULL은 서로 같지 않음)
IS NULL
SELECT RENTAL_ID, CUSTOMER_ID
FROM RENTAL
WHERE RETURN_DATE IS NULL;
SELECT RENTAL_ID, CUSTOMER_ID
FROM RENTAL
WHERE RETURN_DATE = NULL;
SELECT RENTAL_ID, CUSTOMER_ID, RETURN_DATE
FROM RENTAL
WHERE RETURN_DATE IS NOT NULL;
SELECT RENTAL_ID, CUSTOMER_ID, RETURN_DATE
FROM RENTAL
WHERE RETURN_DATE NOT BETWEEN '2005-05-01' AND '2005-09-01';
-- 결과값에 NULL이 포함되는 경우도 고려해야 함으로 아래와 같이 쿼리를 짜는 것이 좋음
SELECT RENTAL_ID, CUSTOMER_ID, RETURN_DATE
FROM RENTAL
WHERE RETURN_DATE IS NULL
OR RETURN_DATE NOT BETWEEN '2005-05-01' AND '2005-09-01';
연습문제
-- 4-1
SELECT PAYMENT_ID, CUSTOMER_ID, AMOUNT, PAYMETN_DATE
FROM PAYMENT
WHERE PAYMENT_ID BETWEEN 101 AND 120
AND CUSTOMER_ID <> AND (AMOUNT > 8 OR DATE(PAYMENT_DATE) = '2005-08-23');
-- 4-2
SELECT PAYMENT_ID, CUSTOMER_ID, AMOUNT, PAYMENT_DATE
FROM PAYMENT
WHERE PAYMENT_ID BETWEEN 101 AND 120
AND CUSTOMER_ID = 5 AND NOT (AMOUNT > 6 OR DATE(PAYMENT_DATE) = '2005-06-19');
-- 4-3
SELECT AMOUNT
FROM PAYMENT
WHERE (AMOUNT = 1.98 AND AMOUNT = 7.98) OR AMOUNT = 9.98;
SELECT AMOUNT
FROM PAYMENT
WHERE AMOUNT IN(1.98, 7.98, 9.98);
-- 4-3
SELECT * FROM CUSTOMER;
SELECT LAST_NAME FROM CUSTOMER WHERE LAST_NAME LIKE '_A%W%';