資料庫 SQL 入門(03):文字比對與常用過濾—LIKE(% / _)、BETWEEN、IS [NOT] NULL、IN

在掌握 SELECT / WHERE / ORDER BY 之後,下一步就是把篩選條件寫得更精準。本篇延續 COUNTRYCITY 表,帶你用四組常見工具處理日常查詢:

  • LIKE:用 %(任意長度)與 _(單一字元)做文字樣式比對。
  • BETWEEN:寫出**區間(含端點)**的過濾。
  • IS [NOT] NULL:正確處理空值(NULL 不是空字串或 0)。
  • IN:集合成員過濾,讓多值條件更簡潔。
    同時補充幾個實務眉角:大小寫與定序(collation)、索引可用性、日期區間寫法、NOT INNULL 的陷阱等,讓你的查詢既正確又有效率。

範例資料:國家表(COUNTRY)

idnamepopulationarea
1France66600000640680
2Germany80700000357000

這是我們將用於示範的國家資料表,包含國家的 ID、名稱、人口數量和面積資訊。

範例資料:城市表(CITY)

idnamecountry_idpopulationrating
1Paris122430005
2Berlin234600003

這是城市資料表,包含城市的 ID、名稱、所屬國家 ID、人口數量和評分資訊。我們將使用這兩個表來展示各種 SQL 查詢。

text pattern matching with wildcards showing examples

過濾輸出:文字運算符

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)。_ 代表任意單個字符。

Text pattern matching concept with SQL LIKE operator visualization

過濾輸出:其他運算符

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 的城市名稱。

SQL code on computer screen with database visualization

總結

  • LIKE 關鍵觀念
    • % 代表任意字元序列、_ 代表任意單一字元;如 name LIKE 'P%'name LIKE '_ublin'
    • 需要比對含 %_字面量時,用 ESCAPEWHERE 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,或用參數化陣列支援。
  • 實務強化
    • 正規化資料:去前後空白、統一大小寫與語系定序,索引才好用、比對才一致。
    • 大表查詢先縮小集合WHEREORDER BY),必要時加索引或物化檢視。
    • 維持可讀性:用別名、為運算欄位取 AS,並善用 IN / BETWEEN 取代冗長的 OR/多重比較。
    • 一律參數化查詢,避免 SQL 注入。

把這四組工具用熟,你就能把關鍵資料從海量紀錄中又快又準地撈出來,為後續的 JOIN / GROUP BY 舖路。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端