1. 程式人生 > >4.高級數據過濾 ---SQL

4.高級數據過濾 ---SQL

很多 clas rom ice 能夠 清單 解決 功能 bold

一、AND操作符


要通過不止一個列進行過濾,可以使用A ND操作符給WHERE子句附加條件.

SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = DLL01 AND prod_price <= 4;

分析▼
此SQL語句檢索由供應商DLL01制造且價格小於等於4美元的所有產品的名稱和價格。這條SELECT語句中的WHERE子句包含兩個條件,
用A ND關鍵字聯結在一起。A ND指示DBMS只返回滿足所有給定條件的行。如果某個產品由供應商DLL01制造,但價格高於4美元,則不檢索
它。類似地,如果產品價格小於4美元,但不是由指定供應商制造的也不被檢索

*可以增加多個過濾條件,每個條件間都要使用A ND關鍵字。

二、OR操作符


OR操作符與A ND操作符正好相反,它指示DBMS檢索匹配任一條件的行。事實上,許多DBMS在OR WHERE子句的第一個條件得到滿足的情況
下,就不再計算第二個條件了(在第一個條件滿足時,不管第二個條件是否滿足,相應的行都將被檢索出來)

SELECT prod_name, prod_price
FROM Products
WHERE vend_id = DLL01 OR vend_id = ‘BRS01’;

分析▼
此SQL語句檢索由任一個指定供應商制造的所有產品的產品名和價格。OR操作符告訴DBMS匹配任一條件而不是同時匹配兩個條件。如果這裏

使用的是A ND操作符,則沒有數據返回(因為會創建沒有匹配行的WHERE子句)。

OR
WHERE子句中使用的關鍵字,用來表示檢索匹配任一給定條件的行。

三、求值順序


SELECT prod_name, prod_price
FROM Products
WHERE vend_id = DLL01 OR vend_id = ‘BRS01’
AND prod_price >= 10;
輸出▼
prod_name prod_price
------------------- ----------
Fish bean bag toy 3.4900
Bird bean bag toy 3.4900 Rabbit bean bag toy 3.4900 18 inch teddy bear 11.9900 Raggedy Ann 4.9900

分析▼
請看上面的結果。返回的行中有4行價格小於10美元,顯然,返回的行未按預期的進行過濾。為什麽會這樣呢?原因在於求值的順序。
SQL(像多數語言一樣)在處理OR操作符前,優先處理A ND操作符。當SQL看到上述WHERE子句時,它理解為:由供應商BRS01制造的價格
為10美元以上的所有產品,以及由供應商DLL01制造的所有產品,而不管其價格如何。換句話說,由於A ND在求值過程中優先級更高,操作符
被錯誤地組合了。

此問題的解決方法是使用圓括號對操作符進行明確分組。請看下面的SELECT語句及輸出:

SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = DLL01 OR vend_id = ‘BRS01’)
AND prod_price >= 10;
輸出▼
prod_name prod_price
------------------- ----------
18 inch teddy bear 11.9900

分析▼
這條SELECT語句與前一條的唯一差別是,將前兩個條件用圓括號括了起來。因為圓括號具有比A ND或OR操作符更高的求值順序,所以DBMS
首先過濾圓括號內的OR條件。這時,SQL語句變成了選擇由供應商DLL01或BRS01制造的且價格在10美元及以上的所有產品,這正是我們希望
的結果。

提示:在WHERE子句中使用圓括號
任何時候使用具有A ND和OR操作符的WHERE子句,都應該使用圓括號明確地分組操作符。不要過分依賴默認求值順序,即使它確實如你希
望的那樣。使用圓括號沒有什麽壞處,它能消除歧義。

四、IN操作符


IN操作符用來指定條件範圍,範圍中的每個條件都可以進行匹配。

IN取一組由逗號分隔、括在圓括號中的合法值

SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ( DLL01, BRS01 )
ORDER BY prod_name;
輸出▼
prod_name prod_price
------------------- ----------
12 inch teddy bear 8.9900
18 inch teddy bear 11.9900
8 inch teddy bear 5.9900
Bird bean bag toy 3.4900
Fish bean bag toy 3.4900
Rabbit bean bag toy 3.4900
Raggedy Ann 4.9900

分析▼
此SELECT語句檢索由供應商DLL01和BRS01制造的所有產品。IN操作符後跟由逗號分隔的合法值,這些值必須括在圓括號中。

你可能會猜測IN操作符完成了與OR相同的功能,恭喜你猜對了!

為什麽要使用IN操作符?其優點為:
*在有很多合法選項時,IN操作符的語法更清楚,更直觀。
*在與其他AND和OR操作符組合使用IN時,求值順序更容易管理。
*IN操作符一般比一組OR操作符執行得更快(在上面這個合法選項很少的例子中,你看不出性能差異)。
*IN的最大優點是可以包含其他SELECT語句,能夠更動態地建立WHERE子句。
IN
WHERE子句中用來指定要匹配值的清單的關鍵字,功能與OR相當。

五、NOT操作符


WHERE子句中的NOT操作符有且只有一個功能,那就是否定其後所跟的任何條件。因為NOT從不單獨使用(它總是與其他操作符一起使用),

所以它的語法與其他操作符有所不同。NOT關鍵字可以用在要過濾的列前,而不僅是在其後。

NOT
WHERE子句中用來否定其後條件的關鍵字。

分析▼
為什麽使用NOT?對於這裏的這種簡單的WHERE子句,使用NOT確實沒有什麽優勢。但在更復雜的子句中,NOT是非常有用的。例如,在
與IN操作符聯合使用時,NOT可以非常簡單地找出與條件列表不匹配的行。
說明:MariaDB中的NOT
MariaDB支持使用NOT否定IN、BETWEEN和EXISTS子句。大多數DBMS允許使用NOT否定任何條件。

4.高級數據過濾 ---SQL