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.mzph.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…