본문 바로가기
SQL

기초 문법 - 와일드 카드로 조회하기 : Like[조건값]

by d22pinsights 2024. 7. 18.

SELECT [열]
FROM [테이블]
WHERE [열]
LIKE [조건값]
%로 특정 문자열을 포함하는 데이터 조회하기
  • A% : A로 시작하는 모든 문자열
  • %A : A로 끝나는 모든 문자열
  • %A% : A가 포함된 모든 문자열

customer 테이블의 first_name 열에서 % 사용해보자

# 첫 번째 글자가 A로 시작하는 데이터
SELECT * FROM  customer WHERE first_name LIKE 'A%';

# 첫 번째 글자가 AA로 시작하는 데이터
SELECT * FROM customer WHERE first_name LIKE 'AA%';

# A로 끝나는 모든 데이터 조회
SELECT * FROM customer WHERE first_name LIKE '%A';

# A를 포함하는 모든 데이터 조회
SELECT * FROM customer WHERE first_name LIKE '%A%';

# A로 시작하지 않는 데이터 조회
SELECT * FROM customer WHERE first_name NOT LIKE 'A%';

특정 문자열을 제외하고 싶다면 NOT LIKE를 사용하면 된다!

 

ESCAPE로 특수 문자 포함한 데이터 조회하기

'%'를 포함한 데이터를 조회하고 싶다면 ESCAPE 를 사용해야한다

'%%'를 쓰면 조회가 안된다

 

먼저 특수기호를 포함한 테이블 생성

# %, _ 같은 특수기호를 포함한 임의의 테이블 생성
WITH CTE(col_1) AS (
SELECT 'A%BC' UNION ALL
SELECT 'A_BC' UNION ALL
SELECT 'ABC'
)

SELECT * FROM CTE;

CTE테이블을 안에 %와 _(언더바) 특수기호가 들어간 데이터가 있는 것을 확인!

 

WITH CTE(col_1) AS (
SELECT 'A%BC' UNION ALL
SELECT 'A_BC' UNION ALL
SELECT 'ABC'
)

SELECT * FROM CTE WHERE col_1 LIKE '%';

생각과 다르게 모든 열이 조회된다. %만 포함된 데이터를 조회하기 위해서는 ESCAPE를 사용해야한다

SELECT * FROM CTE WHERE col_1 LIKE '%#%%' ESCAPE '#';

 

ESCAPE문이 #을 제거해 실제로는 '%$%%'이 아닌 '%%%'로 해석되어 '%'이 포함하는 데이터가 검색되는 것이다

그렇다면 처음부터 '%%%'라고 쓰면 되는 것 아닌가?라는 생각이 들어서 해봤는데

안된다

 

ESCAPE를 꼭 쓰도록 하자

 

_로 길이가 정해진 데이터 조회하기
  • A_ : A로 시작하면서 뒤의 글자는 무엇이든 상관없으며 전체 글자 수는 2개인 문자열
  • _A : A로 끝나면서 앞의 문자는 무엇이든 상관없으며 전체  글자 수는 2개인 문자열
  • _A_ : 세 글자로 된 문자열 중 가운데 글자만 A이며 앞뒤로는 무엇이든 상관없는 문자열
# A로 시작하면서 문자열 길이가 3인 데이터 조회
SELECT * FROM customer WHERE first_name LIKE 'A__';

# A로 시작하고 A로 끝나면서 문자열 길이가 4인 데이터 조회
SELECT * FROM customer WHERE first_name LIKE 'A__A';

# 길이가 5인 데이터 조회
SELECT * FROM customer WHERE first_name LIKE '_____';

원하는 길이 만큼 _ (언더바)를 넣으면 길이를 설정할 수 있다

 

%와 _ 같이 쓰기
  • A와 R사이에 한 글자를 포함하여 시작하면서 이후 문자열은 어떤 문자열이라도 상관없는 데이터 조회
SELECT * FROM customer WHERE first_name LIKE 'A_R%';

 

  • R앞에 두 글자를 포함하여 시작하면서 이후 문자열은 어떤 문자열이라도 상관없는 데이터 조회
SELECT * FROM customer WHERE first_name LIKE '__R%';
  • A로 시작하고, 마지막은 R과 함께 마지막 한 글자가 더 있는 문자열 데이터를 조회
SELECT * FROM customer WHERE first_name LIKE 'A%R_';

 

 

REGEXP로 데이터 조회하기

REGEXP : 정규표현식, 특정한 패턴의 문자열을 표현하기 위해 사용한다

표현식 설명
. 줄 바꿈 문자(\n)를 제외한 임의의 한 문자
* 해당 문자 패턴이 0번 이상 반복한다
+ 해당 문자 패턴이 1번 이상 반복한다
^ 문자열의 처음을 의미한다
$ 문자열의 끝을 의미한다
| OR를 의미한다
[...] 대괄호 안에 있는 어떠한 문자를 의미한다
[^...] 대괄호 안에 있지 않은 어떠한 문자를 의미한다
{n} 반복되는 횟수를 지정한다
{m,n} 반복되는 횟수의 최솟값과 최댓값을 지정한다

 

 

  • K로 시작하거나 R로 N으로 끝나는 데이터 조회 - REGEXP
SELECT * FROM customer WHERE first_name REGEXP '^K|N$';
  • K와 함께 L과 N 사이의 글자를 포함한 데이터 조회
SELECT * FROM customer WHERE first_name REGEXP 'K[L-N]';

FRANKLIN : K뒤에 L과 N 사이에 글자가 포함되어 있는 데이터가 조회됨

  • K와 함께 L과 N 사이의 글자를 포함하지 않는 데이터 조회
SELECT * FROM customer WHERE first_name REGEXP 'K[^L-N]';

 

와일드 카드 응용해보기
  1. S로 시작하는 문자열 데이터 중에 A 뒤에 L과 N 사이의 글자가 있는 데이터를 조회
  2. 총 7글자이고, A뒤에 L과 N 사이의 글자가 있고, 마지막 글자는 O인 문자열 데이터 조회
# Q1
SELECT * FROM customer WHERE first_name LIKE 'S%' AND first_name REGEXP 'A[L-N]';

#Q2
SELECT * FROM customer WHERE first_name LIKE '_______' 
	AND first_name REGEXP 'A[L-N]' 
	AND first_name REGEXP 'O$';

 


정리

LIKE에는 %와 _만

그 외 나머지는 REGEXP로 조회하기!

 

참고 : DO it! MySQL로 배우는 SQL 입문(4장 134p ~144p)