MySQL では、標準の SQL
のパターンマッチだけでなく、Unix の
vi
、grep
、および
sed
などのユーティリティで使用されているのと同じような、拡張正規表現に基づくパターンマッチも用意されています。
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]
'
は任意の数字に一致する。
‘*
’
は、その前に記述された 1 文字分の表現の
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 |
+--------+--------+---------+------+------------+------------+
MySQL バージョン 3.23.4
より前のバージョンでは、REGEXP
では大文字と小文字が区別されるので、上記のクエリは何も結果を返しません。この場合、大文字または小文字の
‘b
’
のどちらかと照合するには、以下のクエリを使用します。
mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
MySQL 3.23.4
以降のバージョンでは、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 |
+-------+--------+---------+------+------------+-------+
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.