SQL WHERE

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_IdNameCityAddressPhone
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_IdNameCityAddressPhone
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_IdNameCityAddressPhoneSalary
1張一台北市XX路100號02-1234567825000
2王二新竹縣YY路200號03-1234567830000
3李三高雄縣ZZ路300號07-1234567830000
4陳四台北市AA路400號02-8765432150000

可以這樣查詢:

SELECT Name, Phone FROM customers
WHERE City = '台北市' AND Salary >= 50000;

查詢的結果如下:

NamePhone
陳四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_IdNameCityAddressPhoneSalary
4陳四台北市AA路400號02-8765432150000

只有「陳四」同時滿足住在台北市(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_IdNameCityAddressPhoneSalary
1張一台北市XX路100號02-1234567825000
3李三高雄縣ZZ路300號07-1234567830000
4陳四台北市AA路400號02-8765432150000

「張一」和「陳四」住在台北市,「李三」住在高雄縣,三人都滿足了其中一個條件,因此都被選取出來。而「王二」住在新竹縣,不符合任何一個條件,所以不會出現在結果中。

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_IdNameCityAddressPhoneSalary
2王二新竹縣YY路200號03-1234567830000
3李三高雄縣ZZ路300號07-1234567830000

使用 NOT 排除了住在台北市的「張一」和「陳四」,只留下住在其他城市的「王二」和「李三」。你也可以使用 <>(不等於)運算子達成相同效果:WHERE City <> '台北市'

AND、OR、NOT 的組合使用

在實際應用中,我們經常需要將 ANDORNOT 運算子組合使用來建立更複雜的查詢條件。

運算子優先順序

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_IdNameCityAddressPhoneSalary
1張一台北市XX路100號02-1234567825000
3李三高雄縣ZZ路300號07-1234567830000
4陳四台北市AA路400號02-8765432150000

使用括號控制優先順序

為了避免優先順序造成的混淆,建議使用圓括號 () 明確指定條件的執行順序。括號內的條件會優先被執行。

例如,我們想查詢住在「台北市」或「高雄縣」,而且薪水大於等於 30000 的顧客:

SELECT * FROM customers
WHERE (City = '台北市' OR City = '高雄縣') AND Salary >= 30000;

查詢的結果如下:

C_IdNameCityAddressPhoneSalary
3李三高雄縣ZZ路300號07-1234567830000
4陳四台北市AA路400號02-8765432150000

加上括號後,SQL 會先執行括號內的 City = '台北市' OR City = '高雄縣',篩選出住在台北市或高雄縣的人,再從這些人中篩選薪水大於等於 30000 的人。因此「張一」雖然住在台北市,但薪水只有 25000,不符合條件而被排除。

結合 NOT 的複合查詢

我們也可以將 NOTANDOR 結合使用。例如,查詢不是住在台北市,而且薪水大於等於 30000 的顧客:

SELECT * FROM customers
WHERE NOT City = '台北市' AND Salary >= 30000;

查詢的結果如下:

C_IdNameCityAddressPhoneSalary
3李三高雄縣ZZ路300號07-1234567830000

只有「李三」同時滿足不住在台北市且薪水大於等於 30000 的條件。「王二」雖然不住在台北市,但薪水低於 30000,所以不符合條件。

邏輯運算子整理

運算子說明優先順序
NOT反轉條件結果,排除符合條件的資料最高
AND所有條件都必須成立
OR任一條件成立即可最低

在撰寫複雜的查詢條件時,建議多使用括號 () 來明確指定運算順序,不僅可以避免因優先順序而產生的邏輯錯誤,也能讓 SQL 語句更容易閱讀和維護。

延伸閱讀

留言功能已關閉。