返回文章列表

SQL查詢子句詳解與應用

本文探討 SQL 查詢中常用的 WHERE、GROUP BY、HAVING、QUALIFY、ORDER BY 和 LIMIT 等子句,搭配實際案例說明如何篩選、分組、排序和限制資料,並解釋 VALUES 子句建立臨時資料表的方法,有效提升 SQL 查詢技巧。

資料函式庫 SQL

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 子句還需要指定如何聯接這些資料表。

聯接多個資料表

以下是一個範例,聯接 NationRegion 資料表,以檢索國家的名稱和所屬區域的名稱:

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 查詢中的多個重要子句,包括 WHEREGROUP BYHAVING 子句,並透過例項來闡述其用法和功能。

使用 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_namemonth_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 子句

在某些情況下,我們需要在查詢中同時使用 WHEREHAVING 子句。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查詢中,各種子句扮演著至關重要的角色,用於過濾、排序和限制結果集。本篇文章將探討WHEREHAVINGQUALIFYORDER BYLIMIT等子句的用法和範例。

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 |
+
---
-
---
-
---
---
+
---
-
---
-
---
-
---
-
---
--+

內容解密:

  1. SELECT n_name, COUNT(*) AS number_of_suppliers:選擇國名並計算每個國家的供應商數量。
  2. FROM nation:從nation表中選擇資料。
  3. WHERE n_name LIKE '%A':過濾出國名以字母"A"結尾的國家。
  4. GROUP BY n_name:按國名分組資料。
  5. 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 |
+
---
-
---
-
---
-
---
-+
---
-
---
-
---
--+

內容解密:

  1. SELECT n_name, RANK() OVER (ORDER BY LENGTH(n_name) DESC) AS length_rank:選擇國名並根據國名的長度進行排名。
  2. FROM nation:從nation表中選擇資料。
  3. 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 |
| ... | ... |
+
---
-
---
-
---
-
---
-
---
-+
---
-
---
-
---
+

內容解密:

  1. SELECT s_name, s_acctbal:選擇供應商名稱和帳戶餘額。
  2. FROM supplier:從supplier表中選擇資料。
  3. 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 |
| ... | ... |
+
---
-
---
-
---
-
---
-
---
-+
---
-
---
-
---
+

內容解密:

  1. SELECT s_name, s_acctbal:選擇供應商名稱和帳戶餘額。
  2. FROM supplier:從supplier表中選擇資料。
  3. ORDER BY s_acctbal DESC:按帳戶餘額降序排序結果。
  4. LIMIT 10:僅傳回前10行結果。