본문 바로가기

Data Literacy/SQL

Chapter 1. 데이터 조회, 필터링(10) - LIKE

PostgreSQL logo image

 
이제 드디어 LIKE연산자를 살펴볼 차례입니다. 사실 LIKE 연산자는 정규 표현식이나 String 데이터 관련 명령어처럼 디테일한 문자열의 조건을 지정하여 데이터를 출력할 수 있도록 도와주는 키워드입니다. 그래서, 다소 사용 방법이 어렵게 느껴지기도 하고 복잡한 편입니다. 하지만 몇 가지 주요 규칙만 기억한다면, 아주 유용하게 데이터를 검색할 수 있게 되는 유용한 명령어이니 잘 학습해 보도록 합시다. 
 
 


 
 
LIKE는 기본적으로 특정 칼럼의 값이 '지정한 조건과 같은 패턴을 갖고 있으면 출력하는' 명령어입니다. 여기서 어떤 패턴(조건)을 정의하느냐에 따라 출력되는 결과 값이 달라지는 것이지요. LIKE 역시 조건을 정의하는 키워드이기 때문에, WHERE과 함께 쓴다고 생각해 주시면 됩니다. 아래의 기본형 예시를 참고하세요.
 

select *
  from table_name
 where column_name like 조건
-- or
 where column_name not like 조건

 
위에서 보다시피 사용법 자체는 간단합니다. 테이블까지 지정하고, 그 다음 특정 칼럼을 선언한 다음 어떠한 조건에 부합하는 데이터를 조회할지 WHERE ~ LIKE...로 정의해 주면 됩니다. 
 
LIKE가 문자열을 다루는 명령어라고 했습니다. 여기서 사용되는 표현식 두 개가 있습니다. 바로 [ % ] 와 [ _ ]입니다. 이 두 가지가 문자열 검색 조건을 지정하는 문자열입니다. 잠시 후 자세히 살펴보겠지만, 
 
%는 어떤 문자나 문자열이 일괄적으로 매칭되었다고 판단하고, _ 는 한 개의 문자가 어떤 문자든 간에 매칭되었다고 판단합니다. 잘 이해가 가지 않으시죠? 실제 사례를 보면 금방 이해가 되실 겁니다. 
 
 
 


 
 

Q. CUSTOMER 테이블에서 FIRST_NAME이 'Jen'으로 시작하는 모든 고객의 FIRST_NAME과 LAST_NAME을 출력하세요.

 

select first_name ,
       last_name 
  from customer c 
 where first_name like 'Jen%'

 

 
위에서 'Jen'으로 시작하는 데이터를 'Jen%'으로 표시했습니다. Jen 다음에 %는 무엇이 오더라도 선택되는 조건입니다. 그래서 Jennifer, Jennie, Jenny가 선택되었습니다. 
 
 
 
 
간단한 True / False 출력 식을 통해서 [ % ]와 [ _ ] 사용법에 대해서 다시 한번 짚고 넘어가겠습니다. 아래와 같은 조건식을 출력한다고 가정했을 때, 각각의 칼럼은 True일지 False일지를 추측해 보겠습니다. 
 

select 
		'FOO' like 'FOO',
		'FOO' like 'F%' ,
		'FOO' like '_O_' ,
		'BAR' like 'B_'

 
위와 같이 'FOO'라는 글자를  like 연산자를 이용해서 몇 가지 방식으로 T/F를 출력해 보았습니다. 각각의 결과는 어떻게 될까요? 
 
(1) 우선 'FOO' like 'FOO'는 동일한 스트링이므로, 당연히 TRUE가 됩니다. 
(2) 'FOO' like 'F%'는 어떨까요? 이는 결국 [F로 시작하는 문자열 전체]를 의미하므로 역시 TRUE가 됩니다.
(3) 'FOO' like '_O_'의 결과는 어떨까요? '_O_'라는 것은 결국 [3글자 문자열이며, 가운데 글자가 'O'인 문자열]을 의미합니다. 'FOO'도 여기에 해당하므로 TRUE입니다.
(4) 'BAR'라는 글자가 'B_'에 해당할까요? 'B_'의 의미는 [2글자이며, B로 시작하는 문자열]을 의미합니다. B로 시작하는 것은 맞지만, 'BAR'은 세 글자로 이루어진 문자열입니다. 그러므로 조건에 부합하지 않는 글자이고, FALSE가 됩니다. 
 

 
 
 
 
 
 
 
이번에는 조금 다른 패턴을 배워보겠습니다. 
 

Q. CUSTOMER 테이블에서, FIRST_NAME에 'er'이 들어가는 모든 고객의 FIRST_NAME과 LAST_NAME을 출력하세요.

 

select first_name ,
       last_name 
  from customer c 
 where first_name like '%er%'

 
위에서 like를 통해 '%er%'을 입력했습니다. 만일 'er%'을 입력했으면 er로 시작하는 모든 문자를 의미했을 것입니다. 혹은 '%er'을 입력했다면, er로 끝나는 모든 문자를 의미했을 것이죠. 앞뒤로 %를 사용함으로써, 'er'이라는 연속된 문자열이 있는 모든 글자를 찾게 만들었습니다. 
 

 
 
좀 더 디테일한 조건을 만들어 봅시다.
 

Q. CUSTOMER 테이블에서, FIRST_NAME에 첫 번째 글자는 뭐든 상관없으며,  두 번째 글자부터 'her'이 들어가는 모든 고객의 FIRST_NAME과 LAST_NAME을 출력하세요.

 

select first_name ,
       last_name 
  from customer c 
 where first_name like '_her%'

 
위에서 like 조건문을 자세히 살펴봅시다. '_her'부분만 해석하면, 해당 문자열은 첫 번째 글자는 무엇이 와도 좋으며 바로 다음에는 her이 이어져야 합니다. 그런데, 이렇게만 like 조건문을 적게 되면 단 네 글자인 문장만 찾게 됩니다. 그래서 마지막에 %를 더해줘야 이후에 어떤 글자가 있어도 앞의 _her 조건이 맞으면 추출하게 되지요.