目錄
- 一、使用 WHERE 子句
- 二、WHERE 子句運算子
- 2.1 檢查單個值
- 2.2 不匹配檢查
- 2.3 范圍值檢查
- 2.4 空值檢查
- 三、小結
本文介紹如何使用 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
(完)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/465102.html
標籤:SQL Server
上一篇:Redis快取相關的幾個問題
