SELECT절에서 조회할 데이터의 조건을 제시한다. WHERE절이 작동하는 원리는 아래와 같다.
Boolean으로 결과가 나올 수 있는 조건이 제시된다. 조건을 비교한 후 True인 데이터만 반환한다. 예를 들면 이름이 '김'으로 시작하는지 아닌지와 같은 조건이다.
이름 조건에 대한 결과 김길동 True 최길동 Flase 홍길동 Flase 김김길동 True ⇓⇓ 쿼리 결과
이름 김길동 김김길동
WHERE절에 들어가는 조건은 AND와 OR을 통해 여러 조건을 동시에 적용할 수 있다.
연산 순서는 FROM → WHERE → SELECT 순이다. 따라서 SELELCT절에서 지정한 alias는 WHERE절에서 사용할 수 없다.
-- WHERE 사용 예제
SELECT
first_name
, last_name
FROM
Customer
WHERE
first_name = 'Jamie';
AND
여러 값을 비교하는 경우 OR로 연결할 수 있다.
-- OR의 사용
SELECT
firt_name
, last_name
FROM
Customer
WHERE
firt_name = 'Ann'
OR firt_name = 'Anne'
OR firt_name = 'Annie';
그런데 위의 경우 동일한 비교를 세 번이나 작성하므로 코드도 비효율적이다. 이럴 때 IN 연산자를 사용한다. IN 연산자에는 조회할 단어 리스트를 조건으로 제시한다.
-- IN의 사용
SELECT
firt_name
, last_name
FROM
Customer
WHERE
firt_name IN ('Ann', 'Anne', 'Annie);'
문자열을 조회할 때 문자열 패턴으로 조건을 제시할 수 있다. 예를 들면 이름이 An로 시작하는 사람을 조회하는 것이 있다.
-- 이름이 'An'으로 시작하는 사람 조회
SELECT
first_name
, last_name
FROM
Customer
WHERE
first_name LIKE 'An%';
%기호는 글자 수에 상관없이 전부 조회하고, _는 글자수를 제한하여 조회한다.
숫자형 데이터를 조회할 때 범위를 조건으로 제시한다. 예를 들면 이름 길이가 3 ~ 5인 사람을 조회하는 것이 있다.
-- 이름이 'An'으로 시작하면서 이름의 길이가 3 ~ 5인 사람 조회
SELECT
first_name
, LENGTH(first_name) AS name_len
FROM
Customer
WHERE
first_name LIKE 'An%'
AND LENGTH(first_name) BETWEEN 3 AND 5
제시한 조건과 다른 경우 True를 반환한다. Python에서 not과 같은 역할이다. !=는 <>과 동일하다.(주로 !=를 사용한다고 함)
-- 이름이 'An'으로 시작하면서 이름의 길이가 5가 아닌 사람 조회
SELECT
first_name
, LENGTH(first_name) AS name_len
FROM
Customer
WHERE
first_name LIKE 'An%'
AND LENGTH(first_name) != 5;
SELECT절에서 반환되는 행의 수를 제한한다. 사용 예시는 아래와 같다.
SELECT
FROM
ORDER BY
LIMIT row_count
반환하고자 하는 행의 개수를 row_count에 지정한다. row_count가 0이면 출력값이 없고 NULL이면 LIMIT절을 사용하지 않는 것과 동일하다. 출력 시작점을 바꾸고 싶다면 LIMIT절에 OFFSET 옵션을 추가한다.
LIMIT를 사용하는 경우는 '상위 몇 명'와 같은 경우이기 때문에 주로 ORDER BY절을 함께 사용한다.
-- 영화 아이디 기준 상위 5개 데이터 조회
SELECT
film_id
, releas_year
FROM
Film
ORDER BY
film_id
LIMIT 5;
-- 영화 아이디 기준 상위 5위부터 5개 데이터 조회
SELECT
film_id
, releas_year
FROM
Film
ORDER BY
film_id
LIMIT 5 OFFSET 4;
첫 번째 예제와 달리 조회된 첫 번째 데이터의 id는 5이다.(OFFSET을 4로 줬기 때문)
조회하는 행의 개수를 제한하는 방법으로 위에서 소개한 LIMIT가 있지만, LIMIT은 SQL표준과 거리가 있다. 따라서 다른 어플이나 다른 언어와 함께 사용하기 위해서는 LIMIT절보다 FETCH절을 사용하는 것이 바람직하다.
-- LIMIT 첫 번째 예제와 동일
SELECT
film_id
, title
FROM
Film
ORDER BY
title
FETCH FIRST 5 ROW ONLY;
-- LIMIT 두 번째 예제와 동일
SELECT
film_id
, title
FROM
Film
ORDER BY
title
OFFSET 5 ROW
FETCH FIRST 5 ROW ONLY;
SQL 특성상 NULL은 연산을 할 수 없고 연산이 들어와도 항상 False를 반환한다. 따라서 'NULL=NULL'도 False를 반환한다!(형태만 보면 True 같으므로 주의!) 쿼리를 짜다보면 NULL인 데이터를 조회해야하는 경우가 있는데, '변수=NULL'을 조건으로 제시해도 위와 같은 이유로 데이터 반환이 되지 않는다. 따라서 NULL 데이터를 다루기 위해 IS NULL이 필요하다.
-- 조회 불가
SELECT
id
, first_name
, last_nae
, email
FROM
Customer
WHERE
email = NULL;
-- 조회 가능
SELECT
id
, first_name
, last_nae
, email
FROM
Customer
WHERE
email IS NULL;
NULL이 아닌 데이터만 다루기 위해서는 IS NOT NULL 키웓를 사용한다.
-- email 정보가 있는 데이터만 조회
SELECT
id
, first_name
, last_nae
, email
FROM
Customer
WHERE
email IS NOT NULL;