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 で提供されているもう 1 種類のパターンマッチングは、拡張正規表現を使用します。 このタイプのパターンの一致をテストする場合は、REGEXP_LIKE()
関数 (または REGEXP_LIKE()
のシノニムである REGEXP
または RLIKE
演算子) を使用します。
次の表に、拡張正規表現の特徴の一部を示します。
.
は任意の 1 文字に一致します。文字クラス
[...]
は、括弧内のいずれかの文字に一致します。 たとえば、[abc]
はa
、b
またはc
と一致します。 文字の範囲に名前を付けるには、ダッシュを使用します。[a-z]
は任意の文字に一致しますが、[0-9]
は任意の数字に一致します。*
は直前の文字の 0 個以上のインスタンスに一致します。 たとえば、x*
は任意の数のx
文字に一致し、[0-9]*
は任意の数の数字に一致し、.*
は任意の数の任意の数の文字に一致します。正規表現パターン一致は、パターンがテスト対象の値のいずれかと一致する場合に成功します。 (これとは異なり、
LIKE
パターンマッチングは、パターンが値全体に一致する場合のみ成功です。)テストする値の先頭または末尾と一致するようにパターンをアンカーするには、パターンの先頭で
^
を使用するか、パターンの末尾で$
を使用します。
拡張正規表現がどのように機能するかを示すために、前述の LIKE
クエリーは REGEXP_LIKE()
を使用するようにここにリライトされます。
b
で始まる名前を検索するには、^
を使用して名前の先頭と一致させます:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
正規表現の比較を強制的に大/小文字を区別するには、大/小文字を区別する照合を使用するか、BINARY
キーワードを使用して文字列のいずれかをバイナリ文字列にするか、c
一致制御文字を指定します。 これらの各クエリーは、名前の先頭にある小文字の b
のみに一致します:
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs);
SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b');
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');
fy
で終わる名前を検索するには、$
を使用して名前の末尾に一致させます:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '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 REGEXP_LIKE(name, '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 REGEXP_LIKE(name, '^.....$');
+-------+--------+---------+------+------------+-------+
| 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 REGEXP_LIKE(name, '^.{5}$');
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
正規表現の構文の詳細は、セクション12.8.2「正規表現」 を参照してください。