SQL語法 - CTE 一般資料表運算式(COMMON TABLE EXPRESSION)

更新於 發佈於 閱讀時間約 6 分鐘

※ CTE是什麼?

在 SQL 中,我們經常需要從多個表中提取數據,因此會使用子查詢 (subquery)。為了讓子查詢更易讀並實現遞迴查詢,我們可以使用 Common Table Expression (CTE)。

CTE 是一個「暫存」且「具名」的結果集合,透過 AS 關鍵字將查詢結果暫時儲存。CTE 的主要用途有兩個:

  1. 簡化子查詢:讓查詢更易讀和維護。
  2. 遞迴查詢:用於處理層次結構數據或需要遞迴的情況。

簡單來說,CTE 幫助我們將複雜的查詢分解成更易於理解的部分,並且可以用來進行遞迴查詢,使得 SQL 查詢更簡潔和高效。

※ 語法

WITH cte_name AS (
SELECT column1, column2
FROM table_name
WHERE condition
)
SELECT column1, column2
FROM cte_name
WHERE another_condition;

語法解析:

  1. 定義 CTE:
    • 使用 WITH cte_name AS 開頭,給 CTE 一個名字(這裡是 cte_name)。
    • 在括號內寫一個查詢,這個查詢會生成一個臨時的結果集。
  2. 使用 CTE:
  • 在主查詢中,使用剛剛定義的 CTE 名字(cte_name)來引用這個臨時結果集。
  • 主查詢可以對這個臨時結果集進行進一步的查詢和篩選。

※ 解析順序

raw-image
  1. 宣告CTEs:首先,你會宣告一個或多個CTEs,每個CTE包含一個查詢語句(例如SELECT、INSERT、UPDATE、DELETE、CREATE等)。
  2. 使用CTEs:在宣告的CTE之後,你可以在後續的CTE或最終的查詢語句中使用這些CTEs。
  3. 依序解析:解析順序是依照CTE宣告的順序進行的。也就是說,第一個CTE會先被解析,然後是第二個,依此類推。
  4. 最終查詢:在所有CTE宣告完成後,你可以撰寫最終的查詢語句(例如SELECT、INSERT、UPDATE、DELETE、CREATE等),並且可以在這些查詢中使用之前宣告的所有CTEs。

這樣的解析順序確保了每個CTE都可以在後續的CTE或最終查詢中被引用和使用。

※ 實例- 找到最多歌單的使⽤者資訊

-- 宣告CTE來計算每個使用者的歌單數量
WITH UserPlaylistCount AS (
SELECT user_id, COUNT(*) AS playlist_count
FROM playlists
GROUP BY user_id
)

-- 使用CTE來找到擁有最多歌單的使用者
SELECT u.*
FROM users u
JOIN UserPlaylistCount upc ON u.id = upc.user_id
WHERE upc.playlist_count = (
SELECT MAX(playlist_count)
FROM UserPlaylistCount
);

解析順序如下:

  1. 宣告CTE:UserPlaylistCount 計算每個使用者的歌單數量。
  • SELECT user_id, COUNT(*) AS playlist_count:選擇 user_id 並計算每個 user_id 對應的歌單數量,並將這個計數命名為 playlist_count
  • FROM playlists:從 playlists 表格中檢索數據。
  • GROUP BY user_id:根據 user_id 進行分組,以計算每個使用者的歌單數量。

2. 使用CTE來找到擁有最多歌單的使用者

  • SELECT u.*:選擇 users 表格中的所有欄位。
  • FROM users u:從 users 表格中檢索數據,並將其命名為 u
  • JOIN UserPlaylistCount upc ON u.id = upc.user_id:將 users 表格與 UserPlaylistCount CTE 進行連接,條件是 users 表格中的 id 與 UserPlaylistCount CTE 中的 user_id 相等。
  • WHERE upc.playlist_count = (SELECT MAX(playlist_count) FROM UserPlaylistCount):篩選出擁有最多歌單的使用者。這裡使用了一個子查詢來找到 UserPlaylistCount CTE 中的最大 playlist_count,並將其與 upc.playlist_count 進行比較。

總結

這段SQL語句的目的是找到擁有最多歌單的使用者。首先,使用CTE計算每個使用者的歌單數量,然後在最終查詢中使用這個CTE來找到擁有最多歌單的使用者。

※ 與 Subquery 的比較

CTE(Common Table Expressions)

優點

  1. 可讀性高CTE可以將複雜的查詢分解成多個部分,使查詢更易於理解和維護。
  2. 子任務的邏輯清楚地分開CTE允許你將子任務查詢邏輯分成多個部分,這樣在解決問題時,可以更清晰地思考每個步驟。
  3. 減少重複:CTE可以在同一查詢中多次引用,避免重複代碼。
  4. 遞迴查詢:CTE支持遞迴查詢,這在處理層次結構數據時非常有用。

缺點:

  1. 性能:在某些情況下,CTE可能會比子查詢慢,特別是當CTE被多次引用時。
  2. 範圍限制:CTE的作用範圍僅限於它所屬的查詢塊,不能在其他查詢中重用。

子查詢(Subqueries)

優點:

  1. 靈活性:子查詢可以嵌套在SELECT、INSERT、UPDATE、DELETE等語句中,提供了很大的靈活性。
  2. 性能:在某些情況下,子查詢可能比CTE更快,特別是當子查詢只執行一次時。

缺點:

  1. 可讀性差:嵌套的子查詢可能會使查詢變得複雜且難以理解。
  2. 重用性差:子查詢通常不能在同一查詢中多次引用,這可能導致代碼重複。
  3. 調試困難:由於子查詢嵌套在主查詢中,調試和維護可能會變得更加困難。

總結

  • CTE 更適合用於需要高可讀性和邏輯分離的複雜查詢。
  • 子查詢 更適合用於需要靈活性和可能具有性能優勢的簡單查詢。



留言
avatar-img
留言分享你的想法!
avatar-img
奧莉薇走在成為後端工程師之路上
18會員
141內容數
全端網頁開發專業知識分享
2025/04/26
※ 場景: 即時聊天應用: 設計一個支持多房間功能的即時聊天平台,像 WhatsApp、LINE或Facebook Messenger,提供文字、語音、視訊聊天功能,方便管理群組聊天。 功能亮點:加入特別功能,例如可加入多房間功能、使用者名單、表情符號支持、文件分享或訊息已讀未讀狀態。 展示
2025/04/26
※ 場景: 即時聊天應用: 設計一個支持多房間功能的即時聊天平台,像 WhatsApp、LINE或Facebook Messenger,提供文字、語音、視訊聊天功能,方便管理群組聊天。 功能亮點:加入特別功能,例如可加入多房間功能、使用者名單、表情符號支持、文件分享或訊息已讀未讀狀態。 展示
2025/04/26
※ 先建立基本的express後端服務: 1.建立新資料夾:Socket mkdir socket 2.進入資料夾:Socket cd ​bsocket 3. 安裝 Experss 到專案中 npm init -y //初始化專案,建立 package.json 檔 npm insta
Thumbnail
2025/04/26
※ 先建立基本的express後端服務: 1.建立新資料夾:Socket mkdir socket 2.進入資料夾:Socket cd ​bsocket 3. 安裝 Experss 到專案中 npm init -y //初始化專案,建立 package.json 檔 npm insta
Thumbnail
2025/04/10
※ 什麼是 Socket.io:一個基於傳統 WebSocket API 之上的框架。 ※ Socket.io常用功能: Custom Events:在 Socket.io 中,開發者可以創建自己的事件來處理特定的功能或需求。 Rooms:分組的功能。每個連接的用戶(或稱為 socket)可
Thumbnail
2025/04/10
※ 什麼是 Socket.io:一個基於傳統 WebSocket API 之上的框架。 ※ Socket.io常用功能: Custom Events:在 Socket.io 中,開發者可以創建自己的事件來處理特定的功能或需求。 Rooms:分組的功能。每個連接的用戶(或稱為 socket)可
Thumbnail
看更多
你可能也想看
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
※ CTE是什麼? 在 SQL 中,我們經常需要從多個表中提取數據,因此會使用子查詢 (subquery)。為了讓子查詢更易讀並實現遞迴查詢,我們可以使用 Common Table Expression (CTE)。 CTE 是一個「暫存」且「具名」的結果集合,透過 AS 關鍵字將查詢結果暫時儲
Thumbnail
※ CTE是什麼? 在 SQL 中,我們經常需要從多個表中提取數據,因此會使用子查詢 (subquery)。為了讓子查詢更易讀並實現遞迴查詢,我們可以使用 Common Table Expression (CTE)。 CTE 是一個「暫存」且「具名」的結果集合,透過 AS 關鍵字將查詢結果暫時儲
Thumbnail
※ 何時該使用 JOIN? JOIN 使用的時機是:當你需要同時查詢一張以上的資料表的時候。 ※ SQL有哪些TABLE JOIN的方式? INNER JOIN LEFT JOIN RIGHT JOIN SELF JOIN ※ 使用 JOIN 的時候,我們需要考慮到: 我要使用哪一種
Thumbnail
※ 何時該使用 JOIN? JOIN 使用的時機是:當你需要同時查詢一張以上的資料表的時候。 ※ SQL有哪些TABLE JOIN的方式? INNER JOIN LEFT JOIN RIGHT JOIN SELF JOIN ※ 使用 JOIN 的時候,我們需要考慮到: 我要使用哪一種
Thumbnail
※ 別名: 目的在於提高SQL查詢的可讀性和簡潔性。 ※ 別名有兩種: Column Alias(列別名):在查詢結果中的某一列,取一個臨時的新名字。 Table Alias(表別名):給查詢中的表取一個短暫的新名字。 ※ Column Alias ※ 為什麼需要 Column A
Thumbnail
※ 別名: 目的在於提高SQL查詢的可讀性和簡潔性。 ※ 別名有兩種: Column Alias(列別名):在查詢結果中的某一列,取一個臨時的新名字。 Table Alias(表別名):給查詢中的表取一個短暫的新名字。 ※ Column Alias ※ 為什麼需要 Column A
Thumbnail
聚合函數 可以對資料的筆數、平均、最大、最小和加總的運算,提供查詢結果:如下表示: COUNT(Column):計算筆數,「*」是統計紀錄數。 AVG(Column):計算欄位平均值。 MAX(Column):計算欄位最大值。 MIN(Column):計算欄位最小值。 SUM(Colum
Thumbnail
聚合函數 可以對資料的筆數、平均、最大、最小和加總的運算,提供查詢結果:如下表示: COUNT(Column):計算筆數,「*」是統計紀錄數。 AVG(Column):計算欄位平均值。 MAX(Column):計算欄位最大值。 MIN(Column):計算欄位最小值。 SUM(Colum
Thumbnail
多條件查詢 AND運算子 SELECT *​ FROM your_table_name WHERE column1 LIKE '_value1%' AND column2 = number​2 OR運算子 SELECT *​ FROM your_table_name WHERE colu
Thumbnail
多條件查詢 AND運算子 SELECT *​ FROM your_table_name WHERE column1 LIKE '_value1%' AND column2 = number​2 OR運算子 SELECT *​ FROM your_table_name WHERE colu
Thumbnail
查詢範圍 指定欄位 SELECT column1, column2, column3,... FROM your_table_name 不重複欄位 SELECT DISTINCT column1 FROM your_table_name 欄位別名 SELECT column1 A
Thumbnail
查詢範圍 指定欄位 SELECT column1, column2, column3,... FROM your_table_name 不重複欄位 SELECT DISTINCT column1 FROM your_table_name 欄位別名 SELECT column1 A
Thumbnail
聚合函數 aggregate function
Thumbnail
聚合函數 aggregate function
Thumbnail
在資料庫管理中,SQL(Structured Query Language)是一種強大的工具,用於處理資料庫中的資料。本篇教學將介紹 SQL 中的基本操作,包括 SELECT、UPDATE、INSERT 和 DELETE,讓您能夠有效地查詢、更新、插入和刪除資料。
Thumbnail
在資料庫管理中,SQL(Structured Query Language)是一種強大的工具,用於處理資料庫中的資料。本篇教學將介紹 SQL 中的基本操作,包括 SELECT、UPDATE、INSERT 和 DELETE,讓您能夠有效地查詢、更新、插入和刪除資料。
Thumbnail
你知道 SELECT 除了回傳欄位、使用聚集函數外,還可以更進一步做加減乘除喔!這個系列是 QUERY 函式大解析的第六篇文章,如果還不知道什麼是 QUERY 的話,我還是很建議你從第一篇慢慢看、跟著我們的練習實際操作,就會更有概念囉~
Thumbnail
你知道 SELECT 除了回傳欄位、使用聚集函數外,還可以更進一步做加減乘除喔!這個系列是 QUERY 函式大解析的第六篇文章,如果還不知道什麼是 QUERY 的話,我還是很建議你從第一篇慢慢看、跟著我們的練習實際操作,就會更有概念囉~
Thumbnail
今天要介紹的是進階的 SELECT 功能,可以即時對 QUERY 的結果運算,迅速取得數值的平均、總和、最大值、最小值和數量,省去拉資料透視表(pivot table)的麻煩!
Thumbnail
今天要介紹的是進階的 SELECT 功能,可以即時對 QUERY 的結果運算,迅速取得數值的平均、總和、最大值、最小值和數量,省去拉資料透視表(pivot table)的麻煩!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News