使用WHERE子句
在SELECT語句中,資料根據WHERE子句中指定的搜尋條件進行過濾。WHERE子句在表名(FROM子句)之後給出。
比如:
select prod_name, prod_price from products where prod_price = 2.50;
輸出如下:
這條語句從products表中檢索兩個列,但不返回所有行,只返回prod_price值為2.50的行。
注意:
-
SQL過濾與應用過濾:
資料也可以在應用層過濾。為此目的,SQL的SELECT語句為客戶機應用檢索出超過實際所需的資料,然後客戶機程式碼對返回資料進行迴圈,以提取出需要的行。
通常,這種實現並不令人滿意。因此,對資料庫進行了最佳化,以便快速有效地對資料進行過濾。讓客戶機應用(或開發語言)處理資料庫的工作將會極大地影響應用的效能,並且使所建立的應用完全不具備可伸縮性。此外,如果在客戶機上過濾資料,伺服器不得不透過網路傳送多餘的資料,這將導致網路頻寬的浪費。
-
WHERE子句的位置: 在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位於WHERE之後,否則將會產生錯誤。
WHERE子句運算子
MySQL支援表6-1列出的所有條件運算子。
檢索單個值
-
使用等號(=):
比如:
select prod_name, prod_price from products where prod_name = 'fuses';
輸出如下:
檢查
WHERE prod_name=‘fuses’
語句,它返回prod_name的值為Fuses的一行。MySQL在執行匹配時預設不區分大小寫,所以fuses與Fuses匹配。 -
使用小於號(<):
比如:
select prod_name, prod_price from products where prod_price < 10;
輸出如下:
列出價格小於10美元的所有產品。
-
使用小於等於號(<=):
比如:
select prod_name, prod_price from products where prod_price <= 10;
輸出如下:
檢索價格小於等於10美元的所有產品(輸出的結果比第一個例子輸出的結果多兩種產品)
不匹配檢查
以下例子列出不是由供應商1003製造的所有產品:
select vend_id, prod_name from products where vend_id <> 1003;
輸出如下:
注意:
何時使用引號: 如果仔細觀察上述WHERE子句中使用的條件,會看到有的值括在單引號內(如前面使用的'fuses'),而有的值未括起來。單引號用來限定字串。如果將值與串型別的列進行比較,則需要限定引號。用來與數值列進行比較的值不用引號。
下面是相同的例子,其中使用!=而不是<>運算子:
select vend_id, prod_name from products where vend_id != 1003;
輸出如下:
範圍值檢查
為了檢查某個範圍的值,可使用BETWEEN運算子。其語法與其他WHERE子句的運算子稍有不同,因為它需要兩個值,即範圍的開始值和結束值。例如,BETWEEN運算子可用來檢索價格在5美元和10美元之間或日期在指定的開始日期和結束日期之間的所有產品。
下面的例子說明如何使用BETWEEN運算子,它檢索價格在5美元和10美元之間的所有產品:
select prod_name, prod_price from products where prod_price between 5 and 10;
輸出如下:
從這個例子中可以看到,在使用BETWEEN時,必須指定兩個值——所需範圍的低端值和高階值。這兩個值必須用AND關鍵字分隔。BETWEEN匹配範圍中所有的值,包括指定的開始值和結束值。
空值檢查
在建立表時,表設計人員可以指定其中的列是否可以不包含值。在一個列不包含值時,稱其為包含空值NULL。
NULL:無值(no value),它與欄位包含0、空字串或僅僅包含空格不同。
SELECT語句有一個特殊的WHERE子句,可用來檢查具有NULL值的列。這個WHERE子句就是IS NULL子句。
比如:
select prod_name from products where prod_price is null;
輸出如下:
這條語句返回沒有價格(空prod_price欄位,不是價格為0)的所有產品,由於表中沒有這樣的行,所以沒有返回資料。
但是,customers表確實包含有具有空值的列,如果在檔案中沒有某位顧客的電子郵件地址,則cust_email列將包含NULL值:
select cust_id from customers where cust_email is null;
輸出如下:
注意:
-
NULL與不匹配:
在透過過濾選擇出不具有特定值的行時,你可能希望返回具有NULL值的行。但是,不行。因為未知具有特殊的含義,資料庫不知道它們是否匹配,所以在匹配過濾或不匹配過濾時不返回它們。
因此,在過濾資料時,一定要驗證返回資料中確實給出了被過濾列具有NULL的行。
舉個例子來說明:
select * from customers; select cust_id, cust_email from customers where cust_email != 'ylee@coyote.com';
輸出結果如下:
第一個select語句:
第二個select語句:
-
如果我們想要檢索不具有NULL值的行,可以使用
IS NOT NULL
運算子