SQL 查詢子句是資料函式庫操作的核心,熟練掌握這些子句才能有效率地擷取所需資料。本文從基礎的 SELECT 子句開始,逐步介紹 WHERE、GROUP BY、HAVING 等子句的用法,並延伸至進階的 QUALIFY 子句,以及排序和限制結果的 ORDER BY 和 LIMIT 子句。透過這些子句的組合應用,可以精準地篩選、分組和排序資料,滿足各種複雜的查詢需求。同時,文章也示範瞭如何使用 VALUES 子句建立臨時資料表,方便進行測試和驗證。
SQL 查詢子句詳解
SELECT 子句
在 SQL 查詢中,SELECT 子句是唯一必要的子句,用於指定要檢索的資料欄位。以下是一個簡單的範例,傳回一個包含單一欄位的結果集:
SELECT 'Welcome to Snowflake SQL!';
輸出結果如下:
+
---
-
---
-
---
-
---
-
---
-
---
-
---
--+
| 'WELCOME TO SNOWFLAKE SQL!' |
|
---
-
---
-
---
-
---
-
---
-
---
-
---
--|
| Welcome to Snowflake SQL! |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
--+
從資料表中檢索欄位
接下來,我們將撰寫一個查詢,以檢索 Nation 資料表中的部分欄位。首先,讓我們檢視 Nation 資料表的結構:
DESCRIBE TABLE nation;
輸出結果如下:
+
---
-
---
-
---
--+
---
-
---
-
---
---
+
---
-
---
-+
---
-
---
+
---
-
---
--+
| name | type | kind | null? | default |
|
---
-
---
-
---
--+
---
-
---
-
---
---
+
---
-
---
-+
---
-
---
+
---
-
---
--|
| N_NATIONKEY | NUMBER(38,0) | COLUMN | N | NULL |
| N_NAME | VARCHAR(25) | COLUMN | N | NULL |
| N_REGIONKEY | NUMBER(38,0) | COLUMN | N | NULL |
| N_COMMENT | VARCHAR(152) | COLUMN | Y | NULL |
+
---
-
---
-
---
--+
---
-
---
-
---
---
+
---
-
---
-+
---
-
---
+
---
-
---
--+
現在,我們來檢索 Nation 資料表中的前三個欄位:
SELECT n_nationkey, n_name, n_regionkey
FROM nation;
輸出結果如下:
+
---
-
---
-
---
--+
---
-
---
-
---
-
---
-+
---
-
---
-
---
--+
| N_NATIONKEY | N_NAME | N_REGIONKEY |
|
---
-
---
-
---
--+
---
-
---
-
---
-
---
-+
---
-
---
-
---
--|
| 0 | ALGERIA | 0 |
| 1 | ARGENTINA | 1 |
| 2 | BRAZIL | 1 |
| ... | ... | ... |
+
---
-
---
-
---
--+
---
-
---
-
---
-
---
-+
---
-
---
-
---
--+
SELECT 子句的內容
SELECT 子句不僅限於資料表中的欄位,還可以包含以下內容:
- 直接值(Literals),例如數字
99或字串'Welcome to Snowflake SQL!' - 表示式(Expressions),例如
n_nationkey * 100 - 內建函式呼叫(Built-in function calls),例如
concat(n_nationkey, ' : ', n_name) - 使用者自訂函式呼叫(User-defined function calls),使用 Java、Python、JavaScript 或 Snowflake Scripting 語言建立
欄位別名(Column Aliases)
使用欄位別名可以為查詢結果中的欄位指定自訂名稱,尤其是在使用直接值、表示式或函式呼叫時非常有用。以下是一個範例:
SELECT
'Welcome to Snowflake SQL!' AS welcome_message,
5 * 3.1415927 AS circle_circumference,
dayname(current_date) AS day_of_week;
輸出結果如下:
+
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-
---
--+
| WELCOME_MESSAGE | CIRCLE_CIRCUMFERENCE | DAY_OF_WEEK |
|
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-
---
--|
| Welcome to Snowflake SQL! | 15.7079635 | Fri |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
+
---
-
---
-
---
-
---
-
---
---
+
---
-
---
-
---
--+
移除重複值(Removing Duplicates)
在某些情況下,查詢可能會傳回重複的值。使用 DISTINCT 關鍵字可以移除重複值,只傳回唯一的資料。以下是一個範例:
SELECT DISTINCT n_regionkey
FROM nation;
輸出結果如下:
+
---
-
---
-
---
--+
| N_REGIONKEY |
|
---
-
---
-
---
--|
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
+
---
-
---
-
---
--+
FROM 子句
FROM 子句用於指定要檢索資料的資料表。它可以包含一個或多個資料表。當包含多個資料表時,FROM 子句還需要指定如何聯接這些資料表。
聯接多個資料表
以下是一個範例,聯接 Nation 和 Region 資料表,以檢索國家的名稱和所屬區域的名稱:
SELECT
n.n_nationkey,
n.n_name AS nation_name,
r.r_name AS region_name
FROM nation n
JOIN region r
ON n.n_regionkey = r.r_regionkey;
輸出結果如下:
+
---
-
---
-
---
--+
---
-
---
-
---
-
---
-+
---
-
---
-
---
--+
| N_NATIONKEY | NATION_NAME | REGION_NAME |
|
---
-
---
-
---
--+
---
-
---
-
---
-
---
-+
---
-
---
-
---
--|
| 0 | ALGERIA | AFRICA |
| 1 | ARGENTINA | AMERICA |
| 2 | BRAZIL | AMERICA |
| ... | ... | ... |
+
---
-
---
-
---
--+
---
-
---
-
---
-
---
-+
---
-
---
-
---
--+
使用 VALUES 子句生成資料集
Snowflake 允許使用 FROM 子句中的 VALUES 子句生成臨時資料集,而無需從現有的資料表中檢索資料。這對於建立小型測試資料集非常有用。
SELECT *
FROM (VALUES (1, 'John'), (2, 'Jane')) AS t(id, name);
輸出結果如下:
+
---
-+
---
---
+
| ID | NAME |
|
---
-+
---
---
|
| 1 | John |
| 2 | Jane |
+
---
-+
---
---
+
SQL 查詢子句詳解
在資料函式庫查詢中,SQL 的查詢子句扮演著至關重要的角色,用於對資料進行篩選、分組和排序。本文將探討 SQL 查詢中的多個重要子句,包括 WHERE、GROUP BY 和 HAVING 子句,並透過例項來闡述其用法和功能。
使用 VALUES 建立臨時資料表
在某些情況下,我們需要在沒有實際資料表的情況下生成一些臨時資料。SQL 允許我們使用 VALUES 子句來建立一個臨時資料表。例如,若要列出月份名稱和對應的數字,可以使用以下查詢:
SELECT *
FROM (VALUES
('JAN', 1),
('FEB', 2),
('MAR', 3),
('APR', 4),
('MAY', 5),
('JUN', 6),
('JUL', 7),
('AUG', 8),
('SEP', 9),
('OCT', 10),
('NOV', 11),
('DEC', 12)
) AS months (month_name, month_num);
內容解密:
此查詢使用 VALUES 子句建立了一個名為 months 的臨時資料表,包含 month_name 和 month_num 兩個欄位。該查詢輸出了 12 個月的名稱和對應的月份數字。
WHERE 子句
WHERE 子句用於篩選資料表中的資料,只傳回符合特定條件的列。例如,若要從 nation 資料表中找出名稱以字母 “U” 開頭的國家,可以使用以下查詢:
SELECT n_name
FROM nation
WHERE n_name LIKE 'U%';
內容解密:
此查詢使用了 WHERE 子句,並透過 LIKE 運算元篩選出 n_name 以 “U” 開頭的國家。結果傳回了 “UNITED KINGDOM” 和 “UNITED STATES”。
GROUP BY 子句
GROUP BY 子句用於將資料分組,通常與聚合函式(如 COUNT()、SUM() 等)結合使用。例如,若要計算每個地區的國家數量,可以使用以下查詢:
SELECT r_name AS region_name,
COUNT(*) AS number_of_countries
FROM nation
JOIN region ON nation.n_regionkey = region.r_regionkey
GROUP BY r_name;
內容解密:
此查詢首先將 nation 資料表與 region 資料表進行連線,然後使用 GROUP BY 子句按地區名稱進行分組,並使用 COUNT() 函式計算每個地區的國家數量。
HAVING 子句
HAVING 子句用於對分組後的資料進行篩選,通常與聚合函式結合使用。例如,若要找出供應商數量超過 400 的國家,可以使用以下查詢:
SELECT n_name AS nation_name,
COUNT(*) AS number_of_suppliers
FROM supplier
JOIN nation ON supplier.s_nationkey = nation.n_nationkey
GROUP BY n_name
HAVING COUNT(*) > 400;
內容解密:
此查詢首先將 supplier 資料表與 nation 資料表進行連線,然後按國家名稱進行分組,並使用 COUNT() 函式計算每個國家的供應商數量。最後,HAVING 子句篩選出供應商數量大於 400 的國家。
結合 WHERE 和 HAVING 子句
在某些情況下,我們需要在查詢中同時使用 WHERE 和 HAVING 子句。WHERE 子句在分組前對資料進行篩選,而 HAVING 子句在分組後對結果進行篩選。例如:
SELECT n_name AS nation_name,
COUNT(*) AS number_of_suppliers
FROM supplier
JOIN nation ON supplier.s_nationkey = nation.n_nationkey
WHERE n_regionkey = 1
GROUP BY n_name
HAVING COUNT(*) > 400;
內容解密:
此查詢首先根據 n_regionkey 對資料進行篩選,然後按國家名稱進行分組,並計算每個國家的供應商數量。最後,篩選出供應商數量大於 400 的國家。
SQL查詢子句詳解
在SQL查詢中,各種子句扮演著至關重要的角色,用於過濾、排序和限制結果集。本篇文章將探討WHERE、HAVING、QUALIFY、ORDER BY和LIMIT等子句的用法和範例。
WHERE子句
WHERE子句用於根據特定條件過濾資料行。它允許您指定條件,以確保只有符合這些條件的資料行才會被包含在結果集中。
範例:
SELECT n_name, COUNT(*) AS number_of_suppliers
FROM nation
WHERE n_name LIKE '%A'
GROUP BY n_name
HAVING COUNT(*) > 400;
+
---
-
---
-
---
---
+
---
-
---
-
---
-
---
-
---
--+
| NATION_NAME | NUMBER_OF_SUPPLIERS |
|
---
-
---
-
---
---
+
---
-
---
-
---
-
---
-
---
--|
| ARGENTINA | 413 |
| CHINA | 407 |
| INDIA | 415 |
| CANADA | 412 |
| RUSSIA | 401 |
| INDONESIA | 405 |
| SAUDI ARABIA | 411 |
| ALGERIA | 420 |
+
---
-
---
-
---
---
+
---
-
---
-
---
-
---
-
---
--+
內容解密:
SELECT n_name, COUNT(*) AS number_of_suppliers:選擇國名並計算每個國家的供應商數量。FROM nation:從nation表中選擇資料。WHERE n_name LIKE '%A':過濾出國名以字母"A"結尾的國家。GROUP BY n_name:按國名分組資料。HAVING COUNT(*) > 400:僅保留供應商數量大於400的國家。
QUALIFY子句
QUALIFY子句用於根據視窗函式的結果過濾資料行。視窗函式可用於多種用途,包括排名。
範例:
SELECT n_name,
RANK() OVER (ORDER BY LENGTH(n_name) DESC) AS length_rank
FROM nation
QUALIFY length_rank <= 5;
+
---
-
---
-
---
-
---
-+
---
-
---
-
---
--+
| N_NAME | LENGTH_RANK |
|
---
-
---
-
---
-
---
-+
---
-
---
-
---
--|
| UNITED KINGDOM | 1 |
| UNITED STATES | 2 |
| SAUDI ARABIA | 3 |
| MOZAMBIQUE | 4 |
| ARGENTINA | 5 |
| INDONESIA | 5 |
+
---
-
---
-
---
-
---
-+
---
-
---
-
---
--+
內容解密:
SELECT n_name, RANK() OVER (ORDER BY LENGTH(n_name) DESC) AS length_rank:選擇國名並根據國名的長度進行排名。FROM nation:從nation表中選擇資料。QUALIFY length_rank <= 5:僅保留排名前5的國家。
ORDER BY子句
ORDER BY子句用於對結果集進行排序。可以根據一個或多個欄位進行排序,並指定升序(ASC)或降序(DESC)。
範例:
SELECT s_name, s_acctbal
FROM supplier
ORDER BY s_acctbal DESC;
+
---
-
---
-
---
-
---
-
---
-+
---
-
---
-
---
+
| S_NAME | S_ACCTBAL |
|
---
-
---
-
---
-
---
-
---
-+
---
-
---
-
---
|
| Supplier#000006343 | 9998.20 |
| Supplier#000002522 | 9997.04 |
| Supplier#000000892 | 9993.46 |
| ... | ... |
+
---
-
---
-
---
-
---
-
---
-+
---
-
---
-
---
+
內容解密:
SELECT s_name, s_acctbal:選擇供應商名稱和帳戶餘額。FROM supplier:從supplier表中選擇資料。ORDER BY s_acctbal DESC:按帳戶餘額降序排序結果。
LIMIT子句
LIMIT子句用於限制結果集的行數。可以指定傳回的行數和起始偏移量。
範例:
SELECT s_name, s_acctbal
FROM supplier
ORDER BY s_acctbal DESC
LIMIT 10;
+
---
-
---
-
---
-
---
-
---
-+
---
-
---
-
---
+
| S_NAME | S_ACCTBAL |
|
---
-
---
-
---
-
---
-
---
-+
---
-
---
-
---
|
| Supplier#000006343 | 9998.20 |
| Supplier#000002522 | 9997.04 |
| Supplier#000000892 | 9993.46 |
| ... | ... |
+
---
-
---
-
---
-
---
-
---
-+
---
-
---
-
---
+
內容解密:
SELECT s_name, s_acctbal:選擇供應商名稱和帳戶餘額。FROM supplier:從supplier表中選擇資料。ORDER BY s_acctbal DESC:按帳戶餘額降序排序結果。LIMIT 10:僅傳回前10行結果。