Skip to content
All writing Part 03 of 09 · [object Object]
Engineering · 1 min read

可攜式 SQL 核心:八成到哪都能用

一次學會、到處能用的 SQL:聚合、CASE WHEN、GROUP BY / HAVING / DISTINCT,以及 IN / BETWEEN / LIKE / IS NULL 這些 ClickHouse、Spark 與多數引擎共通的 predicate。

先把可以「一次學會、到處能用」的部分抓出來:ClickHouse、Spark、以及大多數支援 SQL 的引擎都吃這一套,剩下的才是各家特有的寫法。

Aggregation

  • count(*) / sum() / avg() / min() / max() — 核心聚合。
    • 除了 count(*),其餘都會忽略 NULL 值。→ count(*) vs count(欄位)
    • 可以把 * 想成 whitelist,也就是會「包括 null value」。
  • CASE WHEN ... THEN ... ELSE ... END — 可攜的條件式。

文字處理

  • upper() / lower() / trim() — 文字正規化。
  • length(str) — 字元長度。

Clause

  • 有些太基礎的就不談,像是 SELECT/FROM/WHERE
  • GROUP BY / HAVING / DISTINCT
    • DISTINCT:把結果裡重複的 row 去掉,每一種相異的欄位組合只保留一筆。
    • GROUP BY:把值相同的 row 收攏成一組,讓每個聚合(count、sum…)以「組」為單位計算,而不是對整張表算一次。
    • HAVING:在資料被 GROUP BY 之後,才對結果做過濾。

Predicate

  • IN (...) / BETWEEN / LIKE, ILIKE / IS NULL
    • BETWEEN:頭尾皆含(inclusive),數字、文字、日期都適用。
    • IS NULL:「不能」寫 xxx = NULL。(原因:NULL 代表「未知」,在 SQL 的三值邏輯下,任何跟它的比較——包括 = NULL——都會得到 NULL 而非 TRUE,該列永遠不會被選出;必須用 IS NULL / IS NOT NULL。)
    • LIKE / ILIKE 的字串比對細節 → LIKE / ILIKE 子字串搜尋

參考來源

Related: 回到跨引擎資料庫查詢總覽,或深入 count(*) vs count(欄位)LIKE / ILIKE 子字串搜尋

Tags #sql #databases
// connect

Be brave | Be wise | Be grateful

21 BreakinCode

// elsewhere
LinkedInMedium (lang: en)Youtube
wh:~$William Hung· © 2026 Taipei · GMT+8 · Available for collaboration