brunch

You can make anything
by writing

C.S.Lewis

by 김유환 Oct 10. 2019

14. WHERE

SQL 에 필터 조건을 거는 WHERE에 대해 알아보자

배경

지난 글에서는 SQL 기반 데이터 분석의 시작이자 끝이라고 할 수 있는 SELECT 문에 대해서 살펴보았습니다. SELECT 문을 중심으로 모든 데이터 분석이 이루어지다보니, INSERT, UPDATE, DELETE 문들 과는 다르게 SELECT 에는 많은 기능들을 지원하고 있습니다. 조금 복잡하게 느껴질지 모르겠지만, 실무에서 결국 정교하게 얻어지는 데이터들이 더 큰 통찰을 담게 된다는 점을 기억하면서 열심히 학습하면 좋을 것 같습니다. 오늘 글에서는 WHERE 를 통해 조건을 넣는 방법에 대해 조금 더 깊이 살펴보고자 합니다.


AND

지난 글 SELECT에서 WHERE 문은 필터와 같은 기능을 한다고 소개하였습니다. 지난 시간에 다루었던 예제를 다시 한번 살펴봅시다. 사용자 테이블에서 키가 180 이상인 사용자를 가져오고 싶을때, 180 이상이라는 조건을 만들기 위해서는 다음과 같이 WHERE 문을 작성하면 된다고 했습니다.

이 WHERE문에 하나의 조건이 아닌 여러개의 조건을 걸려면 어떻게 해야할까요? 예를 들어, 사용자 테이블에서 키가 160 이상이면서 여자인 2개의 조건을 걸어 사용자의 데이터를 가져오고 싶다고 가정합시다. 이 경우에는 WHERE 에 AND로 여러개의 조건을 연결시키면 됩니다. 

AND 로 조건들을 연결하게 되면 해당 조건을 모두 만족시키는 데이터만 선택되게 됩니다. 예를 들어, 성별이 여자인 데이터 중에서 키가 158.3 인 데이터는 2번째 조건인 160 이상을 만족시키지 않기 때문에 선택되지 않습니다. 반대로, 키가 150인데 성별이 남자인 데이터의 경우에는 첫번째 조건인 키가 160 이상이라는 조건을 만족시키지 못하기 때문에 선택되지 않습니다.


OR

방금 배운 AND는 연결된 조건들이 모두 만족시키는 데이터만 가져오는 역할을 합니다. 이 경우와는 다르게 설정된 조건중 하나라도 만족되면 데이터를 가져오라는 질의문을 만들고 싶을때가 있습니다. 예를 들어, 사용자 예를 들어, 사용자의 나이가 19살이거나 29살인 사용자를 선택하고 싶을 수 있습니다. 이때는 아래와 같이 AND가 아닌 OR 로 조건들을 연결시키면 됩니다. 


AND + OR

조금 더 복잡한 상황을 가정해봅시다. 어떤 경우에는 AND 와 OR 을 동시에 사용해야하는 경우가 있습니다. 예를 들어, 키가 180 이상인 남자 사용자이거나 키가 160 이상인 여자 사용자를 가져오고 싶은 경우가 있을 겁니다. 이때는 AND와 OR을 함께 활용해서 조건문을 만들면 됩니다. 

위의 WHERE 문 안에 괄호가 추가된 것을 볼 수 있습니다. 이 괄호는 마치 수학에서 괄호로 연산을 묶으면 먼저 계산되는 것과 동일한 방식입니다. 첫번째 괄호안에 들어있는 조건은 키가 180이상이면서 남자인 조건을 의미합니다. 두번째 괄호는 키가 160 이상인 여자 사용자를 위한 조건입니다. 만약, 괄호가 없이 아래와 같이 조건문을 만들게 되면, 데이터베이스가 쿼리를 잘 못 해석해 원하지 않는 결과가 나올 수도 있으며 시간이 지난후 내가 작성한 쿼리를 다시 살펴볼때 해석하기 매우 어려워질 수 있습니다. 

SQL 문을 작성할때 줄바꿈, 띄어쓰기, 괄호 등을 이용해서 다른 사람이 보더라도 어떤 의도로 작성된 쿼리인지 명확하게 이해할 수 있게 만드는 것은 매우 중요합니다. 명확하게 쿼리를 작성하면 실수할 가능성도 줄어들고, 결과적으로 복잡한 쿼리도 작성할 수 있게 되기 때문입니다.


IN

OR 로 데이터를 연결하다보면, 두개의 OR 조건이 아닌 세개 혹은 열개의 데이터를 OR로 연결해서 선택해야하는 경우가 있습니다. 이때에는 IN 키워드를 활용하면, 조건마다 OR 조건문을 추가하는 것이 아니라 IN 하나 만으로도 동일한 조건으로 만들 수 있습니다. IN 키워드 문법은 아래와 같습니다.

예를 들어, 사용자 테이블에서 나이가 20세, 23세, 26세, 29세인 사용자의 데이터를 가져오고 싶다고 가정합시다. IN 을 활용해서 SQL 을 만들면 아래와 같습니다.


BETWEEN AND

이번에는 숫자 데이터 타입의 조건을 걸 때, 많이 사용하는 키워드인 BETWEEN 에 대해서도 배워봅시다. BETWEEEN 은 2개 숫자 사이의 값을 표시할때 사용합니다. 예를 들어, 키가 160 이상 180 이하의 사용자를 선택하는 조건문을 AND를 이용해서 표현하면 아래와 같습니다.

BETWEEN을 이용하면 보다 간단하고 명료하게 이 조건문을 표시 할 수 있습니다. 개인적으로는 BETWEEN을 자주 사용하는 것을 추천드립니다. 위의 AND+OR 에서도 설명했듯이, 좋은 SQL 문을 작성하는 것은 해석에 애매함을 없애는 것으로부터 시작합니다. BETWEEN은 AND 로 연결하는 것보다 의미상으로 우리에게 훨씬 직관적으로 다가오기 때문에 좋은 SQL 문을 만드는데 효과적입니다.


LIKE

이번에는 문자 데이터 타입 조건에서 많이 사용하는 키워드인 LIKE 에 대해서 배워보도록합시다. 여기에서 LIKE 는 '~과 같은' 혹은 '~과 비슷한' 이라는 뜻입니다. 굉장히 자주 우리는 어떤 문자로 시작하는, 어떤 문자로 끝나는, 어떤 문자를 포함하는 등의 조건이 필요한 경우가 많이 있습니다. 이 때는 LIKE 를 활용해서 해당 조건을 SQL 문에 표현할 수 있습니다.


퍼센트 (%)

SELECT 문에서 모든 열을 선택하기 위해 별표 (*) 를 사용했던 것과 비슷하게, LIKE 에서는 모든 문자열을 표현하기 위해서 퍼센트(%) 문자를 사용합니다. 퍼센트 문자를 어떻게 사용하는지 하나씩 살펴봅시다.


어떤 문자로 시작하는~

주민등록번호가 88로 시작하는 조건을 걸고 싶다고 가정합시다. 이 경우에는 아래와 같이 SQL 문을 작성하면 됩니다. 위에서 설명했듯이, %는 모든 문자열을 표현하기 때문에, DBMS 는 88로 주민등록번호가 시작하는 모든 사용자를 선택하게 됩니다.

어떤 문자로 끝나는~

시작하는과 동일하게 어떤 문자로 끝나는 조건 역시 LIKE 를 활용해서 표현할 수 있습니다. 예를 들어, 이름의 맨 마지막 글자가 희로 끝나는 사람을 찾고 싶다고 가정합시다. 이를 SQL 로 표현하면 아래와 같습니다. DBMS 는 '김서희', '이두희', 혹은 그냥 이름이 외자 '희'인 사람도 이 조건에 옳다고 판단되어 선택합니다.

어떤 문자를 포함하는~

어떤 문자를 포함한다는 것 역시 LIKE 를 통해 표현할 수 있습니다. 퍼센트가 모든 문자열을 나타내기 때문에, 포함해야하는 문자열을 가운데 두고 앞뒤로 퍼센트 문자를 붙이면 됩니다. 예를 들어, 주민등록번호 뒤가 1로 시작하는 사람들을 선택한다면 아래와 같은 SQL 문이 될 것입니다. 여기에서 '-1' 이라고 표현한 것은 주민등록번호 중간에 포함되어있는 하이픈(-)을 나타냅니다.


IS NOT NULL

마지막으로 NULL 에 대한 조건을 살펴보도록 합시다. 지난 글 데이터베이스에 테이블 만들기에서 NULL 에 대해서 설명했습니다.  NULL 은 데이터가 없다는 것을 표현하는 특수한 값이라고 설명했습니다. WHERE 조건 문에서 값이 비어있지 않은 데이터를 선택하고 싶을때는 IS NOT NULL 이라는 키워드를 활용하면 됩니다. 문법은 아래와 같습니다.

예를 들어, 현재 사용자 테이블에서는 키(height) 정보가 Nullable로 설정되어있습니다. 키가 NULL이 아닌 모든 사용자를 선택하고 싶을때는 아래와 같은 SQL 문을 요청하면 됩니다.


마치며

오늘 글에서는 WHERE 에서 사용할 수 있는 다양한 조건에 대해서 살펴봤습니다. 한번 보고는 익숙해지지 않겠지만, 이런 조건들이 가능하다는 것을 이해하고 필요에 따라서 찾아보면서 활용하시면 됩니다. 하지만, 이 글에서 다룬 조건들은 대부분 데이터 분석 활용에 아주 자주 사용하는 조건입니다. 여러 SQL 문을 만들어 보면서, 익숙해지시면 더 빠르게 원하는 데이터 분석 결과를 얻으실 수 있을 겁니다.

이전 13화 13. SELECT
brunch book
$magazine.title

현재 글은 이 브런치북에
소속되어 있습니다.

작품 선택

키워드 선택 0 / 3 0

댓글여부

afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari