本文專題將學習如何在mysql where子句內使用正則表達式來跟好的控制數據過濾。
有關正則表達式介紹
前兩章中的過濾例子允許用匹配、比較和通配操作符尋找數據。對于基本的過濾(或者甚至是某些不那么基本的過濾),這樣就足夠了。但隨著過濾條件的復雜性的增加,where子句本身的復雜性也有不要增加。
這也就是正則表達式變得有用的地方。正則表達式是用來匹配文本的特殊的串(字符集合)。如果你想從一個文本文件中提取出電話號碼,可以使用正則表達式。如果你需要查找名字中間有數字的所有文件,可以使用一個正則表達式。如果你想在一個文板塊中找到所有重復的單詞,可以使用正則表達式。如果你想途歡一個頁面中的所有URL為這些URL的實際html連接,也可以使用正則表達式。
所有又累的程序設計語言、文本編輯器、操作系統等都支持正則表達式。有件事的程序員和網絡管理員已經關注作為他們技術工具重要內容的正則表達式很長時間了。
正則表達式用正則表達式語言來建立,正則表達式語言是用來完成剛討論的所有工作及更多工作的一種特殊語言、與任意語言一樣,正則表達式具有你必須學習的特殊的語法和指令。
既然正則表達式這么有用,那么正則表達式和MySQL有什么關系呢?已經說過,正則表達式的作用是匹配文本,講一個模式(正則表達式)與一個文本串進行比較。MySQL用where子句對正則表達式提供了初步的支持,允許你指定正則表達式,過濾select檢索出的數據。
使用MySQL正則表達式
基本字符匹配
我們從一個非常簡單的例子開始。下面的語句檢索列prod_name包含文本1000的所有行:
select prod_name from products where prod_name regexp ‘1000’ order by prod_name;
除了關鍵字like被regexp替代以外,這條語句看上去非常像使用like的語句。它告訴MySQL:regexp后所跟的東西作為正則表達式(與文字正文1000匹配的一個正則表達式)處理。
為什么要費力地使用正則表達式?在剛才的例子中,正則表達式確實沒有帶來多少好處,不過請考慮下面的例子:
select prod_name from products where prod_name regexp ‘.000’order by prod_name;
這里使用了正則表達式.000。.是正則表達式語言中一個特殊的字符。它表示匹配任意一個字符,因此,1000和2000都匹配且返回
當然,這個特殊的例子也可以用like和通配符來完成。
在like與regexp之間有一個重要的差別。請看下面兩條語句:
select prod_name from products where prod_name like ‘1000’ order by prod_name;
select prod_name from products where prod_name regexp ‘1000’ order by prod_name;
如果執行上述兩條語句,會發現第一條語句不會返回數據,而第二條語句返回一行,為什么?
like匹配整個列。如果被匹配的文本在列值中出現,like將不會找到它,相應的行也不被返回(除非使用通配符)。而regexp在列值內進行匹配,如果被匹配的文本在列值中出現,regexp將會找到它,相應的行將被返回。這是一個非常重要的差別。
那么,regexp能不能用來匹配整個列值,起到與like相同的作用?答案是坑定的,使用^和$定位符即可。