在掌握 SELECT / WHERE / ORDER BY
之後,下一步就是把篩選條件寫得更精準。本篇延續 COUNTRY
與 CITY
表,帶你用四組常見工具處理日常查詢:
- LIKE:用
%
(任意長度)與_
(單一字元)做文字樣式比對。 - BETWEEN:寫出**區間(含端點)**的過濾。
- IS [NOT] NULL:正確處理空值(
NULL
不是空字串或 0)。 - IN:集合成員過濾,讓多值條件更簡潔。
同時補充幾個實務眉角:大小寫與定序(collation)、索引可用性、日期區間寫法、NOT IN
與NULL
的陷阱等,讓你的查詢既正確又有效率。
範例資料:國家表(COUNTRY)
id | name | population | area |
1 | France | 66600000 | 640680 |
2 | Germany | 80700000 | 357000 |
… | … | … | … |
這是我們將用於示範的國家資料表,包含國家的 ID、名稱、人口數量和面積資訊。
範例資料:城市表(CITY)
id | name | country_id | population | rating |
1 | Paris | 1 | 2243000 | 5 |
2 | Berlin | 2 | 3460000 | 3 |
… | … | … | … | … |
這是城市資料表,包含城市的 ID、名稱、所屬國家 ID、人口數量和評分資訊。我們將使用這兩個表來展示各種 SQL 查詢。
過濾輸出:文字運算符
LIKE 運算符 – 百分比符號 (%)
SELECT name
FROM city
WHERE name LIKE 'P%'
OR name LIKE '%s';
獲取以 ‘P’ 開頭或以 ‘s’ 結尾的城市名稱。% 代表任意數量的字符(包括零個)。
LIKE 運算符 – 底線符號 (_)
SELECT name
FROM city
WHERE name LIKE '_ublin';
獲取任何字母後跟 ‘ublin’ 的城市名稱(如愛爾蘭的 Dublin 或波蘭的 Lublin)。_ 代表任意單個字符。
過濾輸出:其他運算符
BETWEEN
SELECT name
FROM city
WHERE population BETWEEN
500000 AND 5000000;
獲取人口在 50 萬到 500 萬之間的城市名稱。
IS NOT NULL
SELECT name
FROM city
WHERE rating IS NOT NULL;
獲取評分值不為空的城市名稱。
IN
SELECT name
FROM city
WHERE country_id IN
(1, 4, 7, 8);
獲取國家 ID 為 1、4、7 或 8 的城市名稱。
總結
- LIKE 關鍵觀念
%
代表任意字元序列、_
代表任意單一字元;如name LIKE 'P%'
、name LIKE '_ublin'
。- 需要比對含
%
或_
的字面量時,用ESCAPE
:WHERE name LIKE '50\%%' ESCAPE '\'
。 - 大小寫:依資料庫與定序而定;PostgreSQL 可用
ILIKE
做不分大小寫比對,或用函式與對應函式索引(如LOWER(name)
)。
- BETWEEN 是「含頭含尾」
population BETWEEN 500000 AND 5000000
會包含 500,000 與 5,000,000。- 日期區間建議半開區間避免邊界誤差:
date >= '2025-01-01' AND date < '2025-02-01'
。
- IS [NOT] NULL 正確處理空值
NULL
不能用= / !=
比較:用IS NULL / IS NOT NULL
。- 與「空字串」不同;請先釐清資料意義(必要時
NULLIF()
、COALESCE()
正規化)。
- IN / NOT IN 的用法與陷阱
- 多值條件用
IN
更簡潔:country_id IN (1,4,7,8)
。 NOT IN
遇到清單含 NULL 可能導致「全部為 UNKNOWN」→ 結果為空;保險作法改用NOT EXISTS
反連接。- 清單很長時,效能可能下降;可把清單放臨時表後
JOIN
,或用參數化陣列支援。
- 多值條件用
- 實務強化
- 先正規化資料:去前後空白、統一大小寫與語系定序,索引才好用、比對才一致。
- 大表查詢先縮小集合(
WHERE
再ORDER BY
),必要時加索引或物化檢視。 - 維持可讀性:用別名、為運算欄位取
AS
,並善用IN / BETWEEN
取代冗長的OR
/多重比較。 - 一律參數化查詢,避免 SQL 注入。
把這四組工具用熟,你就能把關鍵資料從海量紀錄中又快又準地撈出來,為後續的 JOIN / GROUP BY
舖路。