MySQL

문자열 패턴 매칭

mintuchel 2024. 9. 16. 20:40

문자열에 대한 패턴 매칭 기법을 알아보자.

단일 패턴 매칭 LIKE

복수 패턴 매칭 REGEXP

포함 여부 확인 WHERE IN

등이 있다


[LIKE : 단일 패턴 매칭]

 
LIKE 연산자는 '%'랑 같이 사용됨

WHERE OPTIONS = '%가죽시트%'

 
위와 같이 % 랑 = 을 같이 쓰면 안됨!
% 쓰면 무조건 LIKE랑 같이 써야함

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog' AND NAME LIKE '%el%'
ORDER BY NAME

 
이때, 복수개의 특정 문자를 포함하는 데이터를 검색하기 위해서 OR연산자를 사용해야한다.

따라서 여러개의 LIKE를 사용해야할때에는 REGEXP로 정규표현식 필터링을 사용하면 좋다.
 


[REGEXP : 복수 패턴 매칭]

 

아래와 같이 여러개의 LIKE를 쓰면 굉장히 난잡해진다.

SELECT CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%가죽시트%' OR OPTIONS LIKE '%열선시트%' OR OPTIONS LIKE '%통풍시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC

 

이러한 경우 REGEXP 연산자를 사용하면 좋다.
 

REGEXP 연산자는 LIKE보다 복잡한 패턴을 검색 할때 사용한다
 
복수개의 특정 문자를 포함하는 데이터 검색 (특정 문자열을 '|' 를 기준으로 나눈다)


SELECT [필드명] FROM [테이블명] WHERE [필드명] REGEXP '특정 문자열1|특정 문자열2'

SELECT CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC;

 
이때 | 양옆에 공백을 놔두면 안되는게 그럼 진짜로 공백이 들어간 놈을 검색하기 때문이다 
 


[NULL 조건]

IS NULL
IS NOT NULL
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN, 'N') AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE "경기도%"
ORDER BY WAREHOUSE_ID ASC;

 
NULL이면 10으로 치고 평균구하기

SELECT ROUND(AVG(IFNULL(LENGTH,10)),2) AS AVERAGE_LENGTH
FROM FISH_INFO

 


[WHERE IN : 포함 여부 확인]

[IN 절 사용 : 집합 내 존재성 확인]

 
1. IN 특정 집합 내 원소

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy','Ella','Pickle','Rogan','Sabrina','Mitty')
ORDER BY ANIMAL_ID

 

SELECT * FROM product 
WHERE 카테고리 = '신발' OR 카테고리 = '가전' OR 카테고리 = '식품'

SELECT * FROM product 
WHERE 카테고리 IN ('신발', '가전, '식품')

 
OR 여러개보다 IN 절 쓰는게 성능이 훨씬 좋음!
 
2. IN 특정 테이블 내 칼럼값
 
IN () 쓰면 괄호 안에 SELECT 또 사용할 수 있음!

WITH IT AS (
    SELECT DISTINCT PARENT_ITEM_ID
    FROM ITEM_TREE
    WHERE PARENT_ITEM_ID IS NOT NULL
)

SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (SELECT PARENT_ITEM_ID FROM IT)
ORDER BY ITEM_ID DESC