使用述詞篩選資料

已完成

最簡單的 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 NULLIS 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