본문 바로가기

별걸다하는 IT/데이터베이스 Database

[데이터베이스 SQL] LIKE 사용법 - 특정 문자열이 포함되어 있는지 검색하기, 이스케이프 특수문자, 문자열 부분일치 컬럼 조회하기

반응형

[DBMS 데이터베이스 포스팅 링크 목차]

안녕하세요. 양햄찌 블로그 입니다. 

오늘은 아주아주 기본적인 SQL문 중, LIKE절 사용법에 대해 알아보려고 해요.

LIKE절이란?

특정 문자 또는 문자열을 포함하고 있는 값을 검색하고 싶을 때 사용합니다.

%기호는 wild문자로 0개 이상의 문자열과 대치돼요. 

즉 위의 쿼리로 수행할 경우, [컬럼]이 0개 이상의 문자열 사이에 특정 빨간 문자열이 있을 경우, 해당 레코드를 뽑아 특정 원하는 컬럼들을 조회한다는거죠~

 

참고로 LIKE절의 부정은 NOT LIKE 입니다.

LIKE 절의 와일드 문자

두 개밖에 없어요. ㅎㅎ 

와일드문자  의미
% 0개 이상의 문자열과 대치
_ 임의의 한 개의 문자와 대치

간단하죠..?

LIKE 사용 예시

똑같이 전에 깔았던 employees데이터를 활용해서 몇 가지 실습을 진행해볼게요

이렇게 데이터가 구성되어 있습니다.

 

[시작 문자 검색하기]

SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE FIRST_NAME LIKE 'A%'

성(FIRST_NAME)이 A로 시작하는 조건을 만족하는 레코드의 FIRST_NAME과 LAST_NAME의 값을 뽑아줘~

 

잘 뽑힌 것을 확인 할 수 있습니다.

 

[끝에 문자열 검색하기]

SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
where UPPER(FIRST_NAME) like '%NA'

이번엔 끝에 비교~ 걍 넘 똑같으면 재미없으니 UPPER를 써봤어요.

NA로 끝나는 성(FIRST_NAME)을 가진 레코드의 성과 이름을 뽑았습니다.

여기서 사용한 UPPER 함수는 소문자를 대문자로 바꿔주는 함수예요.

 

[특정 위치부터 검색하기]

SELECT first_name, last_name 
FROM employees 
WHERE last_name LIKE '__a%' 

요건 이름의 세 번째 문자가 a인 모든 사원이 성+이름을 표시하는쿼리가 되겠죠?

 

[AND조건으로 검색하기 ( 두 문자열 모두 가지고 있을 경우) ]

SELECT last_name
FROM employees 
WHERE last_name LIKE '%a%' and last_name LIKE '%e%'

이름에 a와 e 문자를 가진 모든 사원의 이름을 표시하는 쿼리입니다.

 

[특정 위치에 여러개의 문자가 해당하는 경우 추출]

그럼 만약 첫 번째 문자가 a,b,c,d,e 다섯 개 중에 하나라도 속하면 결과로 뽑고 싶을 땐 어떻게 해야할까요?

where last_name like 'a%' or last_name like 'b%' or last_name like 'c%' .... 이렇게 할 수도 있겠지만..?

이건 너무 길잖아요?

SELECT last_name
FROM employees 
where substr(last_name, 1, 1) in ( 'a', 'b', 'c', 'd', 'e')

그럴 경우 이처럼 substr을 사용해서 표현할 수 있습니다.

[이스케이프 문자] %나 _ 가 들어갔는지 검색하고 싶을 땐 어떻게 해?

와일드 문자를 그대로 하나의 문자처럼 검색하고 싶을 경우가 있을 수 있어요.

그럴 경우 ESCAPE 키워드를 이용해주면 검색할 수 있습니다. 이스케이프 문자임을 나타내기 위한 역할의 임시 와일드 문자를 지정해줘야 해요.

 

요렇게 됩니다.

ESCAPE뒤에 이스케이프 와일드 문자를 지정할 수 있어요.

그럼 해당 문자 뒤에 나오는 문자는 무조건 문자 그대로 인식하게 됩니다. 

원래 _가 와일드 문자로써 '임의의 한 개의 문자와 대치된다'라는 역할을 하지만 

위에 이스케이프 문자로 지정해준 @ 바로 뒤에 나오는 '_'의 경우 그냥 '_'로써 인식되어

JOB_ID 값에서 '_'문자를 가진 레코드들을 출력해라 라는 뜻의 쿼리가 됩니다.!

 

테스트를 해볼게요

요렇게 여러 유형의 JOB_ID가 있음.

쿼리 수행 전...

select JOB_ID
from employees
where JOB_ID like '%#___' ESCAPE '#'; 

뒤의 두 '_'는 와일드 문자로 작용하고 뒤의 세 번째 '_'는 문자 그대로로 적용되므로

뒤에서 3번째 글자가 '_'인 것을 추출하라는 뜻이 되는거죠.

 

잘 수행된 것을 볼 수 있어요.

더 나아가, REGEXP_LIKE 예고

특정 컬럼이 A라는 특정 문자열이 들어가 있을 경우 뿐만아니라 B라는 문자열이 들어가 있을 때도 뽑고 싶을 수 있잖아요. 즉 특정 컬럼이 여러 LIKE 조건 중 하나에 해당되면 뽑고 싶을 수 있어요. 마치 LIKE 와 IN의 조합이랄까.

불가

그런데 이런 명령어 조합은 지원되지 않습니다. 즉 잘못된 쿼리예요.

이와 같은 기능은 REGEXP_LIKE라는 함수로 구현할 수 있습니다.

REGEXP_LIKE가 궁금하신 사람들은 아래 포스팅을 참고해주세요! 

▼REGEXP_LIKE 포스팅: https://jhnyang.tistory.com/292

 

[SQL] REGEXP_LIKE 사용법 알아보기 - LIKE와 IN을 합한 것과 같은 함수, 여러 패턴에 속하는 조건 추출��

안녕하세요 ㅎㅎ 양햄찌 블로그 주인장입니다 오랜만에 데이터베이스 쿼리 관련 포스팅을 들고 왔어요. ■ REGEXP_LIKE 알아보기~ 오늘 알아볼 함수는 REGEXP_LIKE 입니다. regexp는 정규식이라는 뜻이��

jhnyang.tistory.com

오늘 포스팅은 여기까지입니다. 도움이 되셨다면 공감 어떤가요?

오늘 하루도 고생많으셨습니다 :) 

반응형
  • 최고 2021.05.25 09:58

    좋은 자료와 설명 감사합니다 :)
    본문 중에 아래 문장은 오타가 있는 것 같은데 확인해주시면 좋을 것 같습니다.

    "뒤에서 3번째 글자가 '#'인 것을 추출하라는 뜻이 되는거죠."
    →"뒤에서 3번째 글자가 '_'인 것을 추출하라는 뜻이 되는거죠."