SQL語法 - SUBQUERY

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

※ 為什麼需要 Subquery?

當⼀個任務需要多個 Query 完成任務,可以使⽤ Subquery 把多個 Query 合併成⼀個 Query。

raw-image

當我們在進行SQL查詢時,每次查詢都需要在Web Server和資料庫之間來回傳遞資料。這個過程會產生網路延遲,特別是當兩者之間的物理距離較遠時,這種延遲會更加明顯。多次查詢會增加這種延遲,從而影響效能。

使用子查詢(Subquery)可以將多個查詢合併成一個查詢,這樣只需要一次來回傳遞資料,就能獲得所需的結果。這不僅減少了網路延遲,還能提高Web Server生成正確HTML的速度,從而提升整體效能。

簡單來說,子查詢可以幫助我們減少資料傳輸的次數,降低網路延遲,並提高查詢效能。這對於需要頻繁查詢資料的應用程式來說,尤為重要。

※ 語法

使⽤括號括住 Query。

SELECT * FROM employees
WHERE (department = 'Sales' OR department = 'Marketing')
AND salary > 50000;

從 employees 表中選擇所有符合以下條件的記錄:

  1. 部門是 ‘Sales’ 或 ‘Marketing’:這部分 (department = 'Sales' OR department = 'Marketing') 表示選擇部門是銷售或市場的員工。
  2. 薪水大於 50000:這部分 AND salary > 50000 表示選擇那些薪水超過 50000 的員工。

這兩個條件必須同時滿足,才能選擇相應的記錄。換句話說,這個查詢會返回所有在銷售或市場部門工作且薪水超過 50000 的員工。

※ 解析順序

  1. 最深層的 Subquery(INNER query)開始首先執行最內層的Subquery,這通常是用來計算或篩選數據的。
  2. ⼀層⼀層往外:接著執行外層的子查詢,依次向外層執行,直到所有子查詢都完成。
  3. 執行主查詢:最後,使用子查詢的結果來執行主查詢。

簡單來說,SQL 會先處理最內層的子查詢,然後逐層向外執行,最終完成主查詢。

raw-image

※ 使用場景

  • COMPARISON OPERATOR(比較運算子)例子:

查詢所有薪水高於平均薪水的員工。

//查詢所有薪水高於公司平均薪水的員工的 employee_id 和 employee_name。
SELECT employee_id, employee_name
FROM employees
//選擇那些薪水高於平均薪水的員工。
WHERE salary > (
//計算 employees 表中所有員工的平均薪水
SELECT AVG(salary)
FROM employees
);
  • FROM(DERIVED TABLE– 衍生資料表)例子:
  1. Query 的結果其實也是一個 Table子查詢的結果可以視為一個臨時表。
  2. 接在 FROM 後面除了可以接已經存在於資料庫中的表之外,也可以接由子查詢生成的表。這個表我們稱之為衍生資料表(Derived Table),因為它是由子查詢生成的。

FROM語法

raw-image
// 從衍生資料表 derived_table_name 中選擇 column_list
SELECT column_list
// 產生一個臨時的衍生資料表
FROM (
// 從 table_1 中選擇 column_list
SELECT column_list
FROM table_1
) derived_table_name // 命名為 derived_table_name
// 使用 WHERE 子句來篩選 c1 列的值大於 0 的記錄
WHERE derived_table_name.c1 > 0;
  • WHERE IN/NOT IN例子:

在WHERE這行指令去一個欄位的值是否在一個集合裡面。

  1. WHERE IN
// 從 employees 表中選擇 employee_id 和 employee_name 列
SELECT employee_id, employee_name
FROM employees
// 篩選 department_id 並使用IN 運算子用來檢查 department_id 是否在指定的集合(1, 2, 3)中
WHERE department_id IN (1, 2, 3);WHERE NOT IN
  1. WHERE NOT IN
// 從 employees 表中選擇 employee_id 和 employee_name 列
SELECT employee_id, employee_name
FROM employees
// 篩選 department_id 並使用IN 運算子用來檢查 department_id 是否不在指定的集合(1, 2, 3)中
WHERE department_id NOT IN (1, 2, 3);
  • Correlated Subquery(相關子查詢)例子:
  1. 依賴外部查詢:相關子查詢會參考外部查詢中的數據,因此與外部查詢有關。
  2. 逐行解析:相關子查詢會對外部查詢中的每一行數據進行解析,並且每次都會重新計算子查詢。
  3. 每行執行一次:每當外部查詢處理一行數據時,相關子查詢都會執行一次,並使用該行數據來計算結果。

簡單來說,相關子查詢會依賴外部查詢中的數據,並且在外部查詢處理每一行數據時都會執行一次子查詢。

※ 選擇所有薪水高於其所在部門平均薪水的員工。

// 從 employees 表中選擇 employee_id 和 employee_name 列
SELECT employee_id, employee_name
FROM employees e
WHERE salary > (
// 子查詢中的 e.department_id 參考了外部查詢中的 department_id
SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id
);

※ EXIST / NOT EXIST

當我們在 WHERE 子句中使用 EXISTS 時,這個語法會檢查後面的子查詢 (Subquery) 是否返回非空集合。如果子查詢返回的結果不是空集合,那麼該記錄 (RECORD) 就會被保留下來。

由於這個子查詢會使用到外部的表 (TABLE),因此它是一個相關子查詢 (Correlated Subquery)。相關子查詢的執行方式是遍歷外部表的每一個記錄,並且每遍歷一個記錄,子查詢都會重新執行一次。這樣可以根據當前記錄的值來動態填入子查詢中的條件。

簡單來說,WHERE EXISTS 會根據子查詢的結果來篩選記錄,而相關子查詢會根據外部表的每個記錄動態執行。

  • EXIST / NOT EXIST例子:

※ 返回所有有訂單記錄的員工

//選擇了 employees 表中的 employee_id 和 employee_name 列。
SELECT employee_id, employee_name
FROM employees e
//使用了 EXISTS 子句來檢查某些條件是否成立。
//EXISTS 子句會返回布爾值(TRUE 或 FALSE),用來決定是否保留主查詢中的記錄。
WHERE EXISTS (
//子查詢會檢查 orders 表中是否存在與 employees 表中的 employee_id 匹配的記錄。
SELECT 1
FROM orders o
WHERE o.employee_id = e.employee_id
);



留言
avatar-img
留言分享你的想法!
avatar-img
奧莉薇走在成為後端工程師之路上
22會員
164內容數
全端網頁開發專業知識分享
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
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
※ 為什麼需要 Subquery? 當⼀個任務需要多個 Query 完成任務,可以使⽤ Subquery 把多個 Query 合併成⼀個 Query。 當我們在進行SQL查詢時,每次查詢都需要在Web Server和資料庫之間來回傳遞資料。這個過程會產生網路延遲,特別是當兩者之間的物理距離較遠時
Thumbnail
※ 為什麼需要 Subquery? 當⼀個任務需要多個 Query 完成任務,可以使⽤ Subquery 把多個 Query 合併成⼀個 Query。 當我們在進行SQL查詢時,每次查詢都需要在Web Server和資料庫之間來回傳遞資料。這個過程會產生網路延遲,特別是當兩者之間的物理距離較遠時
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
KSQL引擎, 串流形式的SQL? 聽了應該霧煞煞吧! 想像一下傳統的SQL, 是不是一個指令一個動作, 每發送一個指令之後就必須等到查詢/寫入…動作皆完成之後才回應, 然而在Streaming的應用上這顯然不太可行, 每分每秒都有資料流入的情境下, 資料的狀態都在變化, 假設我們一個指令一個動作,
Thumbnail
KSQL引擎, 串流形式的SQL? 聽了應該霧煞煞吧! 想像一下傳統的SQL, 是不是一個指令一個動作, 每發送一個指令之後就必須等到查詢/寫入…動作皆完成之後才回應, 然而在Streaming的應用上這顯然不太可行, 每分每秒都有資料流入的情境下, 資料的狀態都在變化, 假設我們一個指令一個動作,
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
  全名為Language Integrated Query,又稱LINQ,它是什麼呢?用在哪裡呢?它是一個擁有「集合元素進行資料查詢」的技術,直接將此技術整合到C#裡,也就是說對於任何資料型態只要是遇到以下這幾個型別:
Thumbnail
  全名為Language Integrated Query,又稱LINQ,它是什麼呢?用在哪裡呢?它是一個擁有「集合元素進行資料查詢」的技術,直接將此技術整合到C#裡,也就是說對於任何資料型態只要是遇到以下這幾個型別:
Thumbnail
一次將 Transport request 複製到其他 Client
Thumbnail
一次將 Transport request 複製到其他 Client
Thumbnail
在工作情境中手動執行SQL語法更新中文字時,有時會遇到中文字顯示問號(?)的情況。這篇文章將介紹如何解決手動執行SQL語法時造成中文顯示問號(?)的方法。
Thumbnail
在工作情境中手動執行SQL語法更新中文字時,有時會遇到中文字顯示問號(?)的情況。這篇文章將介紹如何解決手動執行SQL語法時造成中文顯示問號(?)的方法。
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
Thumbnail
提到後端工程師,似乎就只是開發 API,但一個複雜的系統其實不太可能只透過 API 就能完成,例如一個簡單的功能,註冊會員,其實是由好幾個不同類型的工作互相配合,您才能收到開通信,才確保資料庫不會有一堆未開通帳號等。所以今天就來聊聊一個系統有幾種不同執行方式的工作。
Thumbnail
提到後端工程師,似乎就只是開發 API,但一個複雜的系統其實不太可能只透過 API 就能完成,例如一個簡單的功能,註冊會員,其實是由好幾個不同類型的工作互相配合,您才能收到開通信,才確保資料庫不會有一堆未開通帳號等。所以今天就來聊聊一個系統有幾種不同執行方式的工作。
Thumbnail
如果你 WHERE 的條件需要常常更動,但每次都要進去 QUERY 所在的儲存格編輯語法,實在是有點太麻煩了?但其實有個小技巧,可以讓 QUERY 更新得更輕鬆。來看看吧!
Thumbnail
如果你 WHERE 的條件需要常常更動,但每次都要進去 QUERY 所在的儲存格編輯語法,實在是有點太麻煩了?但其實有個小技巧,可以讓 QUERY 更新得更輕鬆。來看看吧!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News