본문 바로가기

데이터베이스

(MySQL) 와일드카드 기반 like 검색과 예시

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

와일드카드, like 검색


Like 검색은

조건 검색을 할 때 특정 column의 데이터가 특정 패턴을 포함하고 있는지 검색할 때 사용합니다.

like검색 사용 시 MySQL에서는 5가지 와일드카드를 이용합니다.

 

MySQL 와일드카드 종류

 

아래 10가지 예시를 통해서 조금 더 쉽게 알아보겠습니다.

 

Select * from customer

 

1. where customerName like ‘a%’

customerName columndataa로 시작하는 모든 것을 찾아내라. 두 번째가 %기호이므로 글자 수 제한이 없기 때문에, 그냥 a만도 가능하고 apple도 가능하고 asaldfkjslkvcxoijewfoijeoisd도 가능하다.

 

2. where customerName like ‘%a’

customerName columndataa로 끝나는 모든 것을 찾아내라. 첫 번째가 % 기호이므로 글자 수 제한이 없기 때문에, 그냥 a만도 가능하고 banana도 가능하고 ldfkjslkvcxoijewfoijeoisda도 가능하다.

 

3. where customerName like ‘%or%’

customerName columndata 중간에 or이 들어가 있는 모든 것을 찾아내라. Or의 앞 뒤가 % 기호이므로 글자 수 제한이 없기 때문에, 그냥 or만도 가능하고 ab or cd도 가능하고, abc or도 가능하고 or abc도 가능하다.

 

4. where customerName like ‘_r%’

customerName columndata , 두 번째 글자로 r이 들어가는 모든 것을 찾아내라. r의 앞에는 _가 하나만 붙어있으므로 r은 반드시 두 번째 글자여야만 하고, 뒤에는% 기호가 있으므로 몇 글자가 오든 상관없다. Arg도 가능하고, ar도 가능하나, abr은 불가능하다.

 

5. where customerName like ‘a_%’

customerName columndata , 첫 번째 글자가 a이고 두 번째 글자가 반드시 존재하는 모든 것을 찾아내라. a의 뒤에는 _가 있으므로 2번째 글자가 반드시 존재해야 하고 그 뒤는 % 이므로 있든 없든 무엇이든 상관없다. a는 불가능하나 ab는 가능하고 abc도 가능하다.

 

6. where customerName like ‘a__%’

customerName columndata , 첫 번째 글자가 a이고 두 번째, 세 번째 글자가 반드시 존재하는 모든 것을 찾아내라. a의 뒤에는 _2개 있으므로 2,3번째 글자가 반드시 존재해야 하고 그 뒤는 % 이므로 있든 없든 무엇이든 상관없다. aab는 불가능하나 abc부터 가능하다.

 

7. where customerName like ‘a%o’

customerName columndata , 첫 번째 글자가 a이고 마지막 글자가 o인 모든 것을 찾아라. 가운데는 %가 있으므로 있든 없든 몇 자이든 상관없다. ao도 가능하고 abo도 가능하다.

 

8. where customerName like ‘a[bc]d’

customerName columndata , 첫 번째 글자가 a이고 마지막 글자가 d인 것 중, 사이에 bc가 포함된 모든 것을 찾아라. acd, abd는 찾으나 aod는 찾지 않는다.

 

9. where customerName like ‘a[^bc]d’

customerName columndata , 첫 번째 글자가 a이고 마지막 글자가 d인 것 중, 사이에 bc가 미포함된 모든 것을 찾아라. aod는 찾으나.는찾으나 acd, abd는 찾지 않는다.

 

10. where customerName like ‘a[b-d]z’

customerName columndata , 첫 번째 글자가 a이고 마지막 글자가 z인 것 중, 사이에 b부터 c, d 중 하나라도 포함된 것을 찾아라. acz, adz는 찾으나 aez는 찾지 않는다.


주의점

RDB는 검색에 최적화된 DB입니다. 그런 만큼 검색을 할 일이 있는 column에 대해서는 반드시 index를 달아주고 이를 이용합니다. 그런데 와일드카드를 이용한 검색을 할 시 의도와는 다르게 조건에 따라서 index를 사용하는 경우도 있고 아닌 경우도 있습니다.

 

예를 들어 %abc와 abc%는 검색 방식이 다릅니다. abc%는 맨 앞 3글자가 정해져 있기 때문에 인덱스를 활용하여 검색을 하는 반면에, 와일드카드가 맨 앞에 온 경우에는 full-scan을 통해 데이터를 검색하게 됩니다. 엄청난 성능 저하가 있을 수 있기 때문에 와일드카드를 이용한 검색 쿼리를 구성할 때 주의가 필요합니다.

 

또한 와일드카드를 이용하면 NULL값이 들어간 데이터는 검색이 불가능합니다. 이 또한 쿼리를 구성할 때 신경 써야 할 부분입니다.

 

와일드카드는 이렇게 한 줄로 정리할 수 있을 것 같습니다. ‘자유에는 책임이 따른다’. 와일드카드를 이용한 검색으로 개발자는 편리하게 검색을 할 수 있을지 몰라도, 경우에 따라 의도와 다른 데이터가 검색된다던가 검색이 안된다던가, full-scan을 한다던가 하는 상황이 있을 수 있기 때문에 쿼리를 짤 때 주의해야 할 것입니다.


 

MySQL에서의 와일드카드 기반 like검색에 대해서 알아보았습니다.

 

참고출처

https://www.w3schools.com/sql/sql_like.asp

https://velog.io/@datata29/SQL-%EC%99%80%EC%9D%BC%EB%93%9C-%EC%B9%B4%EB%93%9C-%EB%AC%B8%EC%9E%90%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%95%84%ED%84%B0%EB%A7%81

'데이터베이스' 카테고리의 다른 글

(MySQL) 데이터 타입  (1) 2021.05.12
(MySQL) Index 개념과 종류  (0) 2021.05.12
트랜잭션 ACID  (0) 2021.05.12
모델링 개념  (0) 2021.05.12
MySQL 트랜잭션 개념과 예제  (0) 2021.04.14