使用 WHERE 子句 資料庫表一般包含大量的數據,很少需要檢索表中所有行。通常只 會根據特定操作或報告的需要提取表數據的子集。只檢索所需數據需要 指定搜索條件(search criteria),搜索條件也稱為過濾條件(filter condition)。 在 SELECT 語句中,數據根據 WHE ...
使用 WHERE 子句
資料庫表一般包含大量的數據,很少需要檢索表中所有行。通常只
會根據特定操作或報告的需要提取表數據的子集。只檢索所需數據需要
指定搜索條件(search criteria),搜索條件也稱為過濾條件(filter
condition)。
在 SELECT 語句中,數據根據 WHERE 子句中指定的搜索條件進行過濾。
WHERE 子句在表名( FROM 子句)之後給出,
這條語句從 products 表中檢索兩個列,但不返回所有行,只返
回 prod_price 值為 2.50 的行
這個例子採用了簡單的相等測試:它檢查一個列是否具有指定的值,
據此進行過濾。但是SQL允許做的事情不僅僅是相等測試
SQL過濾與應用過濾 數據也可以在應用層過濾。為此目
的,SQL的 SELECT 語句為客戶機應用檢索出超過實際所需的
數據,然後客戶機代碼對返回數據進行迴圈,以提取出需要
的行。
通常,這種實現並不令人滿意。因此,對資料庫進行了優化,
以便快速有效地對數據進行過濾。讓客戶機應用(或開發語言)
處理資料庫的工作將會極大地影響應用的性能,並且使所創建
的應用完全不具備可伸縮性。此外,如果在客戶機上過濾數據,
伺服器不得不通過網路發送多餘的數據,這將導致網路帶寬的
浪費。
WHERE 子句的位置 在同時使用 ORDER BY 和 WHERE 子句時,應
該讓 ORDER BY 位於 WHERE 之後,否則將會產生錯誤
WHERE 子句操作符
我們在關於相等的測試時看到了第一個 WHERE 子句,它確定一個列是
否包含特定的值。MySQL支持表6-1列出的所有條件操作符
不匹配檢查
以下例子列出不是由供應商 1003 製造的所有產品
何時使用引號單引號用來限定字元串。如果將值與串類型的
列進行比較,則需要限定引號。用來與數值列進行比較的值不
用引號。
下麵是相同的例子,其中使用 != 而不是 <> 操作符:
範圍值檢查
為了檢查某個範圍的值,可使用 BETWEEN 操作符。其語法與其他 WHERE
子句的操作符稍有不同,因為它需要兩個值,即範圍的開始值和結束值。
例如, BETWEEN 操作符可用來檢索價格在5美元和10美元之間或日期在指
定的開始日期和結束日期之間的所有產品
下麵的例子說明如何使用 BETWEEN 操作符,它檢索價格在5美元和10
美元之間的所有產品
從這個例子中可以看到,在使用 BETWEEN 時,必須指定兩個值
——所需範圍的低端值和高端值。這兩個值必須用 AND 關鍵字
分隔。 BETWEEN 匹配範圍中所有的值,包括指定的開始值和結束值
空值檢查
在創建表時,表設計人員可以指定其中的列是否可以不包含值。在
一個列不包含值時,稱其為包含空值 NULL
NULL 無值(no value),它與欄位包含 0 、空字元串或僅僅包含
空格不同
SELECT 語句有一個特殊的 WHERE 子句,可用來檢查具有 NULL 值的列。
這個 WHERE 子句就是 IS NULL 子句。其語法如下:
這條語句返回沒有價格(空 prod_price 欄位,不是價格為 0 )的所有
產品,由於表中沒有這樣的行,所以沒有返回數據
NULL 與不匹配 在通過過濾選擇出不具有特定值的行時,你
可能希望返回具有 NULL 值的行。但是,不行。因為未知具有
特殊的含義,資料庫不知道它們是否匹配,所以在匹配過濾
或不匹配過濾時不返回它們。
因此,在過濾數據時,一定要驗證返回數據中確實給出了被
過濾列具有 NULL 的行。
本章介紹瞭如何用 SELECT 語句的 WHERE 子句過濾返回的數據。我們學
習瞭如何對相等、不相等、大於、小於、值的範圍以及 NULL 值等進行測
試。