使用述詞篩選資料
最簡單的 SELECT 陳述式只包含 SELECT 和 FROM 子句,將會評估資料表中的每個資料列。 藉由使用 WHERE 子句,您可以定義條件來決定要處理哪些資料列,並可能減少結果集。
WHERE 子句的結構
WHERE 子句由一或多個搜尋條件組成,針對資料表的每個資料列,每個條件都必須評估為 TRUE、FALSE 或「未知」。 只有在 WHERE 子句評估為 TRUE 時,才會傳回資料列。 個別的條件可作為資料的篩選條件,稱為「述詞」。 每個述詞都包含條件,通常是使用基本的比較運算子來測試:
- = (等於)
- <> (不等於)
- > (大於)
- >= (大於或等於)
- < (小於)
- <= (小於或等於)
例如,下列查詢傳回 ProductCategoryID 值為 2 的所有產品:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;
同樣地,下列查詢傳回 ListPrice 小於 10.00 的所有產品:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;
IS NULL/IS NOT NULL
您也可以使用 IS NULL 或 IS NOT NULL,輕鬆地篩選以允許或排除「未知」或 NULL 值。
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;
多重條件
您可以使用 AND 和 OR 運算子及括弧來合併多個述詞。 不過,SQL Server 一次只處理兩個條件。 使用 AND 運算子連接多個條件時,所有條件都必須為 TRUE。 使用 OR 運算子連接兩個條件時,其中一個或兩個條件對於結果集可能為 TRUE。
例如,下列查詢傳回類別 2 中價格低於 10.00 的產品:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
除非使用括弧,否則會先處理 AND 運算子,再處理 OR 運算子。 如需最佳做法,請在使用兩個以上的述詞時使用括弧。 下列查詢會傳回類別 2「或」3「且」成本小於 10.00 的產品:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
比較運算子
Transact-SQL 包含比較運算子,有助於簡化 WHERE 子句。
IN
同一個資料行以 OR 連接多個等式條件時,IN 運算子是一種捷徑。 在查詢中使用多個 OR 條件沒有任何問題,如下列範例所示:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
不過,使用 IN 會較清楚且精確,而且不會影響查詢的效能。
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);
BETWEEN
BETWEEN 是篩選值的上下限時可使用的另一個捷徑,以取代搭配 AND 運算子使用兩個條件。 下列兩個查詢的用法相同:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice >= 1.00
AND ListPrice <= 10.00;
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice BETWEEN 1.00 AND 10.00;
BETWEEN 運算子使用含括界限值。 結果會包括價格為 1.00 或 10.00 的產品。 在查詢日期欄位時,BETWEEN 也很有用。 例如,下列查詢將包含介於 2012 年 1 月 1 日到 2012 年 12 月 31 日之間修改的所有產品名稱:
SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
ProductName
ModifiedDate
登山車襪,M
2012-01-01 00:00:00.000
HL Mountain Frame - Silver, 42
2012-03-05 00:00:00.000
HL Mountain Frame - Silver, 38
2012-08-29 00:00:00.000
Mountain-100 Silver, 38
2012-12-31 00:00:00.000
不過,由於我們未指定時間範圍,因此在 2012-12-31 00:00:00.000 之後不會傳回任何結果。 為了正確包含日期和時間,我們需要在述詞中包含時間:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01 00:00:00.000' AND '2012-12-31 23:59:59.999';
基本比較運算子 (例如大於 (>) 和等於 (=)) 也只有在依日期篩選時才正確:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
LIKE
最後這個比較運算子只能用於字元資料,可讓我們使用萬用字元和規則運算式模式。 萬用字元可讓我們指定部分字串。 例如,您可以使用下列查詢來傳回名稱中有 "mountain" 一字的所有產品:
SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';
% 萬用字元代表有零個以上字元的任何字串,因此,結果會包括名稱中任意處有 "mountain" 一字的產品,如下所示:
名稱
ListPrice
登山車襪,M
9.50
Mountain Bike Socks, L
9.50
HL Mountain Frame - Silver, 42
1364.0
HL Mountain Frame - Black, 42
1349.60
HL Mountain Frame - Silver, 38
1364.50
Mountain-100 Silver, 38
3399.99
您可以使用 _ (底線) 萬用字元來表示單一字元,如下所示:
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';
下列結果只會包含開頭為 "Mountain Bike Socks" 且後面接著單一字元的產品:
ProductName
ListPrice
登山車襪,M
9.50
Mountain Bike Socks, L
9.50
您也可以定義複雜模式來尋找您要的字串。 例如,下列查詢會搜尋名稱開頭為 "Mountain-" 且後面接著下列各項的產品:
- 介於 0 到 9 之間的三個字元
- 一個空格
- 任何字串
- 一個逗號
- 一個空格
- 介於 0 到 9 之間的兩個字元
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
此查詢的結果如下所示:
ProductName
ListPrice
Mountain-100 Silver, 38
3399.99
Mountain-100 Silver, 42
3399.99
Mountain-100 Black, 38
3399.99
Mountain-100 Black, 42
3399.99
Mountain-200 銀色,38
2319.99
Mountain-200 銀色,42
2319.99
Mountain-200 黑色,38
2319.99
Mountain-200 黑色,42
2319.99