国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

SQL 查詢之公用表表達式(CTE)

數據庫 其他數據庫
在關系型數據庫中,表示數據層級結構的表很常見,例如,上下級關系、父子組件關系等。為了在這些層級結構中進行從上到下或從下到上的遍歷,可以使用遞歸 CTE。

CTE 的全稱是 common table expression,即公用表表達式,它可以簡化 SQL 查詢代碼。CTE 是可命名的子查詢,它是在 SQL 查詢執行期間臨時創建的,包含列與記錄的虛擬表。CTE 只能被調用它的主查詢訪問,主查詢執行完畢后會被刪除。

CTE 可以簡化查詢語句

CTE的基礎語法如下。

1WITH my_cte AS (
2  SELECT a,b,c
3  FROM T1
4)
5SELECT a,c
6FROM my_cte
7WHERE ....

CTE 語句以 WITH 關鍵字開始,所以 CTE 又被稱為 WITH 語句。在 WITH 關鍵字之后是 CTE 的名字;在 AS 關鍵字之后的括號里寫入要實現的查詢語句。

在上例中,CTE 的名字是 my_cte,查詢語句為 SELECT a,b,c FROM T1。

主查詢在定義 CTE 語句的括號后面。定義 CTE 之后,即可在主查詢中通過 CTE 的名字對其進行引用。主查詢也稱為外部查詢,在這個示例中是 SELECT a,c FROM my_cte WHERE ...。

簡單的 CTE 示例

本文中的例子都基于以下這個 sales 表,這個表模擬了一家連鎖書店的銷售數據,示例如下。

示例數據示例數據

生成 sales 表的 SQL 代碼如下。

1-- 創建名為sales的表
 2CREATE TABLE sales (
 3    branch VARCHAR(50),
 4    date DATE,
 5    seller VARCHAR(50),
 6    item VARCHAR(50),
 7    quantity INT,
 8    unit_price DECIMAL(10, 2)
 9);
10
11-- 插入數據
12INSERT INTO sales (branch, date, seller, item, quantity, unit_price)
13VALUES
14    ('Beijing-1', '2024-06-07', 'Zhangsan', 'SQL Data Analysis', 1, 80),
15    ('Shanghai-1', '2024-06-06', 'Lisi', 'Python Data Analysis', 2, 120),
16    ('Shanghai-2', '2024-06-07', 'Wangwu', 'Pandas Workshop', 1, 60),
17    ('Beijing-1', '2024-06-07', 'Zhangsan', 'Polars in Action', 1, 50),
18    ('Shanghai-2', '2024-06-07', 'Wangwu', 'Echarts Data Charts', 2, 90),
19    ('Shanghai-1', '2024-06-07', 'Lisi', 'Mastering Pandas', 5, 75),
20    ('Shanghai-1', '2024-06-07', 'Zhaoliu', 'R Projects', 2, 100);

我們先看一個簡單的例子。輸出 sales 表中的原始數據記錄,但要在 sales 表中再添加一列,顯示當天(date)在同一分店中售出圖書的最高價格。獲取售價最高的圖書價格可以使用如下 CTE。

1WITH highest AS (
 2  SELECT
 3    branch,
 4    date,
 5    MAX(unit_price) AS highest_price
 6  FROM sales
 7  GROUP BY branch, date
 8)
 9SELECT
10  sales.*,
11  h.highest_price
12FROM sales
13JOIN highest h
14  ON sales.branch = h.branch
15    AND sales.date = h.date

上述查詢定義了名為 highest 的 CTE,這個虛擬表包含的列為 branch、date 和highest_price,分別表示分店的名稱、銷售日期和當天該分店銷售的最高單價。

然后,在主查詢中,像使用常規表一樣使用虛擬表 highest。

最后,將 highest 的查詢結果與 sales 表進行連接。

查詢的結果如下。

查詢結果查詢結果

下面這個例子顯示各分店最高的單日收入。

1WITH daily_revenue AS (
 2  SELECT
 3    branch,
 4    date,
 5    SUM(unit_price * quantity) AS daily_revenue
 6  FROM   sales
 7  WHERE EXTRACT(YEAR FROM date) = 2024
 8  GROUP BY 1,2
 9)
10SELECT
11  branch,
12  MAX(daily_revenue) max_daily_revenue
13FROM daily_revenue
14GROUP BY 1
15ORDER BY 2 DESC

在這段代碼中,首先定義名為 daily_revenue 的 CTE,包含的列為 branch、date 和 daily_revenue,數據記錄為每家分店在 2024 年內每一天的日銷售額。

然后,在主查詢中,獲取 2024 年每家分店的最高日銷售額。

最后,按max_daily_revenue 降序排列輸出數據。

查詢結果查詢結果

在 SQL 高級查詢中使用 CTE

主查詢中可以使用多個 CTE。下面的示例中介紹如何使用多個 CTE 對復雜的 SQL 語句進行簡化。

假設要顯示某個城市的月銷售額,以及該城市中每個分店的銷售額。

在本例中,先創建兩個 CTE。再在主查詢中把這兩個 CTE 連接起來。

1WITH shanghai1_monthly_revenue AS (
 2  SELECT
 3    EXTRACT(MONTH FROM date) as month,
 4    SUM(unit_price * quantity) AS revenue
 5  FROM sales
 6  WHERE EXTRACT(YEAR FROM date) = 2024
 7    AND branch = 'Shanghai-1'
 8  GROUP BY 1
 9),
10shanghai2_monthly_revenue AS (
11  SELECT
12    EXTRACT(MONTH FROM date) as month,
13    SUM(unit_price * quantity) AS revenue
14  FROM sales
15  WHERE EXTRACT(YEAR FROM date) = 2024
16    AND branch = 'Shanghai-2'
17  GROUP BY 1
18)
19SELECT
20  s1.month,
21  s1.revenue + s2.revenue AS shanghai_revenue,
22  s1.revenue AS shanghai1_revenue,
23  s2.revenue AS shanghai2_revenue
24FROM shanghai1_monthly_revenue s1, shanghai2_monthly_revenue s2
25WHERE s1.month = s2.month

在上述代碼中,定義了 shanghai1_monthly_revenue 與 shanghai2_monthly_revenue 兩個 CTE,使用這兩個 CTE 獲取 2024 年上海各分店的月銷售額。

接下來,使用 month 列連接這兩個 CTE,并把兩個分店的銷售額相加,以獲取上海的總銷售額。

查詢結果如下。

查詢結果查詢結果

下例顯示每家分店最大金額的訂單及該訂單的日期。為此,需要創建一個 CTE,根據訂單金額為各分店的訂單進行排名(position 列就是排名)。

1WITH tickets AS (
 2  SELECT distinct
 3    branch,
 4    date,
 5    unit_price * quantity AS ticket_amount,
 6    ROW_NUMBER() OVER (
 7      PARTITION BY branch
 8      ORDER by unit_price * quantity DESC
 9    ) AS position
10  FROM sales
11  ORDER BY 3 DESC
12)
13SELECT
14  branch,
15  date,
16  ticket_amount
17FROM tickets
18WHERE position =1

在這段代碼中,創建了名為 tickets 的 CTE,包含 branch、date、titcket_amount和 position。

在主查詢中,過濾 position 等于 1 的記錄,以獲取各分店銷售額最大的訂單。

查詢結果如下。

查詢結果查詢結果

SQL 查詢中的嵌套 CTE

本例介紹如何使用嵌套 CTE。輸出所有單價超過 90 元的圖書,以及上海分店(Shanghai-2)的銷售數量。

1WITH over_90_items AS (
 2  SELECT DISTINCT
 3    item,
 4    unit_price
 5  FROM sales
 6  WHERE unit_price >=90
 7),
 8shanghai2_over_90 AS (
 9  SELECT
10    o90.item,
11    o90.unit_price,
12    coalesce(SUM(s.quantity), 0) as total_sold
13  FROM over_90_items o90
14  LEFT JOIN sales s
15  ON o90.item = s.item AND s.branch = 'Shanghai-2'
16  GROUP BY o90.item, o90.unit_price
17)
18SELECT item, unit_price, total_sold
19FROM shanghai2_over_90;

over_90_items 用于篩選單價大于或等于 90 元的圖書。

shanghai2_over_90 用于篩選 Shanghai-2 分店售出的超過 90 元的圖書的數量。

這就是嵌套 CTE 的基本用法。

注意,shanghai2_over_90 中的 FROM 子句中引用了 over_90_items。

使用 LEFT JOIN sales 的原因是 Shanghai-2 分店可能沒有銷售過價格超過 90 元的圖書。

查詢結果如下。

查詢結果查詢結果

遞歸查詢與 CTE

在關系型數據庫中,表示數據層級結構的表很常見,例如,上下級關系、父子組件關系等。

為了在這些層級結構中進行從上到下或從下到上的遍歷,可以使用遞歸 CTE。

RECURSIVE 是定義遍歷遞歸數據結構的 CTE 的關鍵字。CTE 遞歸查詢的形式如下。

1WITH RECURSIVE  cte_name AS (
2     CTE_query_definition  -- 非遞歸查詢項
3UNION ALL
4     CTE_query_definition  -- 遞歸查詢項
5)
6SELECT * FROM cte_name;

限于本文的篇幅,有 CTE 的遞歸查詢就先不贅述了,關注我們的公眾號,我會在后續的文章中進行介紹。

結語

SQL 的 CTE 非常強大,它可以讓 SQL 查詢代碼更簡潔,邏輯更清晰。

責任編輯:武曉燕 來源: Python學研大本營
相關推薦

2010-11-03 11:55:23

DB2公共表表達式

2010-10-21 10:56:29

SQL Server查

2011-10-28 16:34:13

LINQ

2009-09-10 15:35:07

LINQ查詢表達式

2009-09-07 17:18:33

LINQ查詢表達式

2009-08-27 09:13:28

LINQ查詢表達式

2009-09-11 09:53:16

Linq查詢表達式

2009-09-17 11:08:55

LINQ查詢表達式

2009-03-23 10:47:43

數據庫SQLLINQ

2017-05-12 10:47:45

Linux正則表達式程序基礎

2019-12-17 17:01:02

MySQLSQL數據庫

2009-09-17 09:09:50

Lambda表達式Linq查詢

2024-10-11 18:36:51

2024-10-17 17:03:43

SQL正則表達式MySQL

2009-06-08 16:49:05

Java正則表達式group

2014-01-05 17:41:09

PostgreSQL表達式

2024-03-01 08:51:01

Django查詢表達式查詢語句

2010-11-12 13:20:31

SQL Server

2011-08-12 10:31:01

T-SQL查詢基于列的邏輯表達式

2022-01-14 07:56:39

C#動態查詢
點贊
收藏

51CTO技術棧公眾號

日韩一级成人av| 欧美优质美女网站| 91中文字幕在线| 亚洲美女尤物影院| 一区二区三区丝袜| 国模精品娜娜一二三区| 91欧美极品| 亚洲国产成人久久| 性xxxx丰满孕妇xxxx另类| 成人免费高清在线观看| 国产精品二区三区四区| 久久久精品国产**网站| 欧美变态凌虐bdsm| 污污网址在线观看| 欧美国产精品一区二区| 免费观看黄色的网站| 欧美88av| 草民午夜欧美限制a级福利片| 草草影院在线观看| 日本一区免费视频| 日韩在线视频在线| 国产精品五区| 91成人免费视频| 欧美电影完整版在线观看| 亚洲欧美中文日韩v在线观看| 国产天堂在线| 亚洲h精品动漫在线观看| 成人一级片网站| 美女www一区二区| 久久久久久艹| 国产盗摄一区二区| 国产精品免费视频网站| 国产伦精品一区二区三区精品视频| 影视一区二区三区| 亚洲欧洲三级电影| 国产日韩精品视频| 国产免费区一区二区三视频免费 | 国产精品资源在线看| www国产精品视频| 亚洲欧美久久精品| 日韩精品自拍偷拍| 成人在线二区| 欧美色视频在线观看| 撸视在线观看免费视频| 亚洲超碰精品一区二区| 亚洲国产精品影视| 综合精品一区| 一区二区不卡在线观看| 久久久精品日韩| 精品免费二区三区三区高中清不卡| 国产一区二区三区电影在线观看| 裸体丰满少妇做受久久99精品| 久久精品视频免费| 欧美精品一区二区三区涩爱蜜| 精品国产乱码久久久久久免费| 一区二区中文字幕在线观看| 成人深夜直播免费观看| 欧美精品一卡| 国产 福利 在线| 欧美日韩日日夜夜| 成人网ww555视频免费看| 热久久这里只有| 国产在线一区二区| 日本大片在线观看| 久久夜色精品国产亚洲aⅴ| 亚洲神马久久| 婷婷福利视频导航| 中文字幕精品久久久久| 国产精品久久国产愉拍| 国产国产人免费人成免费视频| 亚洲福利在线视频| 国内精品久久久久久久97牛牛 | 91精品国产99久久久久久| 毛片在线不卡| 一区二区不卡在线视频 午夜欧美不卡在 | 国产日韩欧美中文在线| 欧美精品色一区二区三区| 1024免费在线视频| 一本大道久久a久久精二百| 黄网站免费观看| 亚洲国产成人精品电影| 欧美黄色免费| 一区二区电影网| 91成人理论电影| 亚洲.国产.中文慕字在线| 久久91精品| 免费毛片aaaaaa| 日韩免费观看av| 国产精品国产三级国产普通话99 | 国产高清成人在线| 男女啪啪999亚洲精品| av影院在线播放| 伊人久久男人天堂| 成人深夜福利app| 91亚洲精品在看在线观看高清| 能在线观看的av| 5278欧美一区二区三区| 欧美日韩激情视频| 三级欧美韩日大片在线看| 宅男视频免费在线观看视频| xvideos亚洲| 亚洲国产精品一区二区久久恐怖片 | 国产又粗又长又大的视频| 国产精品久久久久久搜索| 午夜婷婷国产麻豆精品| 一本色道久久综合| 成人免费无遮挡| 在线看黄的网站| xxxx18hd亚洲hd捆绑| 国产精品视频26uuu| 国产精品青草综合久久久久99| 日韩欧美一区二区三区免费看| 熟妇人妻无乱码中文字幕真矢织江| 国产精品pans私拍| 欧美日韩在线播| 91小视频在线免费看| 91久久久久| 精品国产不卡| 亚州精品国产| av黄色免费| 久久99久久99精品| 亚洲bt天天射| 日韩av网站电影| 色综合久久久久久久| 欧美高清一区| 岛国成人毛片| 免费的av在线| 免费看污久久久| 婷婷四月色综合| 日本一区二区三区视频在线播放| 91精品久久久久久久久久入口| 57pao精品| 国内精品视频在线| 日本国产一区二区三区| 日韩免费不卡av| 亚洲一区二区三区毛片| 国产精品区一区| 亚洲人成影视在线观看| 无码毛片aaa在线| 成人av一级片| 22288色视频在线观看| 传媒在线观看| 黄色av网站在线| 国产羞羞视频在线播放| 欧洲在线视频| 日韩午夜电影免费看| 大陆精大陆国产国语精品| 日韩大片在线播放| 午夜久久美女| 国产麻豆精品在线观看| 欧美激情综合在线| 日韩一区二区在线观看视频| 欧美激情乱人伦| 国产99在线播放| 毛片一区二区三区四区| 中文字幕在线永久在线视频 | 日韩经典中文字幕在线观看| 亚洲视频在线观看| 国产精品视频26uuu| www.在线观看av| 三级在线电影| 男女羞羞在线观看| 91精品国产乱码久久久久久| 99精品偷自拍| 欧美日韩www| 91av在线网站| 亚洲自拍偷拍二区| 日本夜爽爽一二区| 蜜桃成人365av| av一区二区在线播放| 国产高清久久久| 一级做a爱片久久| 正在播放欧美视频| 先锋影音欧美| a级片免费在线观看| 欧美激情无毛| 欧美最猛黑人xxxxx猛交| 亚洲最大的网站| 国产在线观看免费| 精品自拍偷拍| 国产麻豆精品95视频| 一本大道av伊人久久综合| www高清在线视频日韩欧美| 超碰97国产在线| 波多野结衣作品集| 成人动漫av| 久久久精品区| 乱人伦精品视频在线观看| 国产精品久久久久9999吃药| 亚洲欧美一区二区激情| 日韩最新av在线| 91精品在线影院| 麻豆免费在线视频| 中文字幕在线视频区| 欧美成人一品| 日韩一区二区三区在线视频| 国产精品视频免费观看| 国产秀色在线www免费观看| 一区二区高清| 日韩精品视频在线免费观看 |