MYSQLモードマッチング:REGEXPとlikeの使い方


likeはデータ全体をマッチングする必要がありますが、REGEXPは部分的にマッチングするだけです.、
つまり、Likeでは、このフィールドのすべての内容が条件を満たす必要がありますが、REGEXPでは、いずれかのフラグメントが満たされるだけです.
 
MySQLは、標準的なSQLモードマッチング(like)と、vi、grep、sedなどのUnixユーティリティに基づく拡張正規表現モードマッチングのフォーマット(regexp)を提供します.
SQLのパターンマッチングでは「」を使用できます任意の1文字に一致し、「%」は任意の数の文字(ゼロ文字を含む)に一致します.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文字の名前を見つけるために""を使いますパターン文字: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|+----+-------+---------------+------------------------+------------------------+------------+----+----+----+----+その他のマッチングは正規表現に基づいている.このようなパターンをマッチングテストする場合は、REGEXPおよびNOT REGEXPオペレータ(または、同義語であるRLIKEおよびNOT RLIKE)を使用します.
 
“.”任意の文字を一致させます.文字クラス[...]かっこ内の任意の文字に一致します.例えば、「abc」は、「a」、「b」または「c」に一致する.文字の範囲を指定するには、"-"を使用します.「[a-z]」は任意の小文字に一致し、「[0-9]」は任意の数字に一致します.「*」は、その前に0つ以上あるものに一致します.たとえば、「x*」は任意の数の「x」文字に一致し、「[0-9]*」は任意の数の数字に一致し、「.*」は任意の数の任意のものに一致します.正規表現は大文字と小文字を区別しますが、希望する場合は、1つの文字クラスを使用して2つの書き方に一致することができます.たとえば、「[aa]」は小文字または大文字の「a」に、「[a-zA-Z]」は2つの書き方の任意のアルファベットに一致します.
テストされた値のどこにでも表示される場合、モードは一致します(値全体が一致する限り、SQLモードは一致します).テストされた値の開始または終了に一致するようにモードを位置決めするには、モードの開始に「^」を使用するか、モードの終了に「$」を使用します.拡張正規表現がどのように機能するかを説明するために、上記のLIKEクエリは、以下でREGEXPを使用して書き換えられます.
「b」で始まる名前を見つけるには、「^」で名前の始まりに合わせ、「[bB]」で小文字または大文字の「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」で終わる名前を見つけるために、「$」を使って名前の末尾をマッチングします.name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+
 
「w」を含む名前を見つけるには、「[wW]」を使用して小文字または大文字に一致する「w」:mysql>SELECT*FROM pet WHERE name REGEXP「[wW]」;+----------------------------+-----------------------------------+-----------------------------------+---------------------+|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 |+----------+-------+---------+------+------------+------------+
 
ソース:http://www.webjx.com/database/mysql-32809.html
例:
 
1.基本文字照合
 
REGEXP後に続くものを正規表現として扱う.
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;

------  ------
+------------------------+
|    prod_name    |
+------------------------+
|  JetPack 1000  |
+------------------------+

 
.は、いずれかの文字に一致することを示します.
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;

------------  -----------

+-------------------------+
|     prod_name    |
+-------------------------+
|   JetPack 1000  |
|   JetPack 2000  |
+-------------------------+
 
MySQLの正規表現の一致は大文字と小文字を区別しません.
大文字と小文字を区別するには、BINARYキーを使用します.
例えば:WHERE prod_name REGEXP BINARY 'JetPack .000'
 
2.OR照合を行う
2つの列の1つ(またはこの列、または別の列)を検索するには、|を使用します.
|ORオペレータとして、いずれかに一致することを示します.OR条件は2つ以上与えられます.
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000 | 2000'
ORDER BY prod_name;

------------  ------------

+----------------------+
|  prod_name   |
+----------------------+
| JetPack 1000 |
| JetPack 2000 |
+----------------------+

 
[]任意の文字を一致させます.
1または2または3に一致する文字のセットを定義する.
[]は別の形式のOR文であり、[123]Tonは[1|2|3]Tonの略である.
^文字セットを否定し、指定した文字以外のものに一致します.[^123]は、これらの文字以外のものと一致します.
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;

-------------  ------------

+--------------------+
| prod_name   |
+--------------------+
| 1 ton anvil    |
| 2 ton anvil    |
+--------------------+

 
一致範囲
[0123456789]または[0-9]は、0から9の数字に一致します.
[a-z]任意のアルファベット記号を一致させる
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] Ton'
ORDER BY prod_name;

----------  -----------

+-------------------+
|  prod_name |
+-------------------+
|  .5 ton anvil  |
|  1 ton anvil   |
|  2 ton anvil   |
+-------------------+

 
特殊文字の一致
\が先頭です.すなわち転義する正規表現内の特殊な意味を持つすべての文字は、このように変換する必要があります.
\-は検索を表します-
\\. 検索を表す
SELECT prod_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;

-------------  -------------

+----------------------+
|  vend_name   |
+----------------------+
|  Furball Inc.    |
+----------------------+

 
 
\は、メタ文字(特殊な意味を持つ文字)を参照するためにも使用されます.
\\f      
\
\\r \\t \\v

 
一致文字クラス
[:a;num:]           (  [a-zA-Z0-9])
[:alpha:]         (  [a-zA-Z])
[:blank:]          (  [\\t])
[:cntrl:]        ASCII    (ASCII 0 31 127)
[:digit:]           ( [0-9])
[:graph:]     ["print:]   ,      
[:lower:]            (  [a-z])
[:print:]               
[:punct:]          [:alnum:]     [:cntrl:]       
[space:]                    (  [\\f\
\\t\\r\\v]) [:upper:] ( [A-Z]) [:xdigit:] ( [a-fA-F0-9])

 
複数のインスタンスを一致させる
                   
*                       0      
+                      1      (   {1, })
?                      0  1   (   {0, 1})
{n}                           
{n, }                            
{n ,m}                       (m   255)

 
以下の例:s後の?sをオプションにします.なぜなら?前の任意の文字に一致する0回または1回が表示されます.
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY prod_name;

------------  ------------

+-----------------------+
|  prod_name    |
+-----------------------+
|  TNT (1 stick)   |
|  TNT (5 sticks) |
+-----------------------+
 
常に4桁の数字にマッチ:WHERE prod_name REGEXP '[[:digit:]]{4}'
ロケータ
^              
$             
[[:<:]]      
[[:>:]]      
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;

-----------  ----------

+---------------------+
|   prod_name  |
+---------------------+
|  .5 ton anvil   |
|  1 ton anvil    |
|  2 ton anvil    |
+---------------------+
 
^の二重用途:集合において([]で定義)、その集合を否定する.そうでなければ、列の開始とを指します.
LIKEは列全体にマッチし、REGEXPはサブ列にマッチする.
単純な正規表現テストでは、データベースを使用せずにSELECTを使用して正規表現をテストできます.
REGEXPチェックは常に0(一致なし)または1(一致)を返し、文字列付きREGEXPで測定できます.
式を試し、それらを試します.対応する構文は次のとおりです.
        SELECT 'hello' REGEXP '[0-9]'
この例は0を返します(テキストhelloに数字がないため).
 
原文:http://www.cnblogs.com/way_testlife/archive/2010/09/17/1829567.html