MySQL では、標準の SQL パターンマッチングに加え、vi、grep、sed などの Unix ユーティリティーで使用されるものに似た拡張正規表現に基づくパターンマッチング形式が提供されています。
SQL
パターンマッチングでは、「_
」は任意の
1
文字に一致し、「%
」は任意の数の文字
(0 個の文字も含む) に一致します。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
演算子と NOT
REGEXP
演算子 (または同義語である
RLIKE
と
NOT
RLIKE
) を使用します。
次の表に、拡張正規表現の特徴の一部を示します。
「.
」は任意の
1 文字に一致します。
文字クラス「[...]
」は、括弧内のいずれかの文字に一致します。たとえば、「[abc]
」は「a
」、「b
」、または「c
」に一致します。文字の範囲を指定するには、ダッシュを使用します。「[a-z]
」は任意の英字に一致し、「[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
キーワードを使用して、文字列の 1
つをバイナリ列にします。次のクエリーは、名前の先頭にある小文字の「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 |
+-------+--------+---------+------+------------+-------+
正規表現の構文の詳細については、項7.4.2. 「正規表現」を参照してください。