到目前為止,我們講解的資料方式都是針對特定值的過濾,比如「檢索所有年齡為25的所有員工資訊」、「檢索所有工資助2500元~3800元之間的所有記錄」,但是這種過濾方式並不能滿足一些模糊的過濾方式。
比如檢索所有姓名中含有「th」員工或者檢索所有姓「王」的員工,實現這樣的檢索操作必須使用萬用字元進行過濾。
sql中的萬用字元過濾使用like關鍵字,可以向使用or、and等操作符一樣使用它,它是乙個二元操作符,左表示式為待匹配的字段,而右表示式為待匹配的萬用字元表示式。萬用字元表示式由萬用字元和普通字元組成,主流資料庫支援的萬用字元有單字元匹配
和多字元匹配
,有的資料庫系統還支援集合匹配(ms-sqlserver)。
1. 單字元匹配
進行單字元匹配的萬用字元為半形下劃線「_」, 它匹配單個出現的字元。
比如,萬用字元表示式「b_d」匹配第乙個字元為b、第二字元為任意字元、第三個字元為d的字串,「bed」、「bad」都能匹配這個表示式,而「bd」、「abc」、「build」等則不能匹配這個表示式;萬用字元表示式「_oo_」匹配第乙個字元為任意字元、第二字元為o、第三個字元為o、第四個字元為任意字元的字串,「look」、「took」、「cool」都能匹配這個表示式,而「rom」、「todo」等則不能匹配這個表示式。
下面來演示一下單字元匹配的用法。我們來檢索t_employee表中fname欄位匹配如下規則的資料行:
以任意字元開頭,剩餘部分為「erry」。根據萬用字元表示式語法,我們可知這個匹配規則對應的萬用字元表示式為「_erry」,因此編寫如下的sql:
select * from t_employee where fname like '_erry'
+---------+-------+------+---------+
| fnumber | fname | fage | fsalary |
+---------+-------+------+---------+
| dev002 | jerry | 28 | 2300.00 |
+---------+-------+------+---------+
"jerry"能夠匹配萬用字元表示式「_erry」所以被顯示到了結果集中,而其他資料則由於不撇皮茨萬用字元表示式,所以被過濾掉了。
單字元匹配在萬用字元表示式中可以出現多次,比如我們要檢索長度為4、第三個字元為「n」、其他字元為任意字元的姓名。根據萬用字元表示式語法可知這個匹配規則對應的萬用字元表示式為「__n_」(注意前兩個字元為連續的兩個下劃線),那麼需要編寫如下的sql:
select * from t_employee where fname like '__n_'
+---------+-------+------+---------+
| fnumber | fname | fage | fsalary |
+---------+-------+------+---------+
| hr001 | jane | 23 | 4300.00 |
| hr002 | tina | 25 | 3300.00 |
+---------+-------+------+---------+
2. 多字元匹配
使用下劃線可以實現「匹配長度為5、以ab開頭、剩餘字元任意」的功能,而對於「匹配以k開頭,長度不限,剩餘字元任意」這樣的需求則無法滿足,這時就需要使用多字元匹配了。進行多字元匹配的萬用字元為半形百分號「%」,它匹配任意次數(零個或者多個
)出現的任意字元。比如萬用字元表示式"k%"匹配以k開頭、任意長度的字串,「k」、「kerry」、「kb」都能匹配這個表示式,而「ark」、「luck」、「3kd」等不能匹配這個表示式;萬用字元表示式「b%t」匹配以b開頭、以t結尾、任意長度的字串,「but」、「bt」、「belt」都能匹配這個表示式,而「turbo」、「tube」、「tb」等不能匹配表示式。
下面來演示一下多字元匹配的用法。我們來檢索t_employee表中fname欄位匹配如下規則的資料行:
1) 以「t」開頭長度,長度不限。根據萬用字元表示式語法,我們可以知這個匹配規則對應的萬用字元表示式為「t%」,因此編寫如下的sql:
select * from t_employee where fname like 't%'
+----------+-------+------+---------+
| fnumber | fname | fage | fsalary |
+----------+-------+------+---------+
| dev001 | tom | 25 | 8300.00 |
| hr002 | tina | 25 | 3300.00 |
| sales001 | timmy | 25 | 5300.00 |
+----------+-------+------+---------+
2) 接下來我們檢索姓名中包含字母"n"的員工的資訊,編寫如下sql:
select * from t_employee where fname like '%n%'
+----------+-------+------+---------+
| fnumber | fname | fage | fsalary |
+----------+-------+------+---------+
| hr001 | jane | 23 | 4300.00 |
| hr002 | tina | 25 | 3300.00 |
| sales002 | stone | 35 | 8300.00 |
+----------+-------+------+---------+
3)單字元匹配和多字元還可以一起使用。我們來檢索t_employee表中fname欄位匹配如下規則的資料行:
最後乙個字元為任意字元、倒數第二個字元為n、長度不限的字串。
根據萬用字元表示式語法,我們可以知道這個匹配規則對應的萬用字元表示式為「%n_」,因此編寫如下的sql:
select * from t_employee where fname like '%n_'
+----------+-------+------+---------+
| fnumber | fname | fage | fsalary |
+----------+-------+------+---------+
| hr001 | jane | 23 | 4300.00 |
| hr002 | tina | 25 | 3300.00 |
| sales002 | stone | 35 | 8300.00 |
+----------+-------+------+---------+
4)
配合and與or使用
檢索t_employee表中fname欄位匹配:以s或j開頭,長度不限。
select * from t_employee where fname like 's%' or fname like 'j%'
不以s或j開頭,長度不限。
select * from t_employee where fname not(fname like 's%' and fname like 'j%')
萬用字元過濾是乙個非常強大的功能,不過在使用萬用字元過濾進行檢索的時候 ,
資料庫系統會對全表進行掃瞄,所以執行速度非常慢。因此不要過多使用萬用字元過濾
SQL 3 高階資料過濾 4 多值檢測
例1 公司要為年齡為23歲 25歲和28歲的員工發福利,請將他們的年齡 工號和姓名檢索出來 要完成這樣的功能,我們可以使用or語句來連線多個等於判斷。sql語句如下 select fage,fnumber,fname from t employee where fage 23 or fage 25 ...
SQL 3 高階資料過濾 2 空值檢測
沒有新增非空約束列是可以為空值的 也就是null 有時我們需要對空值進行檢測,比如要查詢所有姓名未知的員工資訊。既然null代表空值,有開發人員試圖通過下面的sql語句來實現 select from t employee where fname null 這個語句是可以執行的,不過執行以後我們看不到...
SQL學習之高階資料過濾
一 高階資料過濾之in操作符 in 操作符用來指定條件範圍,範圍中的每個條件都可以進行匹配。in取一組由逗號分隔 括在圓括號中的合法值。如下 select itemid,itemname,checkvaluenum,checkvaluestring,resultlevel from t check ...