LIKE 操作符 前面介紹的所有操作符都是針對已知值進行過濾的。不管是匹配一 個還是多個值,測試大於還是小於已知值,或者檢查某個範圍的值,共 同點是過濾中使用的值都是已知的。但是,這種過濾方法並不是任何時 候都好用。例如,怎樣搜索產品名中包含文本anvil的所有產品?用簡單 的比較操作符肯定不行,必 ...
LIKE 操作符
前面介紹的所有操作符都是針對已知值進行過濾的。不管是匹配一
個還是多個值,測試大於還是小於已知值,或者檢查某個範圍的值,共
同點是過濾中使用的值都是已知的。但是,這種過濾方法並不是任何時
候都好用。例如,怎樣搜索產品名中包含文本anvil的所有產品?用簡單
的比較操作符肯定不行,必須使用通配符。利用通配符可創建比較特定
數據的搜索模式。在這個例子中,如果你想找出名稱包含anvil的所有產
品,可構造一個通配符搜索模式,找出產品名中任何位置出現anvil的產
品。
通配符(wildcard) 用來匹配值的一部分的特殊字元。
搜索模式(search pattern)由字面值、通配符或兩者組合構
成的搜索條件。
通配符本身實際是SQL的 WHERE 子句中有特殊含義的字元,SQL支持幾
種通配符。為在搜索子句中使用通配符,必須使用 LIKE 操作符。 LIKE
指示MySQL,後跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較。
謂詞 操作符何時不是操作符?答案是在它作為謂詞(predi-
cate)時。從技術上說, LIKE 是謂詞而不是操作符。雖然最終
的結果是相同的,但應該對此術語有所瞭解,以免在SQL文檔
中遇到此術語時不知道
百分號( % )通配符
最常使用的通配符是百分號( % )。在搜索串中, % 表示任何字元出現
任意次數。例如,為了找出所有以詞 jet 起頭的產品,可使用以下 SELECT
語句:
此例子使用了搜索模式 'jet%' 。在執行這條子句時,將檢索任
意以 jet 起頭的詞。 % 告訴MySQL接受 jet 之後的任意字元,不
管它有多少字元
區分大小寫 根據MySQL的配置方式,搜索可以是區分大小
寫的。如果區分大小寫, 'jet%' 與 JetPack 1000 將不匹配
通配符可在搜索模式中任意位置使用,並且可以使用多個通配符。
下麵的例子使用兩個通配符,它們位於模式的兩端
搜索模式 '%anvil%' 表示匹配任何位置包含文本anvil的值,而
不論它之前或之後出現什麼字元。
通配符也可以出現在搜索模式的中間,雖然這樣做不太有用。下麵
的例子找出以 s 起頭以 e 結尾的所有產品:
註意尾空格 尾空格可能會幹擾通配符匹配。例如,在保存詞
anvil 時,如果它 後面有一個或多個空格,則子句 WHERE
prod_name LIKE '%anvil' 將不會匹配它們,因為在最後的 l
後有多餘的字元。解決這個問題的一個簡單的辦法是在搜索模
式最後附加一個 % 。一個更好的辦法是使用函數(第11章將會
介紹)去掉首尾空格
註意NULL 雖然似乎 % 通配符可以匹配任何東西,但有一個例
外,即 NULL 。即使是 WHERE prod_name LIKE '%' 也不能匹配
用值 NULL 作為產品名的行
下劃線( _ )通配符
另一個有用的通配符是下劃線( _ )。下劃線的用途與 % 一樣,但下劃
線只匹配單個字元而不是多個字元
此 WHERE 子句中的搜索模式給出了後面跟有文本的兩個通配
符。結果只顯示匹配搜索模式的行:第一行中下劃線匹配 1 ,
第二行中匹配 2 。 .5 ton anvil 產品沒有匹配,因為搜索模式要求匹配兩
個通配符而不是一個。對照一下,下麵的 SELECT 語句使用 % 通配符,返回
三行產品:
與 % 能匹配0個字元不一樣,_總是匹配一個字元,不能多也不能少
使用通配符的技巧
正如所見,MySQL的通配符很有用。但這種功能是有代價的:通配
符搜索的處理一般要比前面討論的其他搜索所花時間更長。這裡給出一
些使用通配符要記住的技巧。
- 不要過度使用通配符。如果其他操作符能達到相同的目的,應該
使用其他操作符。 - 在確實需要使用通配符時,除非絕對有必要,否則不要把它們用
在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起
來是最慢的。 - 仔細註意通配符的位置。如果放錯地方,可能不會返回想要的數
據。
總之,通配符是一種極重要和有用的搜索工具,以後我們經常會用
到它。
本章介紹了什麼是通配符以及如何在 WHERE 子句中使用SQL通配符,
並且還說明瞭通配符應該細心使用,不要過度使用。