3.3.4.7 패턴 매칭
MySQL은 표준 SQL 패턴 매칭 외에도 vi, grep, sed 등의 Unix 유틸리티에 사용되는 것과 유사한 확장 정규식 기반 패턴 매칭 형식이 제공되고 있습니다.
SQL 패턴 매칭을 사용하면 " _
"임의의 단일 문자" %
"로 임의의 수의 문자 (제로 문자 포함)에 일치시킬 수 있습니다. MySQL의 기본적으로 SQL 패턴은 대소 문자를 구분하지 않습니다. 다음은 몇 가지 예입니다. SQL 패턴을 사용할 때 =
또는 <>
는 사용하지 않습니다. 대신 LIKE
또는 NOT LIKE
비교 연산자를 사용합니다.
" b
"로 시작하는 이름을 찾으려면 :
mysql> SELECT * FROM pet WHERE name LIKE 'b%';
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
' fy
'로 끝나는 이름을 찾으려면 :
mysql> SELECT * FROM pet WHERE name LIKE '%fy';
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
" w
"를 포함하는 이름을 찾으려면 :
mysql> SELECT * FROM pet WHERE name LIKE '%w%';
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
다만 5 문자의 이름을 찾으려면 " _
"패턴 문자의 5 개의 인스턴스를 사용합니다.
mysql> SELECT * FROM pet WHERE name LIKE '_____';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
MySQL에서 제공되는 다른 종류의 패턴 매칭은 확장 정규 표현식을 사용합니다. 이 유형의 패턴 일치를 테스트하려면 REGEXP
연산자와 NOT REGEXP
연산자 (또는 동의어이다 RLIKE
와 NOT RLIKE
)를 사용합니다.
다음 표에서는 확장 정규 표현식의 특징의 일부를 보여줍니다.
"
.
"는 단일 문자와 일치합니다.문자 클래스 "
[...]
"는 괄호 안의 문자 중 하나와 일치합니다. 예를 들어, "[abc]
"는"a
","b
"또는"c
"와 일치합니다. 문자의 범위를 지정하려면 대시를 사용합니다. "[az]
"는 임의의 문자와 일치합니다"[0-9]
"는 임의의 숫자와 일치합니다."
*
"는 이전 문자의 0 개 이상의 인스턴스와 일치합니다. 예를 들어, "x*
'는 임의의 숫자 "x
"문자와 일치합니다"[0-9]*
'는 임의 개수의 숫자와 일치 ".*
"는 임의의 수의 문자로 일치합니다.REGEXP
패턴 매칭은 테스트 값의 어떤 부분에 패턴이 일치하면 성공입니다. (이와 달리LIKE
패턴 매칭은 패턴이 전체 값과 일치하는 경우에만 성공합니다.)테스트 값의 시작 또는 끝 부분에 패턴이 일치하도록 지정하려면 패턴의 맨 위에 "
^
"또는 패턴의 끝에"$
"를 사용합니다.
확장 정규 표현식이 어떻게 동작하는지 확인하기 위해 앞의 LIKE
쿼리를 REGEXP
에서 재작 성을 보여줍니다.
" b
"로 시작하는 이름을 찾으려면" ^
"를 사용하여 이름 앞에 일치하도록 지정합니다.
mysql> SELECT * FROM pet WHERE name REGEXP '^b';
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
REGEXP
비교에서 대문자와 소문자를 구별하려면 BINARY
키워드를 사용하여 문자열 중 하나를 이진 문자열합니다. 다음 쿼리는 이름 앞에있는 소문자 " b
"만큼 일치합니다.
mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b';
' fy
'로 끝나는 이름을 찾으려면 " $
"를 사용하여 이름 끝에 일치하도록 지정합니다.
mysql> SELECT * FROM pet WHERE name REGEXP 'fy$';
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
" w
"를 포함하는 이름을 찾으려면 다음 쿼리를 사용합니다.
mysql> SELECT * FROM pet WHERE name REGEXP 'w';
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
정규 표현식 패턴은 값의 어떤 부분에 찾으면 일치하기 때문에이 쿼리는 SQL 패턴을 사용하는 경우처럼 패턴의 양쪽에 와일드 카드를 추가하여 패턴을 전체 값과 일치시킬 필요는 없습니다 .
다만 5 문자의 이름을 찾으려면 " ^
"와" $
"를 사용하여 이름의 시작과 끝이 일치하도록 지정하고 사이에" .
"를 5 개 사용합니다.
mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
이 쿼리는
( " { n }
n
번 반복 ") 연산자를 사용하여 설명 할 수 있습니다.
mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
섹션 12.5.2 "정규 표현식" 에서 정규 표현식 구문에 대해 자세히 설명하고 있습니다.