PostgreSQL Tutorial 02. Filtering Data

jwKim·2023년 2월 13일
0

🎯 PostgreSQL Tutorial

목록 보기
2/9

01 .WHERE

01-01. 개요

SELECT절에서 조회할 데이터의 조건을 제시한다. WHERE절이 작동하는 원리는 아래와 같다.

Boolean으로 결과가 나올 수 있는 조건이 제시된다. 조건을 비교한 후 True인 데이터만 반환한다. 예를 들면 이름이 '김'으로 시작하는지 아닌지와 같은 조건이다.

이름조건에 대한 결과
김길동True
최길동Flase
홍길동Flase
김김길동True

\quad\quad\quad⇓⇓ 쿼리 결과

이름
김길동
김김길동

WHERE절에 들어가는 조건은 AND와 OR을 통해 여러 조건을 동시에 적용할 수 있다.

연산 순서는 FROM → WHERE → SELECT 순이다. 따라서 SELELCT절에서 지정한 alias는 WHERE절에서 사용할 수 없다.

-- WHERE 사용 예제
SELECT
	first_name
    , last_name
FROM
	Customer
WHERE
	first_name = 'Jamie';
    AND

01-02. IN의 사용

여러 값을 비교하는 경우 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);'

01-03. LIKE의 사용

문자열을 조회할 때 문자열 패턴으로 조건을 제시할 수 있다. 예를 들면 이름이 An로 시작하는 사람을 조회하는 것이 있다.

-- 이름이 'An'으로 시작하는 사람 조회
SELECT
	first_name
    , last_name
FROM
	Customer
WHERE
	first_name LIKE 'An%';

%기호는 글자 수에 상관없이 전부 조회하고, _는 글자수를 제한하여 조회한다.

01-04. BETWEEN의 사용

숫자형 데이터를 조회할 때 범위를 조건으로 제시한다. 예를 들면 이름 길이가 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

01-05. !=(<>) 사용

제시한 조건과 다른 경우 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;

02. LIMIT

02-01. 개요

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로 줬기 때문)

03. FETCH

03-01. 개요

조회하는 행의 개수를 제한하는 방법으로 위에서 소개한 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;

04. ISNULL

04-01. 개요

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;

0개의 댓글