ThinkCatLog

[SQL] WHERE문과 BETWEEN, IN, LIKE 그리고 서브쿼리 본문

데이터 분석/SQL

[SQL] WHERE문과 BETWEEN, IN, LIKE 그리고 서브쿼리

생각냥 2024. 1. 10. 10:36

SQL 공부한 내용을 정리하기 위해 작성하는 글입니다. 아래의 데이터를 python을 이용하여 SQL에 저장하여 실습에 사용하였습니다.

작업환경
MySQL Server 8.2.0
MySQL Workbench 8.0.34
Python 3.11.2
사용한 데이터 : Netflix Movies and TV Shows(kaggle) 

데이터 출처 :https://www.kaggle.com/datasets/shivamb/netflix-shows

 

Netflix Movies and TV Shows

Listings of movies and tv shows on Netflix - Regularly Updated

www.kaggle.com


BETWEEN

BETWEEN은 WHERE과 함께 쓰인다. 범위를 조건으로 지정하기 위해 사용한다. 아래 쿼리는 column2 값이 value1과 value2 사이인 행만 가져오는 쿼리이다. 이때, value1과 value2가 포함된다. 수식으로 나타내면 value1 <= column2 <= value2 이다. 

SELECT column1
FROM table_name
WHERE column2 BETWEEN value1 AND value2

아래의 쿼리는 위의 쿼리와 같은 결과를 가져오는 쿼리이다. 

SELECT column1
FROM table_name
WHERE column2 >= value1 AND column2 <= value2

아래 쿼리는 release_year가 2016과 2018 사이인 행만 가져오는 쿼리이다.

2016년과 2018년 사이에 release된 data

BETWEEN과 텍스트 데이터

텍스트 데이터에 대해서도 BETWEEN을 사용할 수 있다. 텍스트에 대해서는 알파벳 순으로 범위를 인식한다. 아래 쿼리는 fruit_name 컬럼을 알파벳순으로 정렬했을 때, Apple과 Strawberry 사이에 해당하는 값을 갖는 행을 모두 가져오는 쿼리이다.

SELECT column1
FROM table_name
WHERE fruit_name BETWEEN "Apple" AND "Strawberry"

아래 쿼리는 title이 A와 B사이에 해당하는 값을 갖는 행을 모두 가져오는 쿼리이다. 결과적으로 title이 A로 시작하는 모든 행을 가져왔다. BETWEEN은 시작과 끝값이 포함되기 때문에 title에 B라는 값이 있었다면 해당되는 행까지 추출되었을 것이다.

title이 A와 B사이에 해당하는 값을 갖는 행

BETWEEN과 날짜 데이터

날짜 데이터에 대해서 BETWEEN을 적용할 수 있다. 어느 기간 사이의 값을 모두 추출할 수 있다. 아래의 쿼리는 특정 기간에 해당하는 행을 모두 가져오는 쿼리이다. 이때 날짜 값에 따옴표를 씌워줘야 한다.

SELECT column1
FROM table_name
WHERE datetime BETWEEN '2023-01-01' AND '2023-12-31'

아래 쿼리는 2020년에 Netflix에 추가된 목록을 가져오는 쿼리이다. date_added값이 '2020-01-01'과 '2020-12-31' 사이에 있는 값을 갖는 행을 모두 추출한다.

date_added값이 '2020-01-01'과 '2020-12-31' 사이에 있는 값을 갖는 행 추출

NOT BETWEEN

BETWEEN 앞에 NOT을 붙여 범위 밖의 값을 추출할 수 있다. 아래의 쿼리는 column2 값이 value1 미만이고 value2 초과인 값을 모두 추출하는 쿼리이다.

SELECT column1
FROM table_name
WHERE column2 NOT BETWEEN value1 AND value2

IN

IN은 column IN (A, B, C, ...)와 같이 쓰여, 괄호안의 값에 해당되는 값을 가진 행을 가져온다.

 

SELECT column1
FROM table_name
WHERE country IN ("South Korea", "United States")

아래의 쿼리는 country 값이 South Korea, United States, Japan인 행을 가져온다.

country 값이 South Korea, United States, Japan인 행

NOT IN

IN 앞에 NOT을 붙여 괄호 안의 값에 해당되지 않는 행을 가져올 때 사용할 수 있다. 

SELECT column1
FROM table_name
WHERE country NOT IN ("South Korea", "United States")

LIKE

LIKE는 WHERE문에서 특정한 패턴을 찾을 때 사용된다. 아래의 쿼리는 column2값이 abc로 시작하는 값을 가진 모든 행을 가져오는 쿼리이다.

SELECT column1
FROM table_name
WHERE column2 LIKE 'abc%'

아래 쿼리는 country 컬럼에서 S로 시작하는 값을 가진 행을 가져오는 쿼리이다. 

country 컬럼에서 S로 시작하는 값을 가진 행

WILDCARD "%"

위 쿼리에서 "문자열%"에 %는 와일드카드 문자이다. %는 제한 없는 길이의 문자열을 의미한다. %는 문자열 앞, 뒤, 중간 다 쓰일 수 있다. 의미는 다음과 같다. 

S% : S로 시작하는 모든 문자열 
%S: S로 끝나는 모든 문자열
%S% : 문자열 중간에 S가 들어있는 문자열 (중간의 위치는 상관 없음.) ex) LeeSuMan
%S%L% : 문자열 중간에 S와 L이 들어 있는 문자열 ex) KimSeonLae

WILDCARD "_"

또 다른 와일드카드 문자로 "_"(언더바)가 있다. %와 달리 _은 딱 하나의 문자를 의미한다. _도 문자열 앞, 뒤, 중간 다 쓰일 수 있다.

S_ : S로 시작하는 2글자 문자열 
_S: S로 끝나는 2글자 문자열
_S_ : 2번째 글자가 S인 3글자 문자열 ex) ASA

예시

cast에 Jung Hae-in이 있는 모든 목록을 찾고 싶다. cast의 값을 보면 여러 명의 이름이 한번에 입력되어 있다. cast 컬럼의 문자열에서 Jung Hae-in의 위치는 모두 다르기 때문에 와일드카드 %를 이용하여 %Jung Hae-in% 조건을 작성하였다. cast 컬럼의 문자열에 "Jung Hae-in" 이 들어있는 행을 모두 찾아준다.

cast 컬럼에 Jung Hae-in이 들어있는 행 추출


서브쿼리

WHERE문을 사용할 때, 괄호안에 쿼리를 넣을 수 있는데 이러한 쿼리를 서브쿼리라고 부른다. 아래의 쿼리가 서브쿼리를 이용하여 추출하는 쿼리이다. 

SELECT column1
FROM table_name
WHERE date_added = (SELECT date_added FROM table_name WHERE title = "D.P.")

 

만약, Netflix 데이터에서 "title이 D.P.인 목록과 같은 날에 추가된 모든 목록을 뽑아주세요" 라는 요청이 들어온다면 어떻게 해야할까? 

  1. WHERE문을 이용하여 title이 D.P.인 행을 찾는다.
  2. WHERE문을 이용하여 1번에서 찾은 날짜를 이용하여 해당 날짜에 추가된 드라마 목록을 추출한다.

이와 같이 두 단계를 거쳐야 할 것이다. 

1. WHERE문을 이용하여 title이 D.P.인 행을 찾는다. (왼) / 2. WHERE문을 이용하여 1번에서 찾은 날짜를 이용하여 해당 날짜에 추가된 드라마 목록을 추출한다. (오)

서브쿼리를 이용하면 두 단계를 거칠 필요 없이 한번에 가능하다. 괄호 안에 D.P라는 title을 가진 행의 date_added 값을 찾는 쿼리를 넣어 특정 값을 대신한다. 

서브쿼리를 이용한 쿼리