本文介紹如何使用 SQL WHERE 子句指定搜索條件,過濾返回的數據。還介紹如何檢驗相等、不相等、大於、小於、值的範圍以及 NULL 值等。 一、使用 WHERE 子句 資料庫表一般包含大量的數據,很少需要檢索表中的所有行。通常只會根據特定操作或報告的需要提取表數據的子集。只檢索所需數據需要指定搜 ...
目錄
本文介紹如何使用 SQL WHERE
子句指定搜索條件,過濾返回的數據。還介紹如何檢驗相等、不相等、大於、小於、值的範圍以及 NULL
值等。
一、使用 WHERE 子句
資料庫表一般包含大量的數據,很少需要檢索表中的所有行。通常只會根據特定操作或報告的需要提取表數據的子集。只檢索所需數據需要指定搜索條件(search criteria),搜索條件也稱為過濾條件(filter condition)。
在 SELECT
語句中,數據根據 WHERE
子句中指定的搜索條件進行過濾。WHERE
子句在表名(FROM
子句)之後給出,如下所示:
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;
這條語句從 products
表中檢索兩個列,但不返回所有行,只返回 prod_price
值為 3.49
的行,如下所示:
prod_name prod_price
------------------- ----------
Fish bean bag toy 3.49
Bird bean bag toy 3.49
Rabbit bean bag toy 3.49
這個示例使用了簡單的相等檢驗:檢查這一列的值是否為指定值,據此過濾數據。不過,SQL 不只能測試等於,還能做更多的事情。
提示:有多少個 0?
你在練習這個示例時,會發現顯示的結果可能是 3.49、3.490、3.4900 等。出現這樣的情況,往往是因為 DBMS 指定了所使用的數據類型及其預設行為。
所以,如果你的輸出可能與本文中的有點不同,不必焦慮,畢竟從數學角度講,3.49 和 3.4900 是一樣的。
提示:SQL 過濾與應用過濾
數據也可以在應用層過濾。為此,SQL 的
SELECT
語句為客戶端應用檢索出超過實際所需的數據,然後客戶端代碼對返回數據進行迴圈,提取出需要的行。通常,這種做法極其不妥。優化資料庫後可以更快速有效地對數據進行過濾。
而讓客戶端應用(或開發語言)處理資料庫的工作將會極大地影響應用的性能,並且使所創建的應用完全不具備可伸縮性。
此外,如果在客戶端過濾數據,伺服器不得不通過網路發送多餘的數據,這將導致網路帶寬的浪費。
註意:
WHERE
子句的位置在同時使用
ORDER BY
和WHERE
子句時,應該讓ORDER BY
位於WHERE
之後,否則將會產生錯誤(關於ORDER BY
的使用,請參閱 如何使用 ORDER BY 根據需要排序檢索出的數據)。
二、WHERE 子句操作符
我們在做相等檢驗時看到了第一個 WHERE
子句,它確定一個列是否包含指定的值。SQL 支持表 1 列出的所有條件操作符。
表 1 WHERE
子句操作符
操作符 | 說明 |
---|---|
= |
等於 |
<> |
不等於 |
!= |
不等於 |
< |
小於 |
<= |
小於等於 |
!< |
不小於 |
> |
大於 |
>= |
大於等於 |
!> |
不大於 |
BETWEEN |
在指定的兩個值之間 |
IS NULL |
為 NULL 值 |
註意:操作符相容
表 1 中列出的某些操作符是冗餘的(如
<>
與!=
相同,!<
相當於>=
)。並非所有 DBMS 都支持這些操作符。想確定你的 DBMS 支持哪些操作符,請參閱相應的文檔。
2.1 檢查單個值
我們已經看到了檢驗相等的例子,現在來看看幾個使用其他操作符的例子。
第一個例子是列出所有價格小於 10 元的產品。
SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;
輸出:
prod_name prod_price
------------------- ----------
Fish bean bag toy 3.49
Bird bean bag toy 3.49
Rabbit bean bag toy 3.49
8 inch teddy bear 5.99
12 inch teddy bear 8.99
Raggedy Ann 4.99
King doll 9.49
Queen doll 9.49
下一條語句檢索所有價格小於等於 10 元的產品(因為沒有價格恰好是 10 元的產品,所以結果與前一個例子相同):
SELECT prod_name, prod_price
FROM Products
WHERE prod_price <= 10;
2.2 不匹配檢查
這個例子列出所有不是供應商 DLL01 製造的產品:
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';
輸出:
vend_id prod_name
---------- ------------------
BRS01 8 inch teddy bear
BRS01 12 inch teddy bear
BRS01 18 inch teddy bear
FNG01 King doll
FNG01 Queen doll
提示:何時使用引號
如果仔細觀察上述
WHERE
子句中的條件,會看到有的值括在單引號內,而有的值未括起來。單引號用來限定字元串。如果將值與字元串類型的列進行比較,就需要限定引號。用來與數值列進行比較的值不用引號。
下麵是相同的例子,其中使用 !=
而不是 <>
操作符:
SELECT vend_id, prod_name
FROM Products
WHERE vend_id != 'DLL01';
註意:是
!=
還是<>
?
!=
和<>
通常可以互換。但是,並非所有 DBMS 都支持這兩種不等於操作符。如果有疑問,請參閱相應的 DBMS 文檔。
2.3 範圍值檢查
要檢查某個範圍的值,可以使用 BETWEEN
操作符。其語法與其他 WHERE
子句的操作符稍有不同,因為它需要兩個值,即範圍的開始值和結束值。
例如,BETWEEN
操作符可用來檢索價格在 5 元和 10 元之間的所有產品,或在指定的開始日期和結束日期之間的所有日期。
下麵的例子說明如何使用 BETWEEN
操作符,它檢索價格在 5 元和 10 元之間的所有產品。
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
輸出:
prod_name prod_price
------------------- ----------
8 inch teddy bear 5.99
12 inch teddy bear 8.99
King doll 9.49
Queen doll 9.49
從這個例子可以看到,在使用 BETWEEN
時,必須指定兩個值——所需範圍的低端值和高端值。這兩個值必須用 AND
關鍵字分隔。BETWEEN
匹配範圍中所有的值,包括指定的開始值和結束值。
2.4 空值檢查
在創建表時,表設計人員可以指定其中的列能否不包含值。在一個列不包含值時,稱其包含空值 NULL
。
NULL
無值(no value),它與欄位包含 0、空字元串或僅僅包含空格不同。
確定值是否為 NULL
,不能簡單地檢查是否等於 NULL
。SELECT
語句有一個特殊的 WHERE
子句,可用來檢查具有 NULL
值的列。這個 WHERE
子句就是 IS NULL
子句。其語法如下:
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;
這條語句返回所有沒有價格(空 prod_price
欄位,不是價格為 0)的產品,由於表中沒有這樣的行,所以沒有返回數據。但是,Customers
表確實包含具有 NULL
值的列:如果沒有電子郵件地址,則 cust_email
列將包含 NULL
值:
SELECT cust_name
FROM Customers
WHERE cust_email IS NULL;
輸出:
cust_name
----------
Kids Place
The Toy Store
提示:DBMS 特有的操作符
許多 DBMS 擴展了標準的操作符集,提供了更高級的過濾選擇。更多信息請參閱相應的 DBMS 文檔。
註意:
NULL
和非匹配通過過濾選擇不包含指定值的所有行時,你可能希望返回含
NULL
值的行。但是這做不到。因為NULL
比較特殊,所以在進行匹配過濾或非匹配過濾時,不會返回這些結果。
三、小結
本文介紹瞭如何用 SELECT
語句的 WHERE
子句過濾返回的數據。還介紹瞭如何檢驗相等、不相等、大於、小於、值的範圍以及 NULL
值等。
原文鏈接:https://www.developerastrid.com/sql/sql-where
(完)