Skip to content
所有文章 ‹ Part 03 of 09 · 一個操作,三種引擎
工程 · 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 而不是 TRUE,那一列永遠選不出來。這也適用於 = NULL。所以得用 IS NULL / IS NOT NULL。
    • LIKE / ILIKE 的字串比對細節 → LIKE / ILIKE 子字串搜尋

參考來源

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

↑↓ 移動 ↵ 開啟 esc 關閉