text pattern matching with wildcards showing examples

資料庫 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 舖路。

發佈留言

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

High Quality

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Fast Delivery

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Best Warranty

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.