什麼是SQL WHERE子句?基礎語法與實用範例全解析

作者:帆軟行業化團隊

2025年7月31日 · 15 min read

來源:帆軟
20988db54750475ea857e05d3aa814c8.webp

SQL WHERE子句是你在查詢資料時,根據指定條件篩選結果的工具。你常常會遇到需要找出特定年齡、分數或名稱的資料,這時就會用到SQLWHERE條件。WHERE子句在資料庫查詢中非常常見,只要你合理設計條件,能有效提升查詢效率。例如,你將運算移至常數一側,讓索引發揮作用;避免在欄位上直接做運算,能減少全表掃描,查詢速度更快。

  • WHERE子句用來根據條件篩選資料,讓查詢結果更精確且有效率。
  • 常用運算子包括比較運算子、IN、BETWEEN、LIKE和NULL判斷,能滿足多種查詢需求。
  • 可用AND、OR、NOT和括號組合多個條件,打造靈活且複雜的查詢邏輯。
  • 子查詢、函式和CASE語法能提升查詢彈性,搭配GROUP BY和HAVING可進行進階資料分析。
  • 注意NULL判斷、資料型別一致與語法正確,避免查詢錯誤並提升安全性。

基本語法

92eec1c2949d406297b6c4bef6e67305.webp

語法結構

你在寫SQL查詢時,WHERE子句會幫助你根據條件篩選資料。WHERE子句的標準結構很簡單,通常放在FROM子句之後。你可以參考以下語法:

SELECT 欄位名稱
FROM 資料表名稱
WHERE 條件式
;

小提醒
WHERE子句後面要接一個條件式,這個條件式可以是欄位和數值的比較。例如:WHERE City = 'Taipei'。如果你的欄位名稱有空格或特殊字元(像是Access SQL),記得要用方括號把欄位名稱括起來。

你可以用WHERE子句來設定一個或多個條件。這樣查詢結果只會顯示你想要的資料。WHERE子句不是每次查詢都必須寫,但只要你想要篩選資料,就一定會用到它。

  • WHERE子句包含運算子WHERE,後面接著一個運算式。
  • 運算式可以是欄位與值的比較。
  • WHERE子句位於FROM子句之後。

SELECT與WHERE

你在寫SQL查詢時,最常見的語法順序是:SELECTFROMWHERE。WHERE子句的主要功能是限制查詢結果,讓你只看到符合條件的資料。舉個例子:

SELECT *
FROM Customers
WHERE City = 'Taipei'

這個查詢會從Customers資料表中,找出所有城市是台北的客戶。你可以看到,WHERE子句緊接在FROM子句之後。你也可以在WHERE子句中加入多個條件,像是用AND或OR來組合,進一步縮小查詢範圍。

重點整理

  • WHERE子句不是SELECT語句的必要元素。
  • 只要你需要篩選資料,WHERE子句就非常重要。
  • WHERE子句的位置一定在FROM子句之後。

你只要掌握這個基本語法,就能開始用SQL查詢你想要的資料。下個章節會介紹更多常見的條件寫法,讓你查詢更靈活!

常見條件

91611d9f54ca4e04acde7888b234a5df.webp

在學習SQLWHERE條件時,你會發現有許多不同的運算子可以幫助你精確篩選資料。這些條件讓你能夠根據不同需求,快速找到想要的資料列。以下將介紹幾種最常見的條件類型,並搭配簡單範例,讓你更容易理解。

比較運算子

你可以利用比較運算子來判斷欄位值與特定數值之間的關係。這些運算子在SQLWHERE條件中非常常見,適合用來篩選數字、日期或文字。

常見的比較運算子有:

  • 等於(=)
  • 不等於(<>)
  • 大於(>)
  • 小於(<)
  • 大於等於(>=)
  • 小於等於(<=)

舉例來說,假設你想查詢年齡大於18歲的學生,可以這樣寫:

SELECT * FROM students WHERE age > 18;

如果你想找出分數等於100分的學生,可以這樣查詢:

SELECT * FROM students WHERE score = 100;

這些比較運算子可以單獨使用,也能搭配AND、OR等邏輯運算子,組合出更複雜的SQLWHERE條件。

小提醒
比較運算子不只適用於數字,也能用在日期和文字欄位。

IN與NOT IN

當你需要查詢欄位值是否屬於某個清單時,IN運算子會非常好用。你可以一次指定多個值,讓SQLWHERE條件變得簡潔。NOT IN則用來排除清單中的值。

常見應用情境如下:

  1. 查詢id為1、2、3、4的裝置資料

    SELECT * FROM device WHERE id IN (1, 2, 3, 4);
    
  2. 查詢id不是1、2、3、4的裝置資料:

    SELECT * FROM device WHERE id NOT IN (1, 2, 3, 4);
    
  3. 你也可以搭配子查詢,像是找出出版過商業書籍的出版商名稱:

    SELECT pub_name FROM publisher WHERE pub_id IN (SELECT pub_id FROM titles WHERE type = 'business');
    

IN與NOT IN能大幅簡化多條件查詢,讓SQLWHERE條件更容易閱讀與維護。當你要排除或包含多個值時,這兩個運算子會是你的好幫手。

BETWEEN

BETWEEN運算子適合用來查詢一個範圍內的資料。你可以用它來找出介於兩個數值、日期或字串之間的資料。BETWEEN包含起始值與結束值。

舉例來說,假設你想查詢分數在60到80分之間的學生:

SELECT * FROM students WHERE score BETWEEN 60 AND 80;

BETWEEN不僅讓語法更簡潔,也能有效利用資料庫的索引,提升查詢效率。當你需要篩選一個明確範圍時,BETWEEN會讓SQLWHERE條件更直觀。

小技巧
在設計索引時,BETWEEN條件能幫助你更快找到資料,減少資料庫負擔。

LIKE

如果你想查詢部分符合某個字串的資料,可以使用LIKE運算子。LIKE常用於模糊查詢,例如找出名字開頭是「王」的學生:

SELECT * FROM students WHERE name LIKE '王%';

你也可以用「_」代表單一字元,「%」代表任意長度的字元。例如,查詢名字中有「明」這個字的學生:

SELECT * FROM students WHERE name LIKE '%明%';

LIKE讓你能夠靈活搜尋文字資料,適合用在姓名、地址、產品名稱等欄位。

NULL判斷

在資料庫中,NULL代表沒有值。你不能用「= NULL」來判斷欄位是否為空,而是要用IS NULL或IS NOT NULL。

舉例來說,查詢還沒有填寫電話號碼的學生:

SELECT * FROM students WHERE phone IS NULL;

如果你想找出有填寫電話號碼的學生,可以這樣寫:

SELECT * FROM students WHERE phone IS NOT NULL;

NULL判斷在資料清理與資料完整性檢查時非常重要。你可以利用這個條件,確保查詢結果的正確性。

注意
NULL不是0,也不是空字串。你必須用正確的語法來判斷。

這些常見條件讓你能靈活運用SQLWHERE條件,根據不同需求快速找到所需資料。只要多加練習,你就能熟練掌握各種查詢技巧。

SQLWHERE條件組合

當你需要查詢更精確的資料時,單一條件常常不夠用。你可以利用SQLWHERE條件組合,將多個條件一起使用,建立複雜查詢。這樣你能更靈活地篩選資料,找到真正需要的結果。

AND與OR

你可以用AND運算子同時滿足多個條件。例如,你想找出年齡大於18歲且分數超過80分的學生:

SELECT * FROM students WHERE age > 18 AND score > 80;

AND會要求所有條件都成立,資料才會被選出。相反地,OR運算子只要有一個條件成立就會選出資料。例如:

SELECT * FROM students WHERE age < 18 OR score = 100;

這個查詢會找出年齡小於18歲或分數等於100分的學生。你可以根據需求靈活組合AND與OR,讓SQLWHERE條件更強大。

小提醒
當你組合多個條件時,請注意條件的邏輯順序,避免查詢結果不如預期。

NOT

NOT運算子可以反轉條件。例如,你想找出不是台北的客戶:

SELECT * FROM customers WHERE NOT city = 'Taipei';

NOT也能搭配IN、BETWEEN等運算子,讓SQLWHERE條件更有彈性。你可以排除不需要的資料,讓查詢更精確。

括號優先順序

當你同時使用AND、OR、NOT時,SQL會依照優先順序執行。NOT優先於AND,AND優先於OR。你可以用括號明確指定執行順序,避免邏輯錯誤。例如:

SELECT * FROM students WHERE (age > 18 OR score = 100) AND city = 'Taipei';

這個查詢會先判斷括號內的條件,再與city條件一起篩選。括號就像數學運算一樣,能幫助你控制條件的執行順序。你在寫程式時,常常會用括號包住多行程式碼,確保執行正確。SQLWHERE條件組合也一樣,括號能讓查詢更清楚、更安全。

  • SQL Server查詢最佳化器能處理多層次的SQLWHERE條件組合。它會先根據條件分割資料,再利用索引加速搜尋。這些技術讓你即使查詢很複雜,也能保持高效率。
  • 你可以利用參數化查詢與批次模式處理,提升複雜查詢的效能。只要善用AND、OR、NOT和括號,SQLWHERE條件就能滿足各種查詢需求。

常見錯誤
忘記加括號或誤用邏輯運算子,會導致查詢結果不正確。你應該養成檢查條件組合的習慣,確保查詢邏輯正確。

進階應用

子查詢

你在查詢資料時,常常會遇到需要根據另一個資料表的結果來篩選。這時,子查詢就能發揮很大作用。你可以在SQLWHERE條件中加入子查詢,解決多種查詢問題:

  1. 你可以用IN、ANY、ALL、EXISTS等語法,根據子查詢的結果來限制外部查詢的資料列。
  2. 你能用EXISTS來測試某個條件是否存在,只有當子查詢有資料時,外部查詢才會顯示該筆資料。
  3. 當子查詢只回傳一個值時,你可以直接用來和外部欄位比較,處理複雜的條件判斷。
  4. 子查詢也能用在UPDATE、DELETE、INSERT等語句的WHERE子句,讓你根據動態條件操作資料。
  5. 如果你需要根據另一個資料表的內容動態篩選資料,子查詢會是很靈活的解決方案。

函式與CASE

你可以在WHERE子句中使用SQL內建函式,像是UPPER、LOWER、LEN等,來處理文字或數值。這樣你能直接在查詢時轉換資料格式或進行運算。你也能用CASE語法,根據不同條件給出不同的判斷結果。例如,你想根據分數自動分類學生等級,就能在SQLWHERE條件裡結合CASE語法,讓查詢更有彈性。

與GROUP BY、HAVING結合

你在進行資料分組時,常會用到GROUP BY和HAVING。WHERE子句會先過濾原始資料,然後GROUP BY把資料分組。分組後,如果你還想根據彙總結果進一步篩選,就要用HAVING子句。你可以在HAVING裡使用AND、OR等邏輯運算子,靈活設定多個條件。GROUP BY的欄位順序會影響分組層級,NULL值會被歸為同一組。記得,GROUP BY不會自動排序結果,如果需要排序要加ORDER BY。

小提醒
你善用SQLWHERE條件搭配子查詢、函式、CASE和分組語法,能大幅提升查詢效率與精確度,讓資料分析更簡單。

注意事項

NULL陷阱

你在使用WHERE子句時,NULL值常常會讓查詢結果出現意外。NULL不是0,也不是空字串。你不能直接用「= NULL」來比較。請特別注意以下幾點:

  • 當查詢參數為NULL時,代表該條件不限制。你需要用IF判斷參數是否為NULL,決定是否加入WHERE條件,避免條件被忽略。
  • NULL值無法直接比較,會讓條件判斷結果變成False或Unknown,查詢結果可能不正確。
  • 使用NOT IN時,若欄位中有NULL,整個條件會失效,導致查詢結果異常。
  • 你可以將NULL轉為空白或排除NULL資料,這樣能避免比較錯誤。
  • SQL的三值邏輯讓NULL既不是True也不是False,所以你必須特別處理。

小提醒:只要欄位有NULL,任何比較都可能出錯。你要用IS NULLIS NOT NULL來判斷。

型別差異

你在比較不同資料型別時,容易遇到問題。舉例來說,nchar型別的欄位長度不足時,系統會自動補空白。你直接用等號比較時,常常找不到資料。建議你用Trim()函數去除空白再比對。Contains()函數帶有LIKE的模糊比對效果,也要小心使用。

  1. 數字型欄位和文字型欄位無法直接JOIN或比較。
  2. 你可以用LIKE關鍵字進行模糊比對。
  3. 如果要比較不同型別的欄位,可以寫成WHERE field1 LIKE field2

注意:型別不符會讓查詢失敗或結果不正確。你要確認欄位型別一致。

語法錯誤

你在寫WHERE子句時,常見語法錯誤如下:

  1. 子查詢回傳多筆資料卻用在比較運算子中,會導致錯誤。子查詢必須只回傳一個值。
  2. 子查詢缺少WHERE條件,容易回傳多筆資料,造成語法錯誤。
  3. 直接在WHERE子句中寫子查詢,語法容易混亂,建議用JOIN或FROM子句暫存表。

SQL WHERE子句如果沒有用PreparedStatement分離指令和輸入資料,容易被SQL注入攻擊。當使用者輸入特殊字串時,整個WHERE條件可能被繞過,所有資料都會被查出。你應該用PreparedStatement來確保查詢安全。

小提醒:不同資料庫系統對WHERE子句的支援略有差異。你要查閱官方文件,確保語法正確。

 

你已經學會SQL WHERE子句的核心功能。WHERE子句能幫助你精確篩選資料,提升查詢效率。多練習條件組合,根據臺灣研究,這樣能讓查詢更貼近你的需求,也提升準確度。你在大型資料庫查詢時,正確使用WHERE子句能大幅提升效能,避免不必要的全表掃描。WHERE子句還能加強資料安全,讓你只看到被授權的資料。

小提醒:多注意NULL判斷、型別一致與語法細節,善用WHERE子句,查詢會更快更安全!

FAQ

什麼時候需要使用WHERE子句?

你只要想要從資料表中挑選特定資料,就需要用WHERE子句。這樣可以避免查詢出全部資料,讓結果更精確。

WHERE子句可以搭配哪些運算子?

你可以搭配=、<>、>、<、>=、<=、IN、BETWEEN、LIKE、IS NULL等運算子。這些運算子讓你靈活設定查詢條件。

LIKE和=有什麼不同?

=用來精確比對欄位值。LIKE可以模糊搜尋,支援%和_等萬用字元。你想找部分符合的資料時,用LIKE會更方便。

如何判斷欄位值為NULL?

你必須用IS NULLIS NOT NULL來判斷。不能用= NULL,這樣查詢不會有結果。

SELECT * FROM students WHERE phone IS NULL;

帆軟產品免費試用

企業戰情室報表軟體

企業戰情室報表軟體

複雜報表/戰情室/資料填報/數位孿生

企業商業智慧BI軟體

企業商業智慧BI軟體

自助資料處理/Dashboard/探索分析

一站式資料整合平台

一站式資料整合平台

資料同步/ETL資料開發/API資料服務

免費資源下載

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

我們很樂意傾聽你的需求,解答您的疑問,並提供專業建議, 助力您的企業實現智慧轉型!

×

意見回饋

姓名

電郵

公司

國家/地區

-- select an option --

電話

投訴原因

請選擇投訴原因

代理商問題
產品問題
技術支援服務問題
專案問題
銷售問題
商務問題
行銷問題
其他

投訴內容