SQL進階知識:一、高級查詢

今天介紹下關于高級查詢的詳細介紹,包括子查詢、連接查詢、分組查詢等,并結合MySQL數據庫提供實際例子。

一、子查詢(Subqueries)

子查詢是嵌套在另一個查詢中的查詢語句,通常用于提供條件過濾、生成臨時數據集等。子查詢可以出現在SELECTFROMWHEREHAVING等子句中。

1. 標量子查詢(Scalar Subquery)

標量子查詢返回單個值,通常用于比較操作。

示例1:查詢工資高于平均工資的員工
SELECT employee_id, name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

解釋:外層查詢從employees表中獲取員工信息,內層子查詢計算所有員工的平均工資,外層查詢的WHERE子句將篩選出工資高于平均工資的員工。

示例2:查詢與員工Alice同部門的其他員工
SELECT employee_id, name
FROM employees
WHERE department_id = (SELECT department_id FROM employees WHERE name = 'Alice');

解釋:內層子查詢找到Alice所在的部門ID,外層查詢根據這個部門ID篩選出其他同部門的員工。

2. 行子查詢(Row Subquery)

行子查詢返回一行數據,通常用于比較操作符(如INANYALL)。

示例1:查詢工資高于部門平均工資的員工
SELECT e.employee_id, e.name, e.salary
FROM employees e
WHERE (e.department_id, e.salary) > ANY (SELECT department_id, AVG(salary)FROM employeesGROUP BY department_id
);

解釋:內層子查詢按部門分組計算每個部門的平均工資,外層查詢使用ANY比較操作符,篩選出工資高于所在部門平均工資的員工。

示例2:查詢與Alice和Bob同部門的員工
SELECT employee_id, name
FROM employees
WHERE (department_id, name) IN (SELECT department_id, nameFROM employeesWHERE name IN ('Alice', 'Bob')
);

解釋:內層子查詢找到Alice和Bob的部門ID和姓名,外層查詢使用IN操作符篩選出與他們同部門的員工。

3. 表子查詢(Table Subquery)

表子查詢返回一個表,通常用于FROM子句中。

示例1:查詢每個部門工資最高的員工
SELECT e.employee_id, e.name, e.salary, e.department_id
FROM employees e
JOIN (SELECT department_id, MAX(salary) AS max_salaryFROM employeesGROUP BY department_id
) AS max_sal
ON e.department_id = max_sal.department_id AND e.salary = max_sal.max_salary;

解釋:內層子查詢按部門分組,計算每個部門的最高工資。外層查詢通過JOINemployees表與子查詢結果連接,篩選出每個部門工資最高的員工。

示例2:查詢每個部門的員工數量和平均工資
SELECT d.department_id, d.department_name, COUNT(e.employee_id) AS employee_count, AVG(e.salary) AS avg_salary
FROM departments d
LEFT JOIN employees e
ON d.department_id = e.department_id
GROUP BY d.department_id, d.department_name;

解釋:雖然這里沒有顯式的表子查詢,但LEFT JOIN的結果可以視為一個表子查詢。查詢統計了每個部門的員工數量和平均工資。


二、連接查詢(Joins)

連接查詢用于將兩個或多個表中的數據組合在一起。MySQL支持多種連接類型,包括INNER JOINLEFT JOINRIGHT JOINFULL JOIN(MySQL不支持FULL JOIN,但可以通過UNION實現)。

1. 內連接(INNER JOIN)

內連接返回兩個表中匹配的行。

示例1:查詢員工及其所在部門的信息
SELECT e.employee_id, e.name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id;

解釋INNER JOINemployees表和departments表連接,返回員工及其所在部門的信息。

示例2:查詢員工及其經理的信息
SELECT e.employee_id, e.name AS employee_name, m.name AS manager_name
FROM employees e
INNER JOIN employees m
ON e.manager_id = m.employee_id;

解釋employees表自連接,e表示員工,m表示經理,查詢返回每個員工及其經理的名稱。

2. 外連接(Outer Join)

外連接返回一個表中的所有行,即使另一個表中沒有匹配的行。

示例1:查詢所有員工及其所在部門的信息,即使某些員工沒有分配部門
SELECT e.employee_id, e.name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id;

解釋LEFT JOIN確保返回employees表中的所有行,即使departments表中沒有匹配的行(部門名稱為NULL)。

示例2:查詢所有部門及其員工的信息,即使某些部門沒有員工
SELECT d.department_id, d.department_name, e.name AS employee_name
FROM departments d
LEFT JOIN employees e
ON d.department_id = e.department_id;

解釋LEFT JOIN確保返回departments表中的所有行,即使employees表中沒有匹配的行(員工名稱為NULL)。

3. 自連接(Self Join)

自連接是將一個表與自身連接,通常用于比較表中的不同行。

示例1:查詢員工及其直接上級的信息
SELECT e.employee_id, e.name AS employee_name, m.name AS manager_name
FROM employees e
JOIN employees m
ON e.manager_id = m.employee_id;

解釋employees表自連接,e表示員工,m表示經理,查詢返回每個員工及其直接上級的名稱。

示例2:查詢員工及其所有上級的信息(多級)
WITH RECURSIVE EmployeeHierarchy AS (SELECT employee_id, name, manager_id, 1 AS levelFROM employeesWHERE manager_id IS NULL -- 假設經理ID為NULL表示最高級UNION ALLSELECT e.employee_id, e.name, e.manager_id, eh.level + 1FROM employees eJOIN EmployeeHierarchy ehON e.manager_id = eh.employee_id
)
SELECT employee_id, name, manager_id, level
FROM EmployeeHierarchy;

解釋:使用遞歸公用表表達式(CTE)實現多級自連接,查詢每個員工及其所有上級的信息。


三、分組查詢(GROUP BY)

分組查詢用于將數據按指定列分組,并對每個分組進行聚合計算。GROUP BY子句通常與聚合函數(如SUMAVGCOUNT等)一起使用。

1. 基本分組

按指定列分組并計算聚合值。

示例1:查詢每個部門的員工數量
SELECT department_id, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department_id;

解釋:按department_id分組,計算每個部門的員工數量。

示例2:查詢每個部門的平均工資
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;

解釋:按department_id分組,計算每個部門的平均工資。

2. 分組過濾(HAVING)

HAVING子句用于過濾分組后的結果,與WHERE子句不同,HAVING子句可以使用聚合函數。

示例1:查詢員工數量大于5的部門
SELECT department_id, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department_id
HAVING COUNT(employee_id) > 5;

解釋:按department_id分組,使用HAVING子句過濾出員工數量大于5的部門。

示例2:查詢平均工資大于5000的部門
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000;

解釋:按department_id分組,使用HAVING子句過濾出平均工資大于5000的部門。

3. 分組排序(ORDER BY)

ORDER BY子句用于對分組后的結果進行排序。

示例1:查詢每個部門的員工數量,并按員工數量降序排序
SELECT department_id, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department_id
ORDER BY employee_count DESC;

解釋:按department_id分組,計算每個部門的員工數量,并按員工數量降序

以上就是基于Mysql,有關查詢相關的進階知識,希望對你有所幫助~
后續會連續發布多篇SQL進階相關內容;
期待你的關注,學習更多知識;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80087.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80087.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Git】Git Revert 命令詳解

Git Revert 命令詳解 1. Git Revert 的基本概念 Git Revert 是一個用于撤銷特定提交的命令。與 Git Reset 不同,Git Revert 不會更改提交歷史,而是會創建一個新的提交來撤銷指定提交的更改。這意味著,使用 Git Revert 后,項目的…

華為S系列交換機CPU占用率高問題排查與解決方案

問題概述 在華為S系列交換機(V100&V200版本)運行過程中,CPU占用率過高是一個常見問題,可能導致設備性能下降甚至業務中斷。根據華為官方維護寶典,導致CPU占用率高的主要原因可分為四大類:網絡攻擊、網絡震蕩、網絡環路和硬件…

招募隊員問題

#include <bits/stdc.h> using namespace std;int main() {int n;cin >> n; // 輸入隊伍人數&#xff08;行數&#xff09;vector<int> maxx(5, 0); // 用于記錄每個數字&#xff08;1~5&#xff09;出現的最大連續段長度// 定義二維數組 team&#xff0c;n …

2025.04.19react面試題

以下是整理的 20 道 React 面試題&#xff0c;涵蓋基礎、進階和實戰應用&#xff0c;適用于社招或內推準備&#xff1a; 一、React 基礎&#xff08;適合初中級&#xff09; React 中的組件有哪幾種&#xff1f;它們有什么區別&#xff1f; 什么是 JSX&#xff1f;它與 HTML 有…

Python爬蟲從入門到實戰詳細版教程Char01:爬蟲基礎與核心技術

1.1 什么是網絡爬蟲? 1.1.1 定義與分類 網絡爬蟲:互聯網世界的“信息捕手” 網絡爬蟲(Web Crawler),又稱網絡蜘蛛或網絡機器人,是一種通過預設規則自動訪問網頁、提取數據的程序系統。從技術視角看,其核心任務是通過模擬瀏覽器行為向目標服務器發起請求,解析網頁內容…

Python爬蟲實戰:獲取xie程網近兩周長沙飛敦煌機票數據,為51出行做參考

一、引言 1.1 研究背景 伴隨互聯網技術的迅猛發展與人們生活水平的顯著提升,在線旅游平臺成為人們出行預訂的重要途徑。其中,飛機作為高效快捷的長途出行方式備受青睞。xie程網作為國內領先的在線旅游平臺,匯聚了豐富的機票信息。對于計劃在 51 出行期間從長沙飛往敦煌的旅…

Mujoco robosuite 機器人模型

import ctypes import os# 獲取當前腳本所在的目錄 script_dir os.path.dirname(os.path.abspath(__file__))# 構建庫文件的相對路徑 lib_relative_path os.path.join(dynamic_models, UR5e, Jb.so)# 拼接成完整的路徑 lib_path os.path.join(script_dir, lib_relative_path…

【重學Android】02.Java環境配置的一些分享

背景說明 其實只是學習Android的話&#xff0c;只要下載好Android Studio開發工具&#xff0c;是自帶JDK環境的&#xff0c;所以不需要再額外去進行配置&#xff0c;我之所以還要進行單獨配置&#xff0c;是因為我其他的工具需要Java的環境&#xff0c;而且我目前用的是JDK 12…

Linux 網絡編程:select、poll 與 epoll 深度解析 —— 從基礎到高并發實戰

一、IO 多路復用&#xff1a;解決并發 IO 的核心技術 在網絡編程中&#xff0c;當需要同時處理大量客戶端連接時&#xff0c;傳統阻塞式 IO 會導致程序卡在單個操作上&#xff0c;造成資源浪費。IO 多路復用技術允許單線程監聽多個文件描述符&#xff08;FD&#xff09;&#…

制作你的時間管理“局”#自制軟件,5款AI編程對比測試

玩 AI 編程最有意思的地方&#xff0c;就是當你有想法的時候&#xff0c;可以隨時測試、把想法具體化&#xff0c;甚至產品化。今天我們制作一個事件管理器&#xff0c;用來量化我們每天的時間安排&#xff0c;提高時間的利用率&#xff0c;提升生產力。 同樣的一組 prompt &am…

大數據系列 | 詳解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署--完結

大數據系列 | 詳解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署 1. ClickHouse與MySQL的區別2. 在群集的所有機器上安裝ClickHouse服務端2.1. 在線安裝clickhouse2.2. 離線安裝clickhouse 3. ClickHouse Keeper/Zookeeper集群安裝4. 在配置文件中設置集群配置5. 在每…

宏碁筆記本電腦怎樣開啟/關閉觸摸板

使用快捷鍵&#xff1a;大多數宏碁筆記本可以使用 “FnF7” 或 “FnF8” 組合鍵來開啟或關閉觸摸板&#xff0c;部分型號可能是 “FnF2”“FnF9” 等。如果不確定&#xff0c;可以查看鍵盤上的功能鍵圖標&#xff0c;一般有觸摸板圖案的按鍵就是觸摸板的快捷鍵。通過設備管理器…

使用Mybaitis-plus提供的各種的免寫SQL的Wrapper的使用方式

文章目錄 內連接JoinWrappers.lambda和 new MPJLambdaWrapper 生成的MPJLambdaWrapper對象有啥區別&#xff1f;LambdaQueryWrapper 和 QueryWrapper的區別&#xff1f;LambdaQueryWrapper和MPJLambdaQueryWrapper的區別&#xff1f;在作單表更新時建議使用&#xff1a;LambdaU…

基于微信小程序的走失兒童幫助系統-項目分享

基于微信小程序的走失兒童幫助系統-項目分享 項目介紹項目摘要管理員功能圖用戶功能圖系統功能圖項目預覽首頁走失兒童個人中心走失兒童管理 最后 項目介紹 使用者&#xff1a;管理員、用戶 開發技術&#xff1a;MySQLJavaSpringBootVue 項目摘要 本系統采用微信小程序進行開…

P3916 圖的遍歷

P3916 圖的遍歷 題目來源-洛谷 題意 有向圖中&#xff0c;找出每個節點能訪問到的最大的節點 思路 每個節點的最大節點&#xff0c;不是最長距離&#xff0c;如果是每個節點都用dfs去找最大值&#xff0c;顯然1e6*1e6 超時了&#xff0c;只能60分從第一個節點開始遍歷&…

掌握常見 HTTP 方法:GET、POST、PUT 到 CONNECT 全面梳理

今天面試還問了除了 get 和 post 方法還有其他請求方法嗎&#xff0c;一個都不知道&#xff0c;這里記錄下。 &#x1f310; 常見 HTTP 請求方法一覽 方法作用描述是否冪等是否常用GET獲取資源&#xff0c;參數一般拼接在 URL 中? 是? 常用POST創建資源 / 提交數據&#xff…

裸金屬服務器的應用場景有哪些?

隨著云計算技術不斷發展&#xff0c;裸金屬服務器作為一臺既具有傳統物理服務器特點的硬件設備&#xff0c;還具備云計算技術的服務器化服務功能&#xff0c;是硬件和軟件相結合的網絡設備&#xff0c;逐漸被越來越多的企業所關注&#xff0c;那么&#xff0c;裸金屬服務器的應…

【得物】20250419筆試算法題

文章目錄 前言第一題1. 題目描述2. 思路解析3. AC代碼 第二題1. 題目描述2. 思路解析3. AC代碼 第三題1. 題目描述2. 思路解析3. AC代碼 前言 三道題目都比較簡單&#xff0c;大家都可以試著做一下。 第一題 1. 題目描述 題目鏈接&#xff1a;矩陣變換 2. 思路解析 按題…

明遠智睿2351開發板四核1.4G Linux處理器:驅動創新的引擎

在科技日新月異的今天&#xff0c;創新成為了推動社會進步的核心動力。而在這場創新的浪潮中&#xff0c;一款性能卓越、功能全面的處理器無疑是不可或缺的引擎。今天&#xff0c;我們介紹的這款四核1.4G處理器搭配Linux系統的組合&#xff0c;正是這樣一款能夠驅動未來創新的強…

Oracle Database Resident Connection Pooling (DRCP) 白皮書閱讀筆記

本文為“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻譯加閱讀筆記。覺得是重點的就用粗體表示了。 白皮書版本為March 2025, Version 3.3&#xff0c;副標題為&#xff1a;Optimizing Oracle Database resou…