【半夜学习MySQL】复合查询(含多表查询、自连接、单行/多行子查询、多列子查询、合并查询等详解)

在这里插入图片描述

🏠关于专栏:半夜学习MySQL专栏用于记录MySQL数据相关内容。
🎯每天努力一点点,技术变化看得见

文章目录

  • 回顾基本查询
  • 多表查询
  • 自连接
  • 子查询
    • 单行子查询
    • 多行子查询
    • 多列子查询
    • 在from子句中使用子查询
    • 合并查询


回顾基本查询

下面使用几个案例,一起回顾之前文章所介绍的基本查询↓↓↓
案例1: 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名售资委大写的J

select * from emp where (sal>500 or job='MANAGER') and substring(ename,1,1)='J';

在这里插入图片描述
案例2: 按照部门号升序而雇员工资降序排列

select * from emp order by deptno asc, sal desc;

在这里插入图片描述
案例3: 对年薪进行降序排列

select ename, sal*12+ifnull(comm,0) as '年薪' from emp order by '年薪' desc;

在这里插入图片描述
案例4: 显示工资最高的员工的名字和工作岗位

select ename, job from emp where sal=(select max(sal) from emp);

在这里插入图片描述
案例5: 显示工资高于平均工资的员工信息

select ename, sal from emp where sal>(select avg(sal) from emp);

在这里插入图片描述
案例6: 显示每个部门的平均工资和最高工资

select deptno, avg(sal), max(sal) from emp group by deptno;

在这里插入图片描述
案例7: 显示平均工资低于2000的部门号和它的平均工资

select deptno, avg(sal) as avgsal from emp group by deptno having avgsal<2000;

在这里插入图片描述
案例8: 显示每种岗位的雇员总数,平均工资

select count(*) as '雇员总数', format(avg(sal), 2) as '平均工资' from emp group by job;

在这里插入图片描述
回顾完的这些查询操作,都是对一张表进行查询,但在实际开发中是远远不够的。下面我们就一起来了解学习以下复合查询。

多表查询

实际开发中的数据往往来自不同的表,所以需要多表查询。这里介绍多表查询使用的oracle9i自带的scott库下的emp、dept、salegrade表。先看一下这三张表吧↓↓↓
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多表查询通过案例的方式进行介绍

案例1: 显示雇员名、雇员工资及其所在部门的名字。
☆ps:雇员名、雇员工资来自emp表,而部门名字在dept表中。我们可以尝试让emp表和dept表组合。

select * from emp, dept;

在这里插入图片描述
上述组合中:
Ⅰ 从第一张表中选出第一条巨鹿和第二个表的所有集合进行组合;
Ⅱ 然后从第一张表中取第二条数据,和第二张表中的所有记录组合
Ⅲ 不加过来条件,得到的上图结果称为笛卡尔积

但上图中那么多记录,我们只需要emp表中的dept等于dept表中的deptno字段的记录

select emp.ename, emp.sal, dept.dname from emp, dept where emp.deptno=dept.deptno;

在这里插入图片描述
案例2: 显示部门号为10的部门名、员工名和工资

select dname, ename, sal from emp, dept where emp.deptno=dept.deptno and emp.deptno=10;

在这里插入图片描述
案例3: 显示各个员工的姓名、工资及工资级别

select ename, sal, grade from emp, salgrade where emp.sal between losal and hisal;

在这里插入图片描述

自连接

上面介绍的是多张表的连接操作,那能否实现一张表实现自己和自己连接呢?这就是自连接。下面图演示的就是dept表自身和自身的连接↓↓↓
在这里插入图片描述

案例: 显示员工FORD的上级领导的编号和姓名(emp表中mgr表示的是领导的编号)
●方法1:使用子查询的方式

select empno, ename from emp where empno=(select mgr from emp where ename='FORD');

在这里插入图片描述
●使用多表查询(自连接查询)

select leader.empno, leader.ename from emp leader, emp worker where leader.empno=worker.mgr and worker.ename='FORD';

在这里插入图片描述

子查询

子查询是嵌入到其他sql语句中的select查询语句,也叫做嵌套查询。下文对子查询的多种情况做出介绍↓↓↓

单行子查询

子查询语句返回一行记录的查询,称为单行子查询
示例: 显示SMITH同一部门的员工
☆思路:要知道与SMITH同部门的员工,就要先知道SMITH位于哪个部门↓↓↓

select deptno from emp where ename='SMITH';

在这里插入图片描述
由上可知SMITH位于20号部门,下面可以找出20号部门的所有员工↓↓↓

select * from emp where deptno=20;

在这里插入图片描述
将第一个查询结果嵌入第二个查询的where子句中,这就构成嵌套查询语句↓↓↓

select * from emp where deptno=(select deptno from emp where ename='SMITH');

在这里插入图片描述

多行子查询

如果子查询返回的结果多条记录,该子查询称为多行子查询。

● in关键字:查询和10号部门的工作岗位相同的雇员的名字、岗位、工资、部门号,但是不包含10号部门员工

select ename, job, sal, deptno from emp where job in (select job from emp where deptno=10) and deptno<>10;

在这里插入图片描述

●all关键字:显示工资部门30的所有员工的工资都高的员工的姓名、工资和部门号

select ename, sal, deptno from emp where sal > all(select sal from emp where deptno=30);

在这里插入图片描述
★ps:上述all子句,等同于select max(sal) from emp where depth=30

●any关键字:显示工资比30号部门的任意员工高的员工的姓名、工资和部门号(不包含30号部门的员工)

select ename,sal,deptno from emp where sal > any(select sal from emp where deptno=30) and deptno<>30;

在这里插入图片描述
★ps:上述any子句,等同于select min(sal) from emp where depth=30

多列子查询

单行子查询是指子查询结果只返回单列、单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的。而多列子查询则是指查询返回多个列数据的子查询语句。

案例: 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMTH本人

select * from emp where (deptno, job) = (select deptno, job from emp where ename='SMITH') and ename<>'SMITH';

在这里插入图片描述
★ps:使用多列子查询,需要保证判断条件左右两侧列数相同,且列名顺序相同。

在from子句中使用子查询

子查询语句出现在from子句中,这里可以使用一个数据查询的技巧,即把子查询当作一个临时表使用。

案例1: 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
☆思路:要求高于部门平均工资的信息,首先就需要先查询各个部门的平均工资是多少。

select deptno, avg(sal) from emp group by deptno;

在这里插入图片描述
☆思路:让emp表的每条记录和上述子查询结果做笛卡儿积,使用where限定每条记录后面跟的平均工资是该员工所处部门的平均工资

select * from emp, (select deptno, avg(sal) from emp group by deptno) avgtable where emp.deptno = avgtable.deptno;

在这里插入图片描述
☆思路:最后使用where条件限定当前行中的sal要高于平均工资

select * from emp, (select deptno, avg(sal) as agvsal from emp group by deptno) avgtable where emp.deptno = avgtable.deptno and sal > agvsal;

在这里插入图片描述

案例2: 查找各个部门工资最高的人的姓名、工资、部门和最高工资
☆思路:首先需要找出各个部门的最高工资

select deptno, max(sal) from emp group by deptno;

在这里插入图片描述
☆ps:让emp表和上述子查询做笛卡儿积,并使用where条件限定只显示与emp表当前行记录的部门的平均工资。

select * from emp, (select deptno, max(sal) from emp group by deptno) maxsal where emp.deptno=maxsal.deptno;

在这里插入图片描述
☆思路:最后只要挑选出等于emp表中sal等于最高工资的行即可。

select * from emp, (select deptno, max(sal) ms from emp group by deptno) maxsal where emp.deptno=maxsal.deptno and sal=ms;

在这里插入图片描述
案例3: 显示各个部门的信息(部门名、编号、地址)和人员数量
●方法1:使用多表查询

select dept.dname, dept.deptno, dept.loc, count(*) as 'personNum' from emp, dept where emp.deptno=dept.deptno group by dept.deptno, dept.dname, dept.loc;

在这里插入图片描述
★ps:由于使用group by的查询语句,只能显示出现group by中的列字段、聚合函数。故这里将不需要进行排序的deptno.dname,、dept.loc一并放入了group by语句中

●方法2:使用子查询

select dept.dname, dept.deptno, dept.loc, cp.personNum from dept, (select deptno, count(*) personNum from emp group by deptno) as cp where dept.deptno=cp.deptno;

在这里插入图片描述

合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符union和union all

●union
该操作符用于取得两个结果集的并集,它会自动去掉结果集中的重复记录。

案例: 将工资大于2500或职位为MANAGER的人显示出来

select * from emp where sal > 2500;
select * from emp where job='MANAGER';
select * from emp where sal > 2500 union select * from emp where job='MANAGER';

在这里插入图片描述
上述结果与select * from emp where sal>2500 or job='MANAGER';效果相同↓↓↓
在这里插入图片描述

●union all
该操作符用于取两个结果集的并集,但它并不会去除重复行↓↓↓

select * from emp where sal > 2500 union all select * from emp where job='MANAGER';

在这里插入图片描述
★ps:由于union all不会去除重复行,故上面结果中BLAKE、JONES出现了两次。

🎈欢迎进入半夜学习MySQL专栏,查看更多文章。
如果上述内容有任何问题,欢迎在下方留言区指正b( ̄▽ ̄)d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/13091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 -- 序列化与反序列化

一 协议的重要性 我们都知道&#xff0c;在进行网络通信的过程中&#xff0c;通信的双方可以是不同的设备&#xff0c;不同的平台&#xff0c;不同的平台&#xff0c;比如说&#xff0c;手机用户和电脑用户进行通信&#xff0c;ios系统和安卓系统进行通信。 自己的数据&#xf…

抖店商品详情API接口(店铺|标题|主图|价格|SKU属性等)

抖店商品详情API接口(店铺|标题|主图|价格|SKU属性等) 抖店商品详情API接口是指通过调用抖音开放平台提供的接口&#xff0c;获取抖店上商品的详细信息的方法。 抖店开放平台提供了一系列的接口&#xff0c;可以用于获取商品的基本信息、价格、库存、销量、评价等各种信息。以…

UIKit之图片浏览器

功能需求 实现一个图片浏览器&#xff0c;点击左右按钮可以切换背景图&#xff0c;且更新背景图对应的索引页和图片描述内容。 分析&#xff1a; 实现一个UIView的子类即可&#xff0c;该子类包含多个按钮。 实现步骤&#xff1a; 使用OC语言&#xff0c;故创建cocoa Touch类…

数据库的存储过程、函数与触发器

使用下面的场景来引入 1.创建表 CREATE DATABASE staff; USE staff; CREATE TABLE employee(id INT NOT NULL AUTO_INCREMENT,userName VARCHAR(255),birthDate DATE,idCard VARCHAR(255),loginName VARCHAR(255),PASSWORD VARCHAR(255),mobile VARCHAR(255),email VARCHAR(2…

开源连锁收银系统哪个好

针对开源连锁收银系统的选择&#xff0c;商淘云是一个备受关注的候选。商淘云以其功能丰富、易于定制和稳定性等优势&#xff0c;吸引了众多企业和开发者的关注。下面将从四个方面探讨商淘云开源连锁收银系统的优势&#xff1a; 首先&#xff0c;商淘云提供了丰富的功能模块。作…

如何查看SNMP设备的OID

什么是OID和MIB OID OID 代表对象标识符。 OID 唯一地标识 MIB 层次结构中的托管对象。 这可以被描述为一棵树&#xff0c;其级别由不同的组织分配。MIB MIB&#xff08;管理信息基&#xff09;提供数字化OID到可读文本的映射。 使用MIB Browser扫描OID 我的设备是一台UPS SN…

【Uniapp小程序】onShareAppMessage异步处理请求完后再分享

分享按钮 <button type"primary" open-type"share">保存并分享 </button>修改onShareAppMessage saveImage为promise方法 async onShareAppMessage() {const saveRes await saveImage();if (saveRes.code 200) {return {title: "tit…

每日两题 / 236. 二叉树的最近公共祖先 124. 二叉树中的最大路径和(LeetCode热题100)

236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; dfs统计根节点到p&#xff0c;q节点的路径&#xff0c;两条路径中最后一个相同节点就是公共祖先 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

windows部署腾讯tmagic-editor02-Runtime

创建editor项目 将上一教程中的hello-world复制过来&#xff0c;改名hello-editor 创建runtime项目 和hello-editor同级 pnpm create vite删除src/components/HelloWorld.vue 按钮需要用的ts types依赖 pnpm add tmagic/schema tmagic/stage实现runtime 将hello-editor中…

【C语言】5.C语言函数(2)

文章目录 7.嵌套调⽤和链式访问7.1 嵌套调⽤7.2 链式访问 8.函数的声明和定义8.1 单个⽂件8.2 多个⽂件8.3 static 和 extern8.3.1 static 修饰局部变量8.3.2 static 修饰全局变量8.3.3 static 修饰函数 7.嵌套调⽤和链式访问 7.1 嵌套调⽤ 嵌套调用就是函数之间的互相调用。…

Docker安装Mosquitto

在物联网项目中&#xff0c;我们经常用到MQTT协议&#xff0c;用MQTT协议做交互就需要部署一个MQTT服务&#xff0c;而mosquitto是一个常用的MQTT应用服务&#xff0c; Mosquitto是一个实现了消息推送协议MQTT v3.1的开源消息代理软件。MQTT&#xff08;Message Queuing Teleme…

【LeetCode】每日一题 2024_5_14 完成所有任务需要的最少轮数(哈希)

文章目录 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01;题目&#xff1a;完成所有任务需要的最少轮数题目描述代码与解题思路 每天进步一点点 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;完成所有任务需要的最少轮数 题…

麒麟 V10 安装docker2

1. 查看系统版本 2.安装docker-ce 添加源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装docker yum install docker-ce --allowerasing 重启docker systemctl start docker 3.安装nvidia-container-runtime 添…

el-tooltip 提示框样式修改?

【element-plus el-tooltip官网地址&#xff1a; Tooltip 文字提示 | Element Plus】 <el-tooltippopper-class"Tooltip":content"content"placement"top"effect"light" ><span class"content">{{ content }}&l…

文件存储解决方案-阿里云OSS

文章目录 1.菜单分级显示问题1.问题引出1.苹果灯&#xff0c;放到节能灯下面也就是id大于1272.查看菜单&#xff0c;并没有出现苹果灯3.放到灯具下面id42&#xff0c;就可以显示 2.问题分析和解决1.判断可能出现问题的位置2.找到递归返回树形菜单数据的位置3.这里出现问题的原因…

算法学习笔记(5.0)-基于比较的高效排序算法-归并排序

##时间复杂度O(nlogn) 目录 ##时间复杂度O(nlogn) ##递归实现归并排序 ##原理 ##图例 ##代码实现 ##非递归实现归并排序 ##释 #代码实现 ##递归实现归并排序 ##原理 是一种基于分治策略的基础排序算法。 1.划分阶段&#xff1a;通过不断递归地将数组从中点处分开&…

Java 开发 框架安全:Spring 命令执行漏洞.(CVE-2022-22965)

什么叫 Spring 框架. Spring 框架是一个用于构建企业级应用程序的开源框架。它提供了一种全面的编程和配置模型&#xff0c;可以简化应用程序的开发过程。Spring 框架的核心特性包括依赖注入&#xff08;Dependency Injection&#xff09;、面向切面编程&#xff08;Aspect-Or…

DeepSpeed

文章目录 一、关于 DeepSpeed1、DeepSpeed 是什么2、深度学习训练和推理的极致速度和规模3、DeepSpeed 的四大创新支柱1&#xff09;DeepSpeed 训练2&#xff09;DeepSpeed 推理3&#xff09;DeepSpeed 压缩4&#xff09;DeepSpeed4Science 4、DeepSpeed 软件套件DeepSpeed 库推…

React 第二十七章 Hook useCallback

useCallback 是 React 提供的一个 Hook 函数&#xff0c;用于优化性能。它的作用是返回一个记忆化的函数&#xff0c;当依赖发生变化时&#xff0c;才会重新创建并返回新的函数。 在 React 中&#xff0c;当一个组件重新渲染时&#xff0c;所有的函数都会被重新创建。这可能会…

DTC 2024回顾丨zData X 多元数据库一体机:开创多元数据库时代部署新范式

导语 在2024“数据技术嘉年华”上&#xff0c;云和恩墨数据库一体机产品总经理刘宇在“数据库极致特性”专题论坛发表了题为《打造多元数据库部署新范式&#xff0c;引领一体化资源池创新之路》的演讲。他深入分析了国产数据库面临的挑战&#xff0c;并详细介绍了云和恩墨如何利…