MySQL WHERE:條件查詢
在使用 mysql SELECT語句時,可以使用 WHERE 子句來指定查詢條件,從 FROM 子句的中間結果中選取適當的數據行,達到數據過濾的效果。
語法格式如下:
判定運算的語法分類如下:
【實例 2】查詢年齡小于 22 的學生的姓名,輸入的 SQL 語句和執行結果如下所示。
可以使用 AND 連接兩個甚至多個查詢條件,多個條件表達式之間用 AND 分開。
【實例 3】在 tb_students_info 表中查詢 age 大于 21,并且 height 大于等于 175 的學生的信息,輸入的 SQL 語句和執行結果如下所示。
相互間進行匹配運算的對象可以是 CHAR、VARCHAR、TEXT、DATETIME 等數據類型。運算返回的結果是 TRUE 或 FALSE。
利用通配符可以在不完全確定比較值的情形下創建一個比較特定數據的搜索模式,并置于關鍵字 LIKE 之后??梢栽谒阉髂J降娜我馕恢檬褂猛ㄅ浞?,并且可以使用多個通配符。MySQL 支持的通配符有以下兩種:
使用百分號通配符要注意以下幾點:
【實例 6】在 tb_students_info 表中,查找所有以字母“y”結尾,且“y”前面只有 4 個字母的學生的姓名,輸入的 SQL 語句和執行結果如下所示。
BETWEEN AND 用來查詢某個范圍內的值,該操作符需要兩個參數,即范圍的開始值和結束值,若字段值滿足指定的范圍查詢條件,則這些記錄被返回。
【實例 7】在表 tb_students_info 中查詢注冊日期在 2016-01-01 之前的學生的信息,輸入的 SQL 語句和執行結果如下所示。
語法格式如下:
WHERE <查詢條件> {<判定運算1>,<判定運算2>,…}
其中,判定運算其結果取值為 TRUE、FALSE 和 UNKNOWN。判定運算的語法分類如下:
-
<表達式1>
{=|<|<=|>|>=|<=>|<>|!=}
<表達式2> -
<表達式1>
[NOT]LIKE
<表達式2> -
<表達式1>
[NOT][REGEXP|RLIKE]
<表達式2> -
<表達式1>
[NOT]BETWEEN
<表達式2>AND
<表達式3> -
<表達式1>
IS[NOT]NULL
單一條件的查詢語句
【實例 1】在表 tb_students_info 中查詢身高為 170cm 的學生的姓名,輸入的 SQL 語句和行結果如下所示。mysql> use test_db Database changed mysql> SELECT name,height -> FROM tb_students_info -> WHERE height=170; +-------+--------+ | name | height | +-------+--------+ | Susan | 170 | +-------+--------+ 1 row in set (0.17 sec)該語句采用了簡單的相等過濾,查詢一個指定列 height 的具體值 170。
【實例 2】查詢年齡小于 22 的學生的姓名,輸入的 SQL 語句和執行結果如下所示。
mysql> SELECT name,age -> FROM tb_students_info -> WHERE age<22; +------+------+ | name | age | +------+------+ | John | 21 | +------+------+ 1 row in set (0.05 sec)可以看到,查詢結果中所有記錄的 age 字段的值均小于 22 歲,而大于或等于 22 歲的記錄沒有被返回。
多條件的查詢語句
使用 SELECT 查詢時,可以增加查詢的限制條件,這樣可以使查詢的結果更加精確。MySQL 在 WHERE 子句中使用 AND 操作符限定只有滿足所有查詢條件的記錄才會被返回。可以使用 AND 連接兩個甚至多個查詢條件,多個條件表達式之間用 AND 分開。
【實例 3】在 tb_students_info 表中查詢 age 大于 21,并且 height 大于等于 175 的學生的信息,輸入的 SQL 語句和執行結果如下所示。
mysql> SELECT * FROM tb_students_info -> WHERE age>21 AND height>=175; +----+--------+---------+------+------+--------+------------+ | id | name | dept_id | age | sex | height | login_date | +----+--------+---------+------+------+--------+------------+ | 3 | Henry | 2 | 23 | M | 185 | 2015-05-31 | | 5 | Jim | 1 | 24 | M | 175 | 2016-01-15 | | 9 | Thomas | 3 | 22 | M | 178 | 2016-06-07 | +----+--------+---------+------+------+--------+------------+ 3 rows in set (0.06 sec)
注意:上例的 WHERE 子句中只包含一個 AND 語句,把兩個過濾條件組合在一起,實際上可以添加多個 AND 過濾條件,增加條件的同時增加一個 AND 關鍵字。
使用 LIKE 的模糊查詢
字符串匹配的語法格式如下:<表達式1> [NOT] LIKE <表達式2>
字符串匹配是一種模式匹配,使用運算符 LIKE 設置過濾條件,過濾條件使用通配符進行匹配運算,而不是判斷是否相等進行比較。相互間進行匹配運算的對象可以是 CHAR、VARCHAR、TEXT、DATETIME 等數據類型。運算返回的結果是 TRUE 或 FALSE。
利用通配符可以在不完全確定比較值的情形下創建一個比較特定數據的搜索模式,并置于關鍵字 LIKE 之后??梢栽谒阉髂J降娜我馕恢檬褂猛ㄅ浞?,并且可以使用多個通配符。MySQL 支持的通配符有以下兩種:
1) 百分號(%)
百分號是 MySQL 中常用的一種通配符,在過濾條件中,百分號可以表示任何字符串,并且該字符串可以出現任意次。使用百分號通配符要注意以下幾點:
- MySQL 默認是不區分大小寫的,若要區分大小寫,則需要更換字符集的校對規則。
- 百分號不匹配空值。
- 百分號可以代表搜索模式中給定位置的 0 個、1 個或多個字符。
- 尾空格可能會干擾通配符的匹配,一般可以在搜索模式的最后附加一個百分號。
2) 下劃線(_)
下劃線通配符和百分號通配符的用途一樣,下畫線只匹配單個字符,而不是多個字符,也不是 0 個字符。【實例 4】在 tb_students_info 表中,查找所有以“T”字母開頭的學生姓名,輸入的 SQL 的語句和執行結果如下所示。注意:不要過度使用通配符,對通配符檢索的處理一般會比其他檢索方式花費更長的時間。
mysql> SELECT name FROM tb_students_info -> WHERE name LIKE 'T%'; +--------+ | name | +--------+ | Thomas | | Tom | +--------+ 2 rows in set (0.12 sec)
【實例 5】在 tb_students_info 表中,查找所有包含“e”字母的學生姓名,輸入的 SQL 的語句和執行結果如下所示。注意:在搜索匹配時,通配符“%”可以放在不同位置。
mysql> SELECT name FROM tb_students_info -> WHERE name LIKE '%e%'; +-------+ | name | +-------+ | Green | | Henry | | Jane | +-------+ 3 rows in set (0.00 sec)由執行結果可以看出,該語句查詢字符串中包含字母 e 的學生的姓名,只要名字中有字母 e,其前面或后面無論有多少個字符,都滿足查詢的條件。
【實例 6】在 tb_students_info 表中,查找所有以字母“y”結尾,且“y”前面只有 4 個字母的學生的姓名,輸入的 SQL 語句和執行結果如下所示。
mysql> SELECT name FROM tb_students_info -> WHERE name LIKE '____y'; +-------+ | name | +-------+ | Henry | +-------+ 1 row in set (0.00 sec)
日期字段作為條件的查詢語句
以日期字段作為條件,可以使用比較運算符設置查詢條件,也可以使用 BETWEEN AND 運算符查詢某個范圍內的值。BETWEEN AND 用來查詢某個范圍內的值,該操作符需要兩個參數,即范圍的開始值和結束值,若字段值滿足指定的范圍查詢條件,則這些記錄被返回。
【實例 7】在表 tb_students_info 中查詢注冊日期在 2016-01-01 之前的學生的信息,輸入的 SQL 語句和執行結果如下所示。
mysql> SELECT * FROM tb_students_info -> WHERE login_date<'2016-01-01'; +----+-------+---------+------+------+--------+------------+ | id | name | dept_id | age | sex | height | login_date | +----+-------+---------+------+------+--------+------------+ | 1 | Dany | 1 | 25 | F | 160 | 2015-09-10 | | 3 | Henry | 2 | 23 | M | 185 | 2015-05-31 | | 6 | John | 2 | 21 | M | 172 | 2015-11-11 | | 8 | Susan | 4 | 23 | F | 170 | 2015-10-01 | +----+-------+---------+------+------+--------+------------+ 4 rows in set (0.04 sec)【實例 8】在表 tb_students_info 中查詢注冊日期在 2015-10-01 和 2016-05-01 之間的學生的信息,輸入的 SQL 語句和執行結果如下所示。
mysql> SELECT * FROM tb_students_info -> WHERE login_date -> BETWEEN '2015-10-01' -> AND '2016-05-01'; +----+-------+---------+------+------+--------+------------+ | id | name | dept_id | age | sex | height | login_date | +----+-------+---------+------+------+--------+------------+ | 5 | Jim | 1 | 24 | M | 175 | 2016-01-15 | | 6 | John | 2 | 21 | M | 172 | 2015-11-11 | | 7 | Lily | 6 | 22 | F | 165 | 2016-02-26 | | 8 | Susan | 4 | 23 | F | 170 | 2015-10-01 | +----+-------+---------+------+------+--------+------------+ 4 rows in set (0.02 sec)
beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。
通俗易懂,深入淺出,一篇文章只講一個知識點。
文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。
文章不涉及代碼,不燒腦細胞,人人都可以學習。
當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!