【MySQL数据库】:MySQL复合查询

news2024/11/16 9:20:12

目录

基本查询回顾

多表查询

自连接 

子查询 

单行子查询 

多行子查询 

多列子查询 

 在from子句中使用子查询

 合并查询


前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够。

基本查询回顾

【MySQL数据库】:MySQL基本查询-CSDN博客

我们借用上述文章分组查询的表!!!

雇员信息表中包含三张表,分别是员工表(emp)、部门表(dept)和工资等级表(salgrade)。

员工表(emp)中包含如下字段:

  • 雇员编号(empno)
  • 雇员姓名(ename)
  • 雇员职位(job)
  • 雇员领导编号(mgr)
  • 雇佣时间(hiredate)
  • 工资月薪(sal)
  • 奖金(comm)
  • 部门编号(deptno)

部门表(dept)中包含如下字段:

  • 部门编号(deptno)
  • 部门名称(dname)
  • 部门所在地点(loc)

工资等级表(salgrade)中包含如下字段:

  • 等级(grade)
  • 此等级最低工资(losal)
  • 此等级最高工资(hisal)

查询工资高于500或岗位为MANAGER的员工,同时要求员工姓名的首字母为大写的J 

select ename,job,sal from emp where (sal>500 or ename='MANAGER') and ename like 'J%';

查询员工信息,按部门号升序而员工工资降序显示

 不同部门的员工按照部门号排升序,而同一部门的员工按员工工资排降序。

查询员工信息,按年薪降序显示 

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

注意

  • 由于NULL与任何值做计算得到的结果都是NULL,因此在计算年薪时不能直接用月薪的12倍加上每个员工的奖金,这样可能导致得到的年薪为NULL值。
  • 在计算每个员工的年薪时,应该通过ifnull函数判断员工的奖金是否为NULL,如果不为NULL则ifnull函数返回员工的奖金,如果为NULL则ifnull函数返回0,避免让NULL值参与计算。

 查询工资最高的员工的姓名和岗位                       

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

查询工资高于平均工资的员工信息 

查询每个部门的平均工资和最高工资

select deptno,format(avg(sal),2) 平均工资,max(sal) 最高工资 from emp group by deptno;

查询平均工资低于2000的部门号和它的平均工资

select deptno,avg(sal) 平均工资 from emp group by deptno having 平均工资<2000;

查询每种岗位的雇员总数和平均工资

select job,count(*), format(avg(sal),2) from emp group by job;

多表查询

  • 上面的基础查询都是在一张表的基础上进行的查询,而实际开发中往往需要将多张表关联起来进行查询,这就叫做多表查询。
  • 在进行多表查询时,只需要将多张表的表名依次放到from子句之后,用逗号隔开即可,这时MySQL将会对给定的这多张表取笛卡尔积,作为多表查询的初始数据源。
  • 多表查询的本质,就是对给定的多张表取笛卡尔积,然后在笛卡尔积中进行查询。

笛卡尔积的初步过滤 

需要注意的是,对多张表取笛卡尔积后得到的数据并不都是有意义的,比如对员工表和部门表取笛卡尔积时,员工表中的每一个员工信息都会和部门表中的每一个部门信息进行组合,而实际一个员工只有和自己所在的部门信息进行组合才是有意义的,因此需要从笛卡尔积中筛选出员工的部门号和部门的编号相等记录。 

select * from emp,dept where emp.deptno=dept.deptno;

显示部门号为10的部门名、员工名和员工工资 

部门名只有部门表中才有,而员工名和员工工资只有员工表中才有,因此需要同时使用员工表和部门表进行多表查询!!! 

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

 

显示各个员工的姓名、工资和工资级别

员工名和工资只有员工表中才有,而工资级别只有工资等级表中才有,因此需要同时使用员工表和工资等级表进行多表查询!!!

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

自连接 

  • 自连接是指在同一张表进行连接查询,也就是说我们不仅可以取不同表的笛卡尔积,也可以对同一张表取笛卡尔积。
  • 如果一张表中的某个字段能够将表中的多条记录关联起来,那么就可以通过自连接将表中通过该字段关联的记录组合起来。

显示员工FORD的上级领导的编号和姓名

 我们可以使用子查询,先对员工表进行查询得到FORD的领导的编号,然后再根据领导的编号对员工表进行查询得到FORD领导的姓名!!!

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

我们也可以使用自连接,因为员工表中的mgr字段能够将表中员工的信息和员工领导的信息关联起来。 

由于自连接是对同一张表取笛卡尔积,因此在自连接时至少需要给一张表取别名,否则无法区分这两张表中的列。

SELECT leader.*  FROM emp AS leader;

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

子查询 

  • 子查询是指嵌入在其他SQL语句中的查询语句,也叫嵌套查询。
  • 子查询可分为单行子查询、多行子查询、多列子查询,以及在from子句中使用的子查询。

单行子查询 

显示SMITH同一部门的员工

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

多行子查询 

in关键字:显示和10号部门的工作岗位相同的员工的名字、岗位、工资和部门号

select ename,job,sal,deptno from emp 
where job in(select distinct job from emp where deptno=10);

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

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

 

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

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

多列子查询 

显示和SMITH的部门和岗位完全相同的员工,不包含SMITH本人

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

注意: 

  • 多列子查询得到的结果是多列数据,在比较多列数据时需要将待比较的多个列用圆括号括起来。
  • 多列子查询返回的如果是多行数据,在筛选数据时也可以使用in、all和any关键字。

 在from子句中使用子查询

  • 子查询语句不仅可以出现在where子句中,也可以出现在from子句中。
  • 子查询语句出现from子句中,其查询结果将会被当作一个临时表使用。

注意: 在from子句中使用子查询时,必须给子查询得到的临时表取一个别名,否则查询将会出错。 

显示每个高于自己部门平均工资的员工的姓名、部门、工资和部门的平均工资 

使用子查询
1. 对emp表首先查询每个部门的平均工资
select avg(sal) asal, deptno dt from emp group by deptno;
2. 将上面的表看作临时表
select ename, deptno, sal, format(asal,2) 
from emp,(select avg(sal) asal, deptno dt from emp group by deptno) tmp
where emp.sal > tmp.asal and emp.deptno=tmp.dt;

 

显示每个部门工资最高的员工的姓名、工资、部门和部门的最高工资 

使用子查询
1.先查询每个部门的最高工资
select max(sal) ms, deptno from emp group by deptno;
2. 将上面的表看作临时表
select emp.ename, emp.sal,emp.deptno, ms 
from emp, (select max(sal) ms, deptno from emp group by deptno) tmp 
where emp.deptno=tmp.deptno and emp.sal=tmp.ms;

 

显示每个部门的部门名、部门编号、所在地址和人员数量

使用多表
select DEPT.dname, DEPT.deptno, DEPT.loc,count(*) '部门人数' 
from emp,DEPT
where emp.deptno=DEPT.deptno
group by DEPT.deptno,DEPT.dname,DEPT.loc;

使用子查询
1. 对emp表进行人员统计
select count(*), deptno from emp group by deptno;
2. 将上面的表看作临时表
select dept.deptno, dname, mycnt, loc 
from dept,(select count(*) mycnt, deptno from emp group by deptno) tmp
where dept.deptno=tmp.deptno;

 

 合并查询

合并查询,是指将多个查询结果进行合并,可使用的操作符有union和union all。

  • union用于取得两个查询结果的并集,union会自动去掉结果集中的重复行。
  • union all也用于取得两个查询结果的并集,但union all不会去掉结果集中的重复行。

显示工资大于2500或职位是MANAGER的员工 

1、查询工资大于2500的员工
select ename,job,sal from emp where sal>2500;

2、查询职位是MANAGER的员工
select ename,job,sal from emp where job='MANAGER';

3、查询工资大于2500或职位是MANAGER的员工,可以使用or操作符将where子句中的两个条件关联起来。
select ename,job,sal from emp where sal>2500 or job='MANAGER';

4、我们可以使用union操作符将上述的两条查询SQL连接起来,这时将会得到两次查询结果的并集,并且会对合并后的结果进行去重。
select ename,job,sal from emp where sal>2500 
union
select ename,job,sal from emp where job='MANAGER';

1、查询工资大于2500的员工

2、查询职位是MANAGER的员工

3、查询工资大于2500或职位是MANAGER的员工,可以使用or操作符将where子句中的两个条件关联起来。

4、我们可以使用union操作符将上述的两条查询SQL连接起来,这时将会得到两次查询结果的并集,并且会对合并后的结果进行去重。

注意:

  • 待合并的两个查询结果的列的数量必须一致,否则无法合并。
  • 待合并的两个查询结果对应的列属性可以不一样,但不建议这样做。

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

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

相关文章

电子电气SCI期刊,中科院1区TOP,收稿范围广泛

一、期刊名称 IEEE Transactions on Smart Grid 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;工程技术 影响因子&#xff1a;9.6 中科院分区&#xff1a;1区 三、期刊征稿范围 IEEE Transactions on Smart Grid是一本跨学科期刊&#xff0c;旨在传播智…

【Linux】进程(1)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;1&#xff09;&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1. 冯诺依曼体系结构2.操作系统&#xff08;Operator System / O…

mysql的增删查改(进阶)

一. 更复杂的新增 将从表名查询到的结果插入到表名2中 insert into 表名2 select .. from 表名1 ...; 创建一个学生表: 创建一个学生表2, 将学生表中的数据加到学生表2中: 注意: 列的类型可以匹配即可插入, 列名和列的类型不一定要完全一致 二. 查询 2.1 聚合查询 前面谈到…

深度学习知识与心得

目录 深度学习简介 传统机器学习 深度学习发展 感知机 前馈神经网络 前馈神经网络&#xff08;BP网络&#xff09; 深度学习框架讲解 深度学习框架 TensorFlow 一个简单的线性函数拟合过程 卷积神经网络CNN&#xff08;计算机视觉&#xff09; 自然语言处理NLP Wo…

LabVIEW中进行步进电机的位置控制

在LabVIEW中进行步进电机的位置控制&#xff0c;通常涉及以下几个关键步骤&#xff1a;设置硬件、配置通信、编写控制算法和实施反馈控制。以下是一个详细的介绍。 硬件设置 步进电机&#xff1a;选择合适的步进电机&#xff0c;根据负载和应用需求选择适当的步数和转矩。 驱…

【力扣】1312. 让字符串成为回文串的最少插入次数

一、题目描述 二、题解 本题我们利用动态规划的思想来解决。 1、状态表示 首先创建一个dp数组&#xff0c;dp[i][j] 表示的是将字符串 s 的 [ i, j ] 区间的这一子串&#xff0c;变成回文串的最少插入次数。 2、状态转移方程 3、初始化 根据「状态转移方程」&#xff0c;没…

煤矿输送设备无人化运维巡检解决方案

一、煤矿行业目前存在的挑战和难题 煤矿行业面临着复杂的环境&#xff0c;如粉尘、潮湿、高温、高瓦斯等&#xff0c;对巡检设备和人员安全有威胁。并且设备分布广、需要长时间作业&#xff0c;全面巡检难度大、对巡检工作的耐力和持续性要求高。而煤矿输送设备无人化运维巡检…

Comfyui图片高清放大方法

在过去的两期内容中&#xff0c;我们探讨了如何安装 ComfyUI 及其在图像生成中的应用。 本期&#xff0c;我们将深入了解如何使用 ComfyUI 对图片进行高清放大. 在开始今天的主题之前&#xff0c;请确保您已经在个人电脑上安装了 ComfyUI。同时&#xff0c;确保您已将 ESRGAN_4…

ios:文本框默认的copy、past改成中文复制粘贴

问题 ios 开发&#xff0c;对于输入框的一些默认文案展示&#xff0c;如复制粘贴是英文的&#xff0c;那么如何改为中文的呢 解决 按照路径找到这个文件 ios/项目/Info.plist&#xff0c;增加 <key>CFBundleAllowMixedLocalizations</key> <true/> <…

Oracle Linux上安装ORDS

ORDS就是Oracle REST Data Services。 环境如下&#xff1a; Oracle Linux 8Oracle Database 19cIP地址为A.B.C.D 要安装最新版本的ORDS&#xff0c;当前为24.1.1。 全程参考文档&#xff1a;Installing and Configuring Oracle REST Data Services 安装ORDS 添加reposit…

固定翼飞机(固定翼飞行器)种类丰富 国家政策推动行业发展速度加快

固定翼飞机&#xff08;固定翼飞行器&#xff09;种类丰富 国家政策推动行业发展速度加快 固定翼飞机又称固定翼飞行器&#xff0c;指机翼固定于机身&#xff0c;可通过固定机翼产生升力的飞行器。固定翼飞机具有机动性强、运载量大、航程远、飞行速度快等优势&#xff0c;在农…

Redis用GEO实现附近的人功能

文章目录 ☃️概述☃️命令演示☃️API将数据库表中的数据导入到redis中去☃️实现附近功能 ☃️概述 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。…

排八字软件有哪些?

排八字软件有哪些&#xff1f;在市面上有很多排八字的软件可供选择&#xff0c;其中一些比较知名的有&#xff1a; 无敌八字排盘软件&#xff1a;这是一款功能强大的八字排盘软件&#xff0c;提供详细的八字解析和命理分析服务&#xff0c;且完全免费。 网易星盘&#xff1a;网…

珠宝首饰AR虚拟3D试戴增强企业商品营销效果

在西安这座古老与现代交织的城市中&#xff0c;VRAR软件开发公司相比其他城市也略多一些&#xff0c;作为专业的西安AR软件开发公司&#xff0c;我们正凭借着前沿的AR增强现实/VR虚拟现实技术&#xff0c;为客户打造独一无二的互动体验。 专业团队&#xff0c;定制开发 我们拥有…

OAK相机如何将 YOLOv9 模型转换成 blob 格式?

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是Ashely。 专…

如何做好流程优化?看这里的目的、原则和方法

流程管理的本质是通过构造卓越的业务流程让流程增值&#xff0c;为客户创造真正的价值。 但卓越的业务流程并不是一蹴而就的&#xff0c;有一个过程&#xff0c;这个过程就是业务流程和流程管理体系不断优化提升的过程&#xff08;可以参照流程成熟度评价模型&#xff09;。 …

[pdf,epub]《软件方法》2024版电子书共290页(202405更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 已上传本账号CSDN资源。 或者到以下链接下载&#xff1a; http://www.umlchina.com/url/softmeth2024.html&#xff0c;或点击“阅读原文”。 如果需要提取码&#xff1a;umlc 已排…

【SpringMVC】_简单示例计算器

目录 1. 需求分析 2. 接口定义 3. 请求参数 4. 响应数据 5. 服务器代码 6. 前端页面代码 7. 运行测试 为阶段性总结与应用&#xff0c;现将以Spring MVC项目创建一个可以实现加法的计算器为例 1. 需求分析 加法计算器功能&#xff0c;对两个整数进行相加&#xff0c;需…

uniapp跨端代码编写(h5和钉钉小程序)

页面开发 差异。小程序编译机制不一样&#xff0c;我在写h5的时候&#xff0c;页面布局啥的都是用uniapp的扩展组件来修改的&#xff08;都是改的原生组件的样式&#xff09;&#xff0c;小程序编译有组件隔离&#xff0c;不能直接修改组件的原生样式&#xff0c;查了很多资料…

Golang | Leetcode Golang题解之第120题三角形最小路径和

题目&#xff1a; 题解&#xff1a; func minimumTotal(triangle [][]int) int {n : len(triangle)f : make([]int, n)f[0] triangle[0][0]for i : 1; i < n; i {f[i] f[i - 1] triangle[i][i]for j : i - 1; j > 0; j-- {f[j] min(f[j - 1], f[j]) triangle[i][j]…