MySQL WHERE:條件查詢

2020-07-16 10:04:44
在使用 MySQL SELECT語句時,可以使用 WHERE 子句來指定查詢條件,從 FROM 子句的中間結果中選取適當的資料行,達到資料過濾的效果。

語法格式如下:

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 之後。可以在搜尋模式的任意位置使用萬用字元,並且可以使用多個萬用字元。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)