這篇文章主要是學習一下SELECT語句的WHERE子句的使用和一些需要注意的問題。
在?大部分情況下,我們只需要檢索數據庫中的一些特定的數據子集而不是所有的數據。?完成這種類似操作需要指定 搜索條件(search criteria) ,搜索條件也被叫做 過濾條件(filter condition) 。在SELECT語句中,可以使用 WHERE 子句來指定過濾的搜索條件,WHERE子句在FROM子句之后給出。
簡單的過濾
首先看一個最基本的例子,從產品表中選取產品單價為3.49的行:
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49
結果如下:
這條語句從Products表中檢索兩個列,并且只返回了prod_price為3.49的行。
使用WHERE子句時也可以使?ORDER BY子句,只需要注意,因該讓ORDER BY子句位于WHERE之后,否則會出現錯誤。
在繼續下一步的學習之前,還有一個問題需要討論,那就是 應該把數據過濾的操作放在應用層還是放在數據庫層 。在一些實際開發中,尤其是一些操作流程不規范的項目中,后臺喜歡把所有數據都返回給前端,要前端去對數據過濾然后渲染。一般情況下,這種做法是很不妥當的。首先,讓應用層處理數據庫的操作將會對應用的性能造成很大的影響,并且這種影響是很消極的。其次,數據庫進行優化之后,可以更快速有效的對數據進行過濾,其效率遠高于在應用層進行過濾。此外,在應用?層過濾數據,服務器將不得不通過網絡發送多余的數據,這會導致網絡帶寬的浪費。所以總的來說, 在數據庫層對數據進行過濾 是較為高效和合理的方式。
條件操作符
在使用WHERE子句進行數據過濾時,主要還是使用條件操作符來對數據進行判斷,從而選取到需要的數據。
首先看一下標準的SQL中所有的條件操作符:
操作符 | 說明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
!< | 不小于 |
> | 大于 |
>= | 大于等于 |
!> | 不大于 |
?BETWEEN | 在指定的兩個值之間 |
IS NULL | 為NULL值 |
之前已經看過了校驗相等的例子,基本上其它條件操作符的使用都和等號操作符的使用差不多,需要注意的是下面幾個操作符。
首先看一下不等于操作符。不等于操作符有兩種寫法, != 和 <> 這兩個操作符通常情況下是可以相互替換的,但是在不同的DBMS下可能情況會不一樣,使用時需要查閱對應的DBMS文檔。來看一個例子:
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';
結果如下:
使用 != 操作符將會得到相同的結果。
通過這個例子還想說明的一個需要注意的?地方是,WHERE子句中的條件,有些值被單引號括起來了,?有些沒有。這是因為,單引號是用來限定字符串的,如果將值與字符串類型的列進行比較,就需要限定單引號。如果是與數值類型比較的話,就不需要單引號。
當需要檢查某列的值是否在某個范圍內時,可以使用 BETWEEN 操作符?。其語法與其他的條件操作符有所不同,因為它需要兩個值,即范圍的開始值和結束值。下面這個例子說明如何使BETWEEN操作符:
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
結果如下:
上面這個例子是檢索單價在5和10之間的所有產品,通過這個例子可以看到,使用BETWEEN操作符時?,要使用 AND 關鍵字將指定的開始值和結束值分隔。BETWEEN語句會匹配這個范圍中所有的值,包括開始值和結束值。
還有一個需要注意的地方是,對于空值的檢查。在創建表的時候,設計人員會指定某一列是否能夠為空,當一列可以為空的時候,被稱為包含空值NULL。
NULL被定義為無值(no value),它與包含字段為0,空字符串或僅僅包含空格不同。
要判斷值是否為空,不能簡單的使用 value = NULL 。SELECT語句有一個特殊的WHERE子句,可以用來檢查具有NULL值的列。這個WHERE子句就是 IS NULL 子句。先看一個例子:
SELECT cust_name
FROM Customers
WHERE cust_email IS NULL;
結果如下:
為了驗證這個檢索結果的正確性,可以使用SELECT cust_name, cust_email FROM Customers;
來看一下未經過濾掉顧客信息。?
當表中沒有?IS NULL的列時,會返回一個空的結果。
還有一點需要注意的是,當通過過濾選擇不包含指定值的所有列時,可能會希望返回包含?NULL值的行,但是這做不到。因為NULL有特殊含義,數據庫不知道它們是否匹配,所以在進行匹配過濾或者非匹配過濾時,不會返回這些結果。下面用一個例子來說明這個嗯題:
SELECT cust_name, cust_email
FROM Customers
WHERE cust_email <> 'sales@villagetoys.com';
結果如下:
結合之前驗證IS NULL語句檢索結果正確性的語句的檢索結果可以看出來,cust_email為NULL的行沒有被檢索出來。
最后需要提到的是,許多的DBMS擴展了標準的操作符集,提供了更高級的過濾選擇,具體的信息可以查閱對應的DBMS的文檔。