MySQL使用SELECT語句的WHERE子句指定搜索條件。
使用WHERE子句
數(shù)據(jù)庫表一般包含大量的數(shù)據(jù)砸烦,有時我們可能只需要檢索表中的一部分數(shù)據(jù)弃鸦,只檢索所需數(shù)據(jù)需要指定搜索條件(search criteria),搜索條件也稱為過濾條件(filter condition)幢痘。
WHERE 子句在表名(FROM子句)之后給出唬格。
SELECT name, price
FROM products
WHERE price = 2.50;
這條語句從products表中檢索兩個列,但是是不返回所有行颜说,只返回price值為2.50的行购岗。如下所示:
+---------+-----------+
| name | price |
+---------+-----------+
| Carrots | 2.50 |
| TNT | 2.50 |
+---------+-----------+
$在同時使用ORDER BY和WHERE 子句時,應該讓ORDER BY位于WHERE 之后门粪,否則會產生錯誤$
WHERE子句操作符
--------------------------------------------
操作符 說明
--------------------------------------------
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 在指定的兩個值之間
----------------------------------------------
檢查單個值
SELECT name, price
FROM products
WHERE name='fuses';
輸出如下:
+---------+-----------+
| name | price |
+---------+-----------+
| Fuses | 3.42 |
+---------+-----------+
檢查WHERE name='fuses'語句喊积,它返回name的值為Fuses的一行,MySQL在執(zhí)行匹配時不區(qū)分大小寫玄妈,所以fuses與Fuses匹配
不匹配檢查
以下例子列出不是由供應商1003制造的所有產品
SELECT id, name
FROM products
WHERE id <> 1003;
輸出如下:
+---------+-----------+
| id | name |
+---------+-----------+
| 1001 | Fuses1 |
| 1002 | Fuses2 |
| 1004 | Fuses4 |
| 1005 | Fuses5 |
+---------+-----------+
PS:在使用WHERE子句時乾吻,單引號用來限定字符串髓梅。如果將值與串類型的列進行比較,則需要限定引號溶弟;如果與數(shù)值列進行比較的值不用引號
以下語句和上面的例子相同
SELECT id, name
FROM products
WHERE id != 1003;
范圍值檢查
為了檢查某個范圍的值女淑,可以使用BETWEEN操作符。
下面的例子說明如何使用BETWEEN操作符辜御,它檢索價格在5美元和10美元之間的所有產品鸭你。
SELECT name, price
FROM products
WHERE price BETWEEN 5 AND 10;
結果如下所示:
+---------+-----------+
| name | price |
+---------+-----------+
| Fuses1 | 5.42 |
| Fuses4 | 6.12 |
| Fuses3 | 7.92 |
| Fuses2 | 9.42 |
+---------+-----------+
PS:在使用BETWEEN時,必須指定兩個值擒权,這兩個值必須用AND關鍵字分隔袱巨。
空值檢查
NULL 無值(no value),他與字段包含0碳抄,空字符串或僅僅包含空格不同愉老。
SELECT語句有一個特殊的WHERE子句 IS NULL,它用來檢查具有NULL值得列
SELECT name
FROM products
WHERE price IS NULL;
這條語句返回沒有價格(空price字段剖效,不是價格為0)的所有產品嫉入,由于表中沒有這樣的行所以沒有返回行
NULL 與不匹配 在通過過濾選擇出不具有特定值得行時,你可能希望返回具有NULL值的行璧尸。但是咒林,不行。因為位置具有特殊的含義爷光,數(shù)據(jù)庫不知道他們是否匹配所以在匹配過濾或不匹配過濾時不返回它們垫竞;
因此,過濾數(shù)據(jù)時蛀序,一定要驗證返回數(shù)據(jù)中確實給出了被過濾列具有NULL的行欢瞪。
數(shù)據(jù)過濾
組合WHERE子句
AND
為了進行更強的過濾控制,MySQL允許給出多個WHERE子句徐裸,這些子句可以兩種方式使用:以AND子句的方式或OR子句的方式使用遣鼓。
SELECT id, price, name
FROM products
WHERE id=1003 AND price<=10;
此SQL語句檢索由供應商1003制造且價格小于等于10美元的所有產品的名稱和價格
ADN 用在WHERE子句中的關鍵字,用來指示檢索滿足所有給定條件的行重贺。
OR
SELECT id, price, name
FROM products
WHERE id=1003 OR id=1002;
次SQL語句檢索由任一指定供應商創(chuàng)造的所有產品的產品的名字和價格譬正。
OR WHERE 子句中使用的關鍵字,用來表示檢索匹配任一給定條件的行檬姥。
計算次序
WHERE 可以包含任意數(shù)目的AND和OR操作符。允許兩者結合以進行復雜和高級的過濾粉怕。
但是由于AND和OR的優(yōu)先級不同健民,AND的優(yōu)先級要高于OR的優(yōu)先級,所以在同時使用AND和OR時贫贝,要給OR加括號
例如:
SELECT id, price, name
FROM products
WHERE (id=1003 OR id=1002) AND price >= 10;
IN 操作符
圓括號在WHERE子句中還有另一種用法秉犹。IN操作符用來指定條件范圍蛉谜,范圍內的每個條件都可以進行匹配。IN取合法值的由逗號分隔的清單崇堵,全部都在圓括號中。
SELECT id, price, name
FROM products
WHERE id IN (1002, 1003)
ORDER BY name;
次語句檢索供應商1002和1003創(chuàng)造的所有產品鸳劳。
IN操作符后跟由逗號分隔的合法值清單狰贯,整個清單必須括在圓括號中。
IN 操作符的優(yōu)點:
- 在使用長的合法選項清單時,IN操作符的語法更清楚且直觀摸柄。
- 在使用IN時跃脊,計算的次序更容易管理(因為使用的操作符更少)
- IN操作符一般比OR操作符清單執(zhí)行更快
- IN的最大優(yōu)點是可以包含其他SELECT語句匾乓,使得能夠更動態(tài)的建立WHERE子句拼缝。
IN WHERE子句中用來指定要匹配的清單的關鍵字任斋,功能與OR相當墨辛。
NOT 操作符
NOT WHERE 子句中用來否定后跟條件的關鍵字凿渊。
下面的例子敛纲,列出除了1002和1003之外的所有供應商制造的產品淤翔。
SELECT id, price, name
FROM products
WHERE id NOT IN (1002, 1003)
ORDER BY name;
LIKE 操作符
百分號(%)通配符
最常使用的通配符是百分號(%),在搜索串中佩谷,%表示任何字符出現(xiàn)任意次數(shù)旁壮。例如,為了找出所有以詞jet起頭的產品谐檀,可以使用SELECT語句:
SELECT id, name
FROM products
WHERE name LIKE 'jet%';
通配符可以在搜索模式中任一位置使用抡谐,并且可以使用多個通配符。
SELECT id, name
FROM products
WHERE name LIKE '%anvil%';
搜索模式‘%anvil%’表示匹配任何位置包含文本anvil的值桐猬,而不論它之前或者之后出現(xiàn)什么字符
重要的是要注意到麦撵,除了一個或多個字符外,%還能匹配0個字符溃肪。%代表搜索模式中給定位置的0個免胃,1個,或者多個字符惫撰。
注意尾空格 尾空格可能會干擾通配符羔沙。例如,在保存詞anvil時厨钻,如果它后面有一個或多個空格扼雏,則子句WHERE name LIKE '%anvil'將不會匹配他們,因為在最后的l后面有多余的字符夯膀。解決這個問題的一個簡單辦法是在搜索模式最后附加一個%或者使用函數(shù)
%不能匹配NULL
下劃線(_)通配符
下劃線的用途與%一樣诗充,但是下劃線只匹配單個字符而不是多個字符。
SELECT id, name
FROM products
WHERE name LIKE '_ ton anvil';
顯示效果如下:
+---------+-----------------+
| id | name |
+---------+-----------------+
| 1001 | .5 ton anvil |
| 1002 | 1 ton anvil |
| 1004 | 2 ton anvil |
+---------+-----------------+
與%能匹配0個字符不一樣诱建,_總是匹配一個字符其障,不能多也不能少