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

目录

基本查询回顾

多表查询

自连接 

子查询 

单行子查询 

多行子查询 

多列子查询 

 在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连接起来,这时将会得到两次查询结果的并集,并且会对合并后的结果进行去重。

注意:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为telnet的两种认证方式

华为telnet的两种认证方式 实验拓扑&#xff1a; 实验要求&#xff1a; 1.采用普通密码认证实现telnet 远程登录机房设备R3 2.采用AAA认证服务方式实现telnet 远程登录机房设备R3 实验步骤&#xff1a; 1.完成基本配置&#xff08;设备接口配置IP&#xff0c;此步骤略过&#…

JVM-JAVA-类加载过程

JVM源码 类加载到 JVM 的过程通过 java 命令执行代码的流程 类加载到 JVM 的过程 在运行一个 main 函数启动程序是&#xff0c;首先需要类加载起把主类加载到 JVM 中 通过 java 命令执行代码的流程 loadClass的类加载过程有如下几步&#xff1a; 类被加载到方法区中后主要包…

视频汇聚EasyCVR安防系统对接公安部GA/T 1400视图库布控、告警、订阅流程描述

随着信息技术的飞速发展&#xff0c;视频监控在公共安全领域的应用越来越广泛&#xff0c;对于视频监控系统的要求也日益严格。为了满足公安系统对视频图像信息应用的高标准需求&#xff0c;视频汇聚平台EasyCVR视频监控系统全面支持GA/T 1400标准协议&#xff0c;为公安部门提…

【C++】——string模拟实现

前言 string的模拟实现其实就是增删改查&#xff0c;只不过加入了类的概念。 为了防止与std里面的string冲突&#xff0c;所以这里统一用String。 目录 前言 一 初始化和销毁 1.1 构造函数 1.2 析构函数 二 迭代器实现 三 容量大小及操作 四 运算符重载 4.1 bool…

03-树3 Tree Traversals Again(浙大数据结构PTA习题)

03-树3 Tree Traversals Again 分数 25 作者 陈越 An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, th…

实际测试stm32中断优先级

https://m.weibo.cn/1711020180/5040208380168258

【字典树(前缀树) 哈希映射 后序序列化】1948. 删除系统中的重复文件夹

本文涉及知识点 字典树&#xff08;前缀树) 哈希映射 后序序列化 LeetCode 1948. 删除系统中的重复文件夹 由于一个漏洞&#xff0c;文件系统中存在许多重复文件夹。给你一个二维数组 paths&#xff0c;其中 paths[i] 是一个表示文件系统中第 i 个文件夹的绝对路径的数组。 …

Codeforces Round 949 (Div. 2) (A~C)

1981A - Turtle and Piggy Are Playing a Game 贪心&#xff0c;每次取x 2&#xff0c;求最大分数 // Problem: B. Turtle and an Infinite Sequence // Contest: Codeforces - Codeforces Round 949 (Div. 2) // URL: https://codeforces.com/contest/1981/problem/B // Me…

iOS组件化 方案 实现

iOS组件化 组件化的原因现在流行的组件化方案方案一、url-block &#xff08;基于 URL Router&#xff09;方案二、protocol调用方式解读 方案三、target-action调用方式解读 gitHub代码链接参考 组件化的原因 模块间解耦模块重用提高团队协作开发效率单元测试 当项目App处于…

2024最新群智能优化算法:大甘蔗鼠算法(Greater Cane Rat Algorithm,GCRA)求解23个函数,提供MATLAB代码

一、大甘蔗鼠算法 大甘蔗鼠算法&#xff08;Greater Cane Rat Algorithm&#xff0c;GCRA&#xff09;由Jeffrey O. Agushaka等人于2024年提出&#xff0c;该算法模拟大甘蔗鼠的智能觅食行为。 参考文献 [1]Agushaka J O, Ezugwu A E, Saha A K, et al. Greater Cane Rat Alg…

LAMMPS - 分子动力学模拟器

本文翻译自&#xff1a;https://www.lammps.org/ 文章目录 一、关于 LAMMPS下载作者R&D 100 二、LAMMPS 亮点毛细血管中的血流 一、关于 LAMMPS 官网&#xff1a; https://www.lammps.org/ github &#xff1a;https://github.com/lammps/lammps LAMMPS 分子动力学模拟器…

初识java——javaSE(8)异常

文章目录 一 异常的概念与体系结构1.1 什么是异常&#xff1f;1.2 异常的体系结构&#xff01;1.3 编译时异常与运行时异常与Error编译时异常&#xff1a;异常声明&#xff1a;throws关键字 运行时异常&#xff1a;什么是Error? 二 处理异常2.1 异常的抛出&#xff1a;throw(注…

利用映射算子打印菱形

文章目录 一、利用RDD完成&#xff08;一&#xff09;右半菱形&#xff08;二&#xff09;左半菱形&#xff08;三&#xff09;完整菱形&#xff08;四&#xff09;输出任意大菱形 二、利用Java完成&#xff08;一&#xff09;右半菱形&#xff08;二&#xff09;左半菱形&…

恒压频比开环控制系统Matlab/Simulink仿真分析(SPWM控制方式)

介绍恒压频比的开环控制方法驱动永磁同步电机的转动&#xff0c;首先分析恒压频比的控制原理&#xff0c;然后在Matlab/Simulink中进行永磁同步电机恒压频比开环控制系统的仿真分析&#xff0c;最后将Simulink中的恒压频比控制算法生成代码加载到实际工程中进行工程实现。 一、…

react 表格实现拖拽功能

项目背景 : react ant 单纯实现拖拽确实不难 , 我的需求是根据后台接口返回 , 生成对应的父子表格 , 并只可以拖拽子的位置 , 如图 后台返回的数据结构 (pid为0说明是父 , 子的pid等于父的id , 说明是父的子) 1 , 我先转成了树形结构且自己加上了key (注意 : key一定得是唯一的…

异常(Exception)

捕获异常 public class test {public static void main(String [] args) {int[] arr {1,2,3,4,5};try {System.out.println(arr[10]);}catch (ArrayIndexOutOfBoundsException e) {//索引越界异常System.out.println("索引越界");}System.out.println("看看我是…

测试FaceRecognitionDotNet报错“Error deserializing object of type int”

FaceRecognitionDotNet宣称是最简单的.net人脸识别模块&#xff0c;其内部使用Dlib、DlibDotNet、OpenCVSharp等模块实现人脸识别&#xff0c;网上有不少介绍文章。实际测试过程中&#xff0c;在调用FaceRecognition.Create函数创建FaceRecognition实例对象时&#xff0c;会报如…

AI入门:普通人可以利用AI做什么?休闲时间赚点小钱?(含多种实践案例)

大家好&#xff0c;我是影子&#xff0c;一名AI编程深耕者。 最近&#xff0c;有很多 AI 小白问我&#xff0c;AI到底可以做些什么&#xff1f;对我们普通人能有哪些帮助&#xff1f; 在我看来&#xff0c;对于我们刚接触 AI 的小伙伴而言。我们可以利用 AI 为我们工作提效&…

构建 VPC 并启动 Web 服务器

实验 2&#xff1a;构建 VPC 并启动 Web 服务器 目标 完成本实验后&#xff0c;您可以&#xff1a; 创建 VPC。创建子网。配置安全组。在 VPC 中启动 EC2 实例。任务 1&#xff1a;创建 VPC 在本任务中&#xff0c;您将使用 VPC 向导在单个可用区中创建一个 VPC、一个互联网网关…

神经网络---卷积神经网络CNN

一、从前馈神经网络到CNN 前馈神经网络&#xff08;Feedforward Neural Networks&#xff09;是最基础的神经网络模型&#xff0c;也被称为多层感知机&#xff08;MLP&#xff09;。 它由多个神经元组成&#xff0c;每个神经元与前一层的所有神经元相连&#xff0c;形成一个“…