[MySQL] 3.6 데이터 필터링 - LIKE


http://www.mysqltutorial.org 내용을 따라 익히며 정리한 글입니다. 예시에 나오는 데이터셋은 MySQL 샘플 데이터셋인 classicmodels DB입니다.


1. LIKE 소개

LIKE 연산자를 적절히 사용하는건 쿼리 성능 향상에 필수적이다. LIKE 연산자는 패턴에 기반해 데이터를 선택할 때 주로 사용된다. 따라서 WHERE 절이나 SELECT 문에서 자주 쓰인다.

LIKE 연산자는 %, _ 두 가지 특수문자와 함께 사용된다.

  • % : 0개 이상의 문자로 구성된 모든 문자열을 매치시킬 수 있다.
  • _ : 문자 하나를 매치시킬 수 있다.

2. LIKE%

SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
firstName LIKE 'a%';
+----------------+----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+----------+-----------+
| 1143 | Bow | Anthony |
| 1611 | Fixter | Andy |
+----------------+----------+-----------+
2 rows in set (0.00 sec)

LIKE 'a%'를 사용해 이름이 A로 시작하는 사람들을 추려냈다.
비슷한 방법으로 LIKE '%on' 을 사용해 성이 ‘-on’ 으로 끝나는 사람들을 찾아보자.

SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
lastName LIKE '%on';
+----------------+-----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+-----------+-----------+
| 1056 | Patterson | Mary |
| 1088 | Patterson | William |
| 1166 | Thompson | Leslie |
| 1216 | Patterson | Steve |
+----------------+-----------+-----------+
4 rows in set (0.00 sec)

%on 앞뒤로 붙이면 on 이 들어가는 성을 모두 찾을 수 있다.

SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
lastname LIKE '%on%';
+----------------+-----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+-----------+-----------+
| 1056 | Patterson | Mary |
| 1088 | Patterson | William |
| 1102 | Bondur | Gerard |
| 1166 | Thompson | Leslie |
| 1216 | Patterson | Steve |
| 1337 | Bondur | Loui |
| 1504 | Jones | Barry |
+----------------+-----------+-----------+
7 rows in set (0.00 sec)

3. LIKE 와 언더스코어(_)

Tom, Tim 첨 T로 시작하고 m으로 끝나는 세 글자 이름을 가진 사람을 찾으려면 _ 를 사용할 수 있다.

SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
firstname LIKE 'T_m';
+----------------+----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+----------+-----------+
| 1619 | King | Tom |
+----------------+----------+-----------+
1 row in set (0.00 sec)

4. LIKENOT

성이 B로 시작하지 않는 사람들을 추릴때 NOT LIKE 'B%' 를 사용한다. 대소문자 여부는 상관이 없다.

SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
lastName NOT LIKE 'B%';
----------------+-----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+-----------+-----------+
| 1002 | Murphy | Diane |
| 1056 | Patterson | Mary |
| 1076 | Firrelli | Jeff |
| 1088 | Patterson | William |
| 1165 | Jennings | Leslie |
| 1166 | Thompson | Leslie |
| 1188 | Firrelli | Julie |
| 1216 | Patterson | Steve |
| 1286 | Tseng | Foon Yue |
| 1323 | Vanauf | George |
| 1370 | Hernandez | Gerard |
| 1401 | Castillo | Pamela |
| 1504 | Jones | Barry |
| 1611 | Fixter | Andy |
| 1612 | Marsh | Peter |
| 1619 | King | Tom |
| 1621 | Nishi | Mami |
| 1625 | Kato | Yoshimi |
| 1702 | Gerard | Martin |
+----------------+-----------+-----------+
19 rows in set (0.00 sec)

5. LIKEESCAPE

매치시키려는 패턴이 10%_20과 같이 와일드카드 문자를 포함하고 있을 경우 ESCAPE 를 사용해 와일드카드 문자를 일반 문자로 해석하도록 처리할 수 있다. 이스케이프 문자를 명시하지 않으면 \ 백슬래시 문자가 디폴트로 적용된다. 이스케이프 문자는 와일드카드 문자 바로 앞에 넣는다.

SELECT
productCode,
productName
FROM
products
WHERE
productCode LIKE '%\_20%';

$ 와 같은 문자를 이스케이프 문자로 지정할 수도 있다.

SELECT
productCode,
productName
FROM
products
WHERE
productCode LIKE '%$_20%' ESCAPE '$';

LIKE 연산자는 MySQL이 전체 테이블을 스캔하여 일치하는 행을 찾도록 한다. 이는 데이터베이스 엔진이 인덱스를 사용해 빠른 검색을 하지 못하는 결과를 초래한다. 결과적으로 행 수가 많은 테이블에서 데이터를 쿼리할 때 LIKE 연산자를 사용하면 쿼리의 성능이 떨어진다.

© 2019 THE DATASCIENTIST All Rights Reserved.
Theme by hiero