当前位置: 首页 > news >正文

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

注意:

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

相关文章:

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

目录 基本查询回顾 多表查询 自连接 子查询 单行子查询 多行子查询 多列子查询 在from子句中使用子查询 合并查询 前面我们讲解的mysql表的查询都是对一张表进行查询&#xff0c;在实际开发中这远远不够。 基本查询回顾 【MySQL数据库】&#xff1a;MySQL基本查…...

PS Mac Photoshop 2024 for Mac[破]图像处理软件[解]PS 2024安装教程[版]

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、Anticc简化版安装1.1双击运行软件&#xff0c;安装1.2 解决来源身份不明的开发者问题**此代码为打开&#xff1a;系统偏好设置 – 隐私与安全性&#xff0c;中的【任何来源】&#xff0c;如下图&#xff1a;**1.3 再次运行…...

深入URP之Shader篇16: UNITY_BRANCH和UNITY_FLATTEN

Shader中的if分支 我们在shader中写if语句&#xff0c;例如&#xff1a; if(a>0){//do some cool thing }else{//do other cool thing }实际上&#xff0c;编译器会进行优化&#xff0c;以及处理成多种不同的情况。比如编译器会将if和else展开&#xff0c;分别执行其中的代…...

5.25.1 用于组织病理学图像分类的深度注意力特征学习

提出了一种基于深度学习的组织病理学图像分类新方法。我们的方法建立在标准卷积神经网络 (CNN) 的基础上,并结合了两个独立的注意力模块,以实现更有效的特征学习。 具体而言,注意力模块沿不同维度推断注意力图,这有助于将 CNN 聚焦于关键图像区域,并突出显示判别性特征通…...

uni-app+php 生成微信二维码 分销海报

主要代码如下&#xff0c;可直接复制调试参数&#xff1a; //查询当前用户是否有分销海报public function user_poster(){$this->checkAuth();//查询会员信息$user $this->getUserInfoById($this->user_id);if(!empty($user[distribution_img])){$result[data] $use…...

已解决java.lang.annotation.AnnotationFormatError: 注解格式错误的正确解决方法,亲测有效!!!

已解决java.lang.annotation.AnnotationFormatError: 注解格式错误的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 报错问题解决思路 解决方法解决方法1. 检查注解定义2. 验证注解使用位置3. 检查注解参数4. 更新依赖库5. 示例代码 解决思路…...

使用 EBS 和构建数据库服务器并使用应用程序与数据库交互

实验 4&#xff1a;使用 EBS 实验概览 本实验着重介绍 Amazon Elastic Block Store (Amazon EBS)&#xff0c;这是一种适用于 Amazon EC2 实例的重要底层存储机制。在本实验中&#xff0c;您将学习如何创建 Amazon EBS 卷、将其附加到实例、向卷应用文件系统&#xff0c;然后进…...

pom文件新增依赖时异常问题定位技巧

今天新增复制两个依赖到项目时&#xff0c;莫名其妙一个爆红artifactId和version&#xff0c;另一个爆红version&#xff0c;但放其他项目却正常&#xff0c;非常莫名其妙。经过一番折腾&#xff0c;终于发现不知道什么时候不小心多写了一个单独的导致的&#xff0c;但是这个异…...

【小白专用24.5.30已验证】Composer安装php框架thinkPHP6的安装教程

一、框架介绍 1、框架简介和版本选择 Thinkphp是一种基于php的开源web应用程序开发框架ThinkPHP框架&#xff0c;是免费开源的、轻量级的、简单快速且敏捷的php框架。你可以免费使用TP框架&#xff0c;甚至可以将你的项目商用&#xff1b; ThinkPHP8.0 是目前框架正式版的最新版…...

ch4网络层---计算机网络期末复习(持续更新中)

网络层概述 将分组从发送方主机传送到接收方主机 发送方将运输层数据段封装成分组 接收方将分组解封装后将数据段递交给运输层网络层协议存在于每台主机和路由器上 路由器检查所有经过它的IP分组的分组头 注意路由器只有3层(网络层、链路层、物理层) 网络层提供的服务 一…...

数据库(12)——DQL聚合查询

常见的聚合函数 将一列数据作为一个整体&#xff0c;进行纵向计算。 函数功能count统计数量max最大值min最小值avg平均值sum求和 语法 SELECT 聚合函数 &#xff08;字段列表&#xff09;FROM 表名; 示例 这是我们的原始表&#xff1a; 求人物总数 select count(id) from in…...

MYSQL四大操作——查!查!查!

目录 简洁版&#xff1a; 详解版&#xff1a; SQL通用语法&#xff1a; 分类&#xff1a; 1. DDL —库 1.1 查询&#xff1a; 1.2 创建&#xff1a; 1.3 删除 1.4 使用库 2. DDL—表 2.1 查询 2.1.1 查询当前库的所有表&#xff1a; 2.1.2 查询表结构 &#xff1a; 2.1.…...

Linux静态库与动态库加载

了解库&#xff1a; 关于库相比大家之前肯定使用过&#xff0c;比如C/C里面的标准库&#xff0c;STL里面的各种库&#xff0c;我们在调用STL里的容器时都需要使用库&#xff0c;那么库到底是什么呢&#xff1f; 库的本质就是可执行程序的"半成品" 我们先来回顾一下代…...

Whisper-AT:抗噪语音识别模型(Whisper)实现通用音频事件标记(Audio Tagger)

本文介绍一个统一音频标记&#xff08;Audio Tagger&#xff09;和语音识别&#xff08;ASR&#xff09;的模型&#xff1a;Whisper-AT&#xff0c;通过冻结Whisper的主干&#xff0c;并在其之上训练一个轻量级的音频标记模型。Whisper-AT在额外计算成本不到1%的情况下&#xf…...

K8s:Pod初识

Pod Pod是k8s处理的最基本单元。容器本身不会直接分配到主机上&#xff0c;封装为Pod对象&#xff0c;是由一个或多个关系紧密的容器构成。她们共享 IPC、Network、和UTS namespace pod的特征 包含多个共享IPC、Network和UTC namespace的容器&#xff0c;可直接通过loaclhos…...

HCIP-Datacom-ARST自选题库__MAC【14道题】

一、单选题 1.缺省情况下&#xff0c;以下哪种安全MAC地址类型在设备重启后表项会丢失? 黑洞MAC地址 Sticky MAC地址 安全动态MAC地址 安全静态MAC地址 2.华为交换机MAC地址表中的动态sticky MAC地址的默认老化时间是多少秒? 300 不会老化 400 500 3.华为交换机MA…...

Go基础编程 - 03 - init函数、main函数、_(下划线)

目录 1. init 函数2. main 函数3. init 函数与 main 函数异同4. _ (下划线)示例 1. init 函数 Go语言中&#xff0c;init 函数用于包&#xff08;package&#xff09;的初始化。具有以下特征&#xff1a; 1. init 函数用于程序执行前包的初始化&#xff0c;如初始化变量等。2…...

【TensorFlow深度学习】LeNet-5卷积神经网络实战分析

LeNet-5卷积神经网络实战分析 LeNet-5卷积神经网络实战分析&#xff1a;从经典模型到现代实践LeNet-5的历史背景LeNet-5网络架构实战代码解析实战分析结论 LeNet-5卷积神经网络实战分析&#xff1a;从经典模型到现代实践 在深度学习的历程中&#xff0c;LeNet-5无疑是一座里程…...

错误发生在尝试创建一个基于有限元方法的功能空间时

问题&#xff1a; index cell.index(#直接使用从0开始的索引if0<1ndex<10: #正集流体 subdomains_x[cell,index(] 1 fem1 /usr/bin/python3.8 /home/wy/PycharmProjects/pythonProject2/fem1.pyUnknown ufl object type FiniteElementTraceback (aost recent call last)…...

【八股】Hibernate和JPA:理解它们的关系

在Java开发中&#xff0c;持久化框架是至关重要的工具&#xff0c;它们帮助开发者将Java对象与关系数据库中的数据进行映射和管理。Hibernate和JPA&#xff08;Java Persistence API&#xff09;是两个广泛使用的持久化框架。那么&#xff0c;Hibernate和JPA之间到底是什么关系…...

C++类型参数技术以及常见的类型擦除容器

文章目录 一、类型擦除的作用二、常见的类型擦除容器1.std::any2.std::function3.std::shared_ptr\<void\>和 std::unique_ptr\<void\>4.总结 三、实现一个any参考 类型擦除&#xff08;Type Erasure&#xff09;是一种编程技术&#xff0c;通过它可以在运行时存储…...

SpringBoot如何缓存方法返回值?

Why&#xff1f; 为什么要对方法的返回值进行缓存呢&#xff1f; 简单来说是为了提升后端程序的性能和提高前端程序的访问速度。减小对db和后端应用程序的压力。 一般而言&#xff0c;缓存的内容都是不经常变化的&#xff0c;或者轻微变化对于前端应用程序是可以容忍的。 否…...

C#的web项目ASP.NET

添加实体类和控制器类 using System; using System.Collections.Generic; using System.Linq; using System.Web;namespace WebApplication1.Models {public class Company{public string companyCode { get; set; }public string companyName { get; set; }public string com…...

Spring MVC 源码分析之 DispatcherServlet#getHandlerAdapter 方法

前言&#xff1a; 前面我们分析了 Spring MVC 的工作流程源码&#xff0c;其核心是 DispatcherServlet#doDispatch 方法&#xff0c;我们前面分析了获取 Handler 的方法 DispatcherServlet#getHandler 方法&#xff0c;本篇我们重点分析一下获取当前请求的适配器 HandlerAdapt…...

假设检验学习笔记

1. 假设检验的基本概念 1.1. 原假设&#xff08;零假设&#xff09; 对总体的分布所作的假设用表示&#xff0c;并称为原假设或零假设 在总体分布类型已知的情况下&#xff0c;仅仅涉及总体分布中未知参数的统计假设&#xff0c;称为参数假设 在总体分布类型未知的情况下&#…...

vue3 watch学习

watch的侦听数据源类型 watch的第一个参数为侦听数据源&#xff0c;有4种"数据源"&#xff1a; ref&#xff08;包括计算属性&#xff09; reactive(响应式对象) getter函数 多个数据源组成的数组。 //ref const xref(0)//单个ref watch(x,(newX)>{console.…...

推荐的Pytest插件

推荐的Pytest插件 Pytest的插件生态系统非常丰富&#xff0c;以下是一些特别推荐的Pytest插件&#xff1a; pytest-sugar 这个插件改进了Pytest的默认输出&#xff0c;添加了进度条&#xff0c;并立即显示失败的测试。它不需要额外配置&#xff0c;只需安装即可享受更漂亮、更…...

C语言 | Leetcode C语言题解之第124题二叉树中的最大路径和

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int max; int dfs(struct TreeNode* root){if(!root) return 0;int left dfs(root->left…...

Linux综合实践(Ubuntu)

目录 一、配置任务 1.1 配置该服务器的软件源为中科大软件源 1.2 安装相关软件openssh-server和vim 1.3 设置双网卡&#xff0c;网卡1为NAT模式&#xff0c;网卡2为桥接模式(桥接模式下&#xff0c;使用静态ip&#xff0c;该网卡数据跟实验室主机网络设置相似&#xff0c;除…...

C++面试题其二

19. STL中unordered_map和map的区别 unordered_map 和 map 都是C标准库中的关联容器&#xff0c;但它们在实现和性能方面有显著区别&#xff1a; 底层实现&#xff1a;map 是基于红黑树实现的有序关联容器&#xff0c;而 unordered_map 是基于哈希表实现的无序关联容器。元素…...