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 子字串搜尋
參考來源
- ClickHouse SQL Reference — https://clickhouse.com/docs/en/sql-reference
- Spark SQL Built-in Functions — https://spark.apache.org/docs/latest/api/sql/
Related: 回到跨引擎資料庫查詢總覽,或深入 count(*) vs count(欄位) 與 LIKE / ILIKE 子字串搜尋。