MySQL 8.0 リファレンスマニュアル


3.3.4.7 パターンマッチング

MySQL では、標準の SQL パターンマッチングに加え、vigrepsed などの 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]ab または 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「正規表現」 を参照してください。


関連キーワード:  一致, 文字, パターン, 名前, パターンマッチング, FROM, WHERE, REGEXP, dog, 任意