Like Share Discussion Bookmark Smile

J.J. Huang   2020-06-13   MySQL   瀏覽次數:

MySQL - 第六章 | 單一條件過濾資料

使用WHERE子句

資料庫表一般包含大量的資料,很少需要檢索表中所有行。通常只會根據特定操作或報告的需要提取表資料的子集。只檢索所需資料需要指定搜索條件(search criteria),搜索條件也稱為過濾條件(filter condition)。

在SELECT語句中,資料根據WHERE子句中指定的搜索條件進行過濾。WHERE子句在表名(FROM子句)之後給出。

1
2
3
4
5
6
7
8
mysql> select id, price, prod_name from products where price = 100;
+----+-------+-----------+
| id | price | prod_name |
+----+-------+-----------+
| 1 | 100 | underwear |
| 6 | 100 | sandals |
+----+-------+-----------+
2 rows in set (0.01 sec)

分析:這條語句從products表中檢索兩個列,但不返回所有行,只返回price值為100的行。

這個例子採用了簡單的相等測試:它檢查一個列是否具有指定的值,據此進行過濾。但是SQL允許做的事情不僅僅是相等測試。

提示:SQL過濾與應用過濾 資料也可以在應用層過濾。為此目的,SQL的SELECT語句為客戶端應用檢索出超過實際所需的資料,然後客戶端程式碼對返回資料進行循環,以提取出需要的行。
通常,這種實現並不令人滿意。因此,對資料庫進行了優化,以便快速有效地對資料進行過濾。讓客戶端應用(或開發語言)處理資料庫的工作將會極大地影響應用的性能,並且使所建立 的應用完全不具備可伸縮性。此外,如果在客戶端上過濾資料,服務器不得不通過網路發送多餘的資料,這將導致網路頻寬的浪費。

注意:WHERE子句的位置 在同時使用ORDERBY和WHERE子句時,應該讓ORDER BY位於WHERE之後,否則將會產生錯誤。

WHERE子句操作符

我們在關於相等的測試時看到了第一個WHERE子句,它確定一個列是否包含特定的值。下方列出的所有條件操作符。

操作符 說明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 在指定的两个值之间

檢查單個值

我們已經看到了測試相等的例子。

1
2
3
4
5
6
7
mysql> select id, price, prod_name from products where prod_name = 'sleepwear';
+----+-------+-----------+
| id | price | prod_name |
+----+-------+-----------+
| 3 | 111 | sleepwear |
+----+-------+-----------+
1 row in set (0.00 sec)

分析:檢查WHERE prod_name=’sleepwear’語句,它返回prod_name的值為sleepwear的一行。MySQL在執行匹配時默認不區分大小寫,所以sleepwear與Sleepwear匹配。

其他例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> select id, price, prod_name from products where price < 666;
+----+-------+--------------------+
| id | price | prod_name |
+----+-------+--------------------+
| 1 | 100 | underwear |
| 2 | 222 | boxers |
| 3 | 111 | sleepwear |
| 4 | 20 | socks |
| 5 | 55 | slippers |
| 6 | 100 | sandals |
| 7 | 599 | flip_flops |
| 9 | 399 | long_sleeve_shirt |
| 12 | 345 | tie |
| 13 | 123 | dress_shoes |
| 14 | 654 | T-shirt |
| 15 | 643 | polo |
| 16 | 234 | short_sleeve_shirt |
| 19 | 236 | swimsuit |
| 21 | 123 | jacket |
+----+-------+--------------------+
15 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> select id, price, prod_name from products where price <= 666;
+----+-------+--------------------+
| id | price | prod_name |
+----+-------+--------------------+
| 1 | 100 | underwear |
| 2 | 222 | boxers |
| 3 | 111 | sleepwear |
| 4 | 20 | socks |
| 5 | 55 | slippers |
| 6 | 100 | sandals |
| 7 | 599 | flip_flops |
| 8 | 666 | pants |
| 9 | 399 | long_sleeve_shirt |
| 12 | 345 | tie |
| 13 | 123 | dress_shoes |
| 14 | 654 | T-shirt |
| 15 | 643 | polo |
| 16 | 234 | short_sleeve_shirt |
| 19 | 236 | swimsuit |
| 21 | 123 | jacket |
+----+-------+--------------------+
16 rows in set (0.01 sec)

不匹配檢查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
mysql> select id, price, prod_name from products where price <> 666;
+----+-------+--------------------+
| id | price | prod_name |
+----+-------+--------------------+
| 1 | 100 | underwear |
| 2 | 222 | boxers |
| 3 | 111 | sleepwear |
| 4 | 20 | socks |
| 5 | 55 | slippers |
| 6 | 100 | sandals |
| 7 | 599 | flip_flops |
| 9 | 399 | long_sleeve_shirt |
| 10 | 1000 | blazer |
| 11 | 9999 | sweater |
| 12 | 345 | tie |
| 13 | 123 | dress_shoes |
| 14 | 654 | T-shirt |
| 15 | 643 | polo |
| 16 | 234 | short_sleeve_shirt |
| 17 | 1233 | jeans |
| 18 | 877 | shorts |
| 19 | 236 | swimsuit |
| 20 | 724 | casual_shoes |
| 21 | 123 | jacket |
| 22 | 690 | coat |
| 23 | 890 | raincoat |
| 24 | 777 | hat |
| 25 | 3000 | gloves |
| 26 | 1234 | scarf |
| 27 | 9999 | belt |
+----+-------+--------------------+
26 rows in set (0.01 sec)

提示:<> 和 != 是效果相同的操作符。

提示:何時使用引號 如果仔細觀察上述WHERE子句中使用的條件,會看到有的值括在單引號內(如前面使用的’sleepwear’),而有的值未括起來。單引號用來限定字符串。如果將值與串類型的列進行比較,則需要限定引號。用來與數值列進行比較的值不用引號。

範圍值檢查

為了檢查某個範圍的值,可使用BETWEEN操作符。其語法與其他WHERE子句的操作符稍有不同,因為它需要兩個值,即範圍的開始值和結束值。例如,BETWEEN操作符可用來檢索價格在500元和1000元之間或日期在指定的開始日期和結束日期之間的所有產品。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> select id, price, prod_name from products where price between 500 and 1000;
+----+-------+--------------+
| id | price | prod_name |
+----+-------+--------------+
| 7 | 599 | flip_flops |
| 8 | 666 | pants |
| 10 | 1000 | blazer |
| 14 | 654 | T-shirt |
| 15 | 643 | polo |
| 18 | 877 | shorts |
| 20 | 724 | casual_shoes |
| 22 | 690 | coat |
| 23 | 890 | raincoat |
| 24 | 777 | hat |
+----+-------+--------------+
10 rows in set (0.00 sec)

分析:從這個例子中可以看到,在使用BETWEEN時,必須指定兩個值——所需範圍的低端值和高端值。這兩個值必須用AND關鍵字分隔。 BETWEEN匹配範圍中所有的值,包括指定的開始值和結束值。

空值檢查

在建立表時,表設計人員可以指定其中的列是否可以不包含值。在一個列不包含值時,稱其為包含空值NULL。

術語:NULL 無值(no value),它與欄位包含0、空字符串或僅僅包含空格不同。

SELECT語句有一個特殊的WHERE子句,可用來檢查具有NULL值的列。這個WHERE子句就是IS NULL子句。

1
2
mysql> select id, price, prod_name from products where price is null;
Empty set (0.00 sec)

由於資料price沒有NULL資料,所以顯示Empty。

注意:NULL與不匹配 在通過過濾選擇出不具有特定值的行時,你可能希望返回具有NULL值的行。但是不行。因為未知具有特殊的含義,資料庫不知道它們是否匹配,所以在匹配過濾或不匹配過濾時不返回它們。因此,在過濾資料時,一定要驗證返回資料中確實給出了被過濾列具有NULL的行。

結語

我覺得NULL的處理是很重要的,而且他在SELECT的時候也是會左右資料庫的執行速度,這部分就有點深了,只大概提一下,哈。在這些操作符中相對比較少用的我覺得是BETWEEN,要知道這操作符號是常常使用在日期區間搜尋的。

註:以上參考了
MySQL必知必会 MySQL Crash Course