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 子字串搜尋
參考來源
- 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 子字串搜尋。