WHERE 查詢子句 (SQL WHERE Clause)
我們可以進一步在 SELECT 查詢語句使用 WHERE 關鍵字搭配運算子來取出 “符合條件” 的紀錄值。
WHERE 語法 (SQL WHERE Syntax)
SELECT table_column1, table_column2...
FROM table_name
WHERE column_name operator value;
WHERE 子句用法 (Example)
假設我們想從下面的 customers 資料表中查詢 “王二” 的資料:
| C_Id | Name | City | Address | Phone |
|---|---|---|---|---|
| 1 | 張一 | 台北市 | XX路100號 | 02-12345678 |
| 2 | 王二 | 新竹縣 | YY路200號 | 03-12345678 |
| 3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 |
| 4 | 陳四 | 台北市 | AA路400號 | 02-87654321 |
我們可以下 “取出表中姓名欄位值是王二” 如此條件的 SELECT 敘述句:
SELECT * FROM customers WHERE Name = '王二';
查詢的結果如下:
| C_Id | Name | City | Address | Phone |
|---|---|---|---|---|
| 2 | 王二 | 新竹縣 | YY路200號 | 03-12345678 |
查詢條件中的 “字串值” 需要用單引號 '' 包住,否則會出現錯誤;另一方面,對於數值型別則不可以加上引號,否則也會出現錯誤。被單引號圍住的字元即表示其資料型別為字串,但有些資料庫也接受用雙引號。
多個查詢條件式
你可以使用 AND 或 OR 運算子同時下達多個條件:
- AND 運算子表示其左右兩條件皆需符合
- OR 運算子表示其左右兩條件至少需符合一個
SELECT table_column1, table_column2...
FROM table_name
WHERE column_name1 operator value1
AND column_name2 operator value2
[AND|OR]...;
舉個例子,我們想在下面這個 customers 資料表中查詢住在台北市而且薪水大於 5 萬的顧客姓名及連絡電話:
| C_Id | Name | City | Address | Phone | Salary |
|---|---|---|---|---|---|
| 1 | 張一 | 台北市 | XX路100號 | 02-12345678 | 25000 |
| 2 | 王二 | 新竹縣 | YY路200號 | 03-12345678 | 30000 |
| 3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 | 30000 |
| 4 | 陳四 | 台北市 | AA路400號 | 02-87654321 | 50000 |
可以這樣查詢:
SELECT Name, Phone FROM customers
WHERE City = '台北市' AND Salary >= 50000;
查詢的結果如下:
| Name | Phone |
|---|---|
| 陳四 | 02-87654321 |
利用圓括號 () 可以來執行更複雜的查詢條件,圓括號內圍住的的條件式會優先判斷。例如:
WHERE 條件一 AND (條件二 OR 條件三)
此 SQL 陳述式會優先對條件二與條件三做 OR 邏輯運算,所得結果再接著和條件一做 AND 邏輯運算。
AND 運算子 (AND Operator)
AND 運算子用來結合多個條件,只有當所有條件都成立時,該筆資料才會被選取。換句話說,AND 是「而且」的意思,必須同時滿足所有條件。
AND 語法
SELECT column1, column2...
FROM table_name
WHERE condition1 AND condition2 AND condition3...;
AND 範例
假設我們想從 customers 資料表中查詢住在「台北市」而且薪水大於等於 50000 的顧客資料:
SELECT * FROM customers
WHERE City = '台北市' AND Salary >= 50000;
查詢的結果如下:
| C_Id | Name | City | Address | Phone | Salary |
|---|---|---|---|---|---|
| 4 | 陳四 | 台北市 | AA路400號 | 02-87654321 | 50000 |
只有「陳四」同時滿足住在台北市(City = ‘台北市’)且薪水大於等於 50000(Salary >= 50000)這兩個條件,因此只有這一筆資料被選取。
OR 運算子 (OR Operator)
OR 運算子同樣用來結合多個條件,但只要其中一個條件成立,該筆資料就會被選取。換句話說,OR 是「或者」的意思,只需要滿足任何一個條件即可。
OR 語法
SELECT column1, column2...
FROM table_name
WHERE condition1 OR condition2 OR condition3...;
OR 範例
假設我們想查詢住在「台北市」或者住在「高雄縣」的顧客資料:
SELECT * FROM customers
WHERE City = '台北市' OR City = '高雄縣';
查詢的結果如下:
| C_Id | Name | City | Address | Phone | Salary |
|---|---|---|---|---|---|
| 1 | 張一 | 台北市 | XX路100號 | 02-12345678 | 25000 |
| 3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 | 30000 |
| 4 | 陳四 | 台北市 | AA路400號 | 02-87654321 | 50000 |
「張一」和「陳四」住在台北市,「李三」住在高雄縣,三人都滿足了其中一個條件,因此都被選取出來。而「王二」住在新竹縣,不符合任何一個條件,所以不會出現在結果中。
NOT 運算子 (NOT Operator)
NOT 運算子用來排除符合指定條件的資料,也就是反轉條件的結果。當條件為 true 時,NOT 會將其變為 false;反之亦然。
NOT 語法
SELECT column1, column2...
FROM table_name
WHERE NOT condition;
NOT 範例
假設我們想查詢不是住在「台北市」的顧客資料:
SELECT * FROM customers
WHERE NOT City = '台北市';
查詢的結果如下:
| C_Id | Name | City | Address | Phone | Salary |
|---|---|---|---|---|---|
| 2 | 王二 | 新竹縣 | YY路200號 | 03-12345678 | 30000 |
| 3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 | 30000 |
使用 NOT 排除了住在台北市的「張一」和「陳四」,只留下住在其他城市的「王二」和「李三」。你也可以使用 <>(不等於)運算子達成相同效果:WHERE City <> '台北市'。
AND、OR、NOT 的組合使用
在實際應用中,我們經常需要將 AND、OR、NOT 運算子組合使用來建立更複雜的查詢條件。
運算子優先順序
SQL 邏輯運算子的優先順序為:NOT 最高,AND 次之,OR 最低。也就是說,在沒有括號的情況下,SQL 會先處理 NOT,再處理 AND,最後才處理 OR。
例如以下查詢:
SELECT * FROM customers
WHERE City = '台北市' OR City = '高雄縣' AND Salary >= 30000;
由於 AND 的優先順序高於 OR,所以 SQL 會先執行 City = '高雄縣' AND Salary >= 30000,再將結果與 City = '台北市' 做 OR 運算。這相當於:
SELECT * FROM customers
WHERE City = '台北市' OR (City = '高雄縣' AND Salary >= 30000);
查詢的結果如下:
| C_Id | Name | City | Address | Phone | Salary |
|---|---|---|---|---|---|
| 1 | 張一 | 台北市 | XX路100號 | 02-12345678 | 25000 |
| 3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 | 30000 |
| 4 | 陳四 | 台北市 | AA路400號 | 02-87654321 | 50000 |
使用括號控制優先順序
為了避免優先順序造成的混淆,建議使用圓括號 () 明確指定條件的執行順序。括號內的條件會優先被執行。
例如,我們想查詢住在「台北市」或「高雄縣」,而且薪水大於等於 30000 的顧客:
SELECT * FROM customers
WHERE (City = '台北市' OR City = '高雄縣') AND Salary >= 30000;
查詢的結果如下:
| C_Id | Name | City | Address | Phone | Salary |
|---|---|---|---|---|---|
| 3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 | 30000 |
| 4 | 陳四 | 台北市 | AA路400號 | 02-87654321 | 50000 |
加上括號後,SQL 會先執行括號內的 City = '台北市' OR City = '高雄縣',篩選出住在台北市或高雄縣的人,再從這些人中篩選薪水大於等於 30000 的人。因此「張一」雖然住在台北市,但薪水只有 25000,不符合條件而被排除。
結合 NOT 的複合查詢
我們也可以將 NOT 與 AND、OR 結合使用。例如,查詢不是住在台北市,而且薪水大於等於 30000 的顧客:
SELECT * FROM customers
WHERE NOT City = '台北市' AND Salary >= 30000;
查詢的結果如下:
| C_Id | Name | City | Address | Phone | Salary |
|---|---|---|---|---|---|
| 3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 | 30000 |
只有「李三」同時滿足不住在台北市且薪水大於等於 30000 的條件。「王二」雖然不住在台北市,但薪水低於 30000,所以不符合條件。
邏輯運算子整理
| 運算子 | 說明 | 優先順序 |
|---|---|---|
NOT | 反轉條件結果,排除符合條件的資料 | 最高 |
AND | 所有條件都必須成立 | 中 |
OR | 任一條件成立即可 | 最低 |
在撰寫複雜的查詢條件時,建議多使用括號 () 來明確指定運算順序,不僅可以避免因優先順序而產生的邏輯錯誤,也能讓 SQL 語句更容易閱讀和維護。
延伸閱讀
- SQL 教學 — 完整 SQL 語法教學
- SQL SELECT — 資料查詢語法
- SQL ORDER BY — 排序教學
- SQL DISTINCT — 去除重複教學
- SQL LIMIT — 限制筆數教學
- SQL LIKE — 模糊搜尋
- SQL BETWEEN — 範圍查詢
- SQL IN — 多值條件查詢
留言功能已關閉。