Skip to content
All writing Part 03 of 09 · 一個操作,三種引擎
Engineering · 1 min read

可攜式 SQL 核心:到哪都能跑的那 80%

一次學會、到處能用的 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