【MySql】复合查询

2023-11-15


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

回顾基本查询

回顾一下前面所学的基本查询,通过一些案例来练习回顾:

  • 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
select  * from emp where (sal>500 or job='MANAGER') and ename like 'J%';


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

image-20230616153215191

  • 按照部门号升序而雇员的工资降序排序
select * from emp order by deptno asc,sal desc;
  • 使用年薪进行降序排序
select ename,sal,comm,sal*12+ifnull(comm,0) 年薪 from emp order by 年薪 desc;

image-20230616154835895

  • 显示工资最高的员工的名字和工作岗位
select * from emp where sal=(select max(sal) from emp);

image-20230616155417739

  • 显示工资高于平均工资的员工信息
select * from emp where sal > (select avg(sal) from emp);

image-20230616155553578

  • 显示每个部门的平均工资和最高工资
select deptno, max(sal)最高,format(avg(sal),2) 平均 from emp group by deptno;

image-20230616155911748

  • 显示平均工资低于2000的部门号和它的平均工资
select deptno,avg(sal) 平均工资 from emp group by deptno having avg(sal)<2000;

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

image-20230616160210394

  • 显示每种岗位的雇员总数,平均工资
select job,count(*) 人数,format(avg(sal),2) 平均工资 from emp group by job;

image-20230616160906439

多表查询

实际开发中往往数据来自不同的表,所以需要多表查询。现在我们用三张表EMP,DEPT,SALGRADE来演示多表查询。

  • 显示雇员名、雇员工资以及所在部门的名字

因为上面的数据来自EMP和DEPT表,因此要联合查询

将数据进行穷举组合——就是笛卡尔积,此时可以理解为把两张表变成了一张表

image-20230616161929102

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

image-20230616162255418

  • 显示部门号为10的部门名,员工名和工资
select ename,sal,dname from emp,dept where emp.deptno=dept.deptno and emp.deptno=10;

image-20230616162556826

  • 显示各个员工的姓名,工资,及工资级别
select ename,sal,grade,losal,hisal from emp,salgrade where sal between losal and hisal;

自连接

自连接是指在同一张表连接查询

举个例子:

  • 显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno)

想找FORD的领导的编号,通过EMP表;根据领导的编号,找领导信息,也是通过EMP表:

使用的子查询

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

image-20230616165055200

使用多表查询(自查询):

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

image-20230616165818251

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

单行子查询

返回一行记录的子查询

  • 显示SMITH同一部门的员工
select * from emp where deptno=(select deptno from emp where ename='SMITH');

image-20230616232858679

多行子查询

返回多行记录的子查询

  • in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10) and deptno <> 10;

image-20230616233529472

如果此时还想知道对应的员工属于哪个部门的名字呢?

select ename,job,sal,dname from (select ename,job,sal,deptno from emp where job in (select distinct jobb from emp where deptno=10) and deptno <> 10) as tmp,dept where dept.deptno=tmp.deptno;

image-20230616235051124

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

第一种做法:

select * from emp where sal > (select max(sal) from emp where deptno=30);

image-20230616235453947

第二种做法:

select * from emp where sal>all(select distinct sal from emp where deptno=30);

image-20230616235652712

  • any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
select * from emp where sal > any(select distinct sal from emp where deptno=30);

image-20230617000822493

多列子查询

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

  • 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
select * from emp where (deptno,job) = (select deptno,job from emp where ename ='SMITH') and ename <>'SMITH';

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

image-20230617001335480

我们前面说了,任何时刻,查询出来的临时结构,本质在逻辑上也是表结构!

我们上面的子查询全部都是在where子句中,充当判断条件。

下面,我们来看一看在from子句中使用子查询。

在from子句中使用子查询

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

  • 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
select * from emp,(select deptno,avg(sal) myavg from emp group by deptno) tmp where emp.deptno=tmp.deptno and emp.sal> tmp.myavg;

image-20230617213732453

  • 查找每个部门工资最高的人的姓名、工资、部门、最高工资
select ename,sal,t1.deptno,mymax  from emp t1,(select deptno,max(sal) mymax from emp group by deptno) t2 where t1.deptno = t2.deptno
and t1.sal=t2.mymax;

image-20230617214724863

  • 显示每个部门的信息(部门名,编号,地址)和人员数量
select t1.dname,t1.loc,t2.dept_num,t1.deptno from dept t1,(select deptno, count(*) dept_num from emp group by deptno) t2 where t1.deptno=t2.dtno=t2.deptno;

image-20230617220021225

合并查询

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

union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行

  • 将工资大于2500或职位是MANAGER的人找出来
select * from emp where sal > 2500 union select * from emp where job='MANAGER';

image-20230617224752342

union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

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

image-20230617224808089

OJ题目

查找所有员工入职时候的薪水情况

描述

查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序(请注意,一个员工可能有多次涨薪的情况)
CREATE TABLE employees (
emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no));
CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

输入描述:

image-20230617225145771

select s.emp_no,s.salary from salaries s,employees e
where e.emp_no=s.emp_no and e.hire_date=s.from_date
order by e.emp_no desc;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MySql】复合查询 的相关文章

  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MySQL连接字符集问题

    我在 Mac 上使用带有 MySQL 的 velosurf 没有任何编码问题 但是当我切换到 Linux 计算机时 从 velosurf 获得的值未正确编码 我发现这可能是默认连接字符集的问题 在 Mac 上我得到 mysql gt sho
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • MySQL:计算日期/时间之间的差异 - 仅在周一至周五“工作周”期间

    我需要计算开始日期 时间和结束日期 时间之间的差异 但是 我只想在 5 天的工作周内执行此操作 不包括周六 周日 做这个的最好方式是什么 我的想法是 从日期开始 我必须获取星期几 如果是工作日 那么我将添加到累加器中 如果不是 那么我不会添
  • 在mysql中的单个查询中更新多个表

    我有三个查询 我想要一个 这是我的查询 UPDATE tab1 SET a WHERE id 3 UPDATE tab2 SET b WHERE id 9 UPDATE tab3 SET c WHERE id 5 您可以尝试下面的代码 UP
  • 显示标准化数据

    跟进问题 添加 2 个不同表的总和 https stackoverflow com questions 39717541 adding sum from 2 different tables 我创建了3个表 members videos v
  • 仅当值发生更改时如何插入数据库?

    我需要更新 替换 MySQL 数据库中的字段 但前提是它们已更改 该表包含 ID 文本字段和更改日期 用户根据更改日期通过 ID 查询数据 即 如果该日期早于用户上次查询数据的时间 则他不想要它 仅当文本字段与具有相同 ID 的现有文本字段
  • Galera 集群问题

    我想在我们的生产环境中使用Galera集群 但我有一些顾虑 每个表必须至少定义一个显式主键 每个表必须运行在InnoDB或XtraDB存储引擎下 分批处理您的大额交易 例如 不要让一个事务插入 100 000 行 而是将其分成更小的块 例如
  • 在 C# 中,当有人插入、删除或修改记录时,如何从 MySQL 获取事件?

    我正在 WPF Net 中开发一个程序 我需要知道何时有人对数据库的任何表进行更改 这个想法是在数据库发生更改时从数据库接收一个事件 我读了很多文章 但找不到解决我的问题的方法 亲切的问候 最好的解决方案是使用消息队列 在您的应用程序向数据
  • 如何在 MySQL 中求和时间?

    正如您在图片中看到的 我有一份停机报告 显示了所选工厂在选定日期的停机时间 现在我想添加所有的值 Time Duration 列并将其显示在附近的单独显示中 TOTAL TIME DURATION 例如 在图像中 所选日期为 2015 年
  • libmysqlclient.a 和 libmysqlclient_r.a 有什么区别?

    我应该使用哪个来链接 mysqlclient 库 它们之间有什么区别 我似乎找不到答案 谢谢 较新版本的 MySQL 客户端发行版不包含 r 版本 有些可能有从 libmyqslclient r a 到 libmyqslclient a 的
  • MySQL 错误 1172 - 结果包含多行

    在存储过程中运行查询时 我从 MySQL 收到此错误 错误代码 1172 结果包含多行 我理解错误 我正在做一个SELECT INTO var list 因此查询需要返回单行 当我使用LIMIT 1 or SELECT DISTINCT 错
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 如何在 SEQUELIZE (nodeJS) 中创建触发器?

    我正在尝试使用sequelize 创建一个触发器 主要思想是创建一个实例CONFIG创建后USER USER MODEL module exports function sequelize DataTypes var User sequel
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam

随机推荐

  • 延迟渲染到最终结果------1,2,分配渲染目标和初始化窗口(大象无形11.3.1)

    版本不同 我这里延迟渲染是FDeferredShadingSceneRenderer类 即函数 void FDeferredShadingSceneRenderer Render FRHICommandListImmediate RHICm
  • 经过两年努力,我终于进入腾讯(PCG事业群4面总结)

    前言 为什么要尽量让自己进大厂 如果毕业就进了大厂 那你将得到业内大牛的指导 以及随处可见的技术碰撞 新技术的跟进也是非常快的 在这样的环境中 你的技术成长自然是非常快的 如果自己足够努力 用不了三年 你可能也将会跟他们水平差不多 所以 明
  • c语言编译过程

    C语言的编译过程一般分为四个步骤 预处理 编译 汇编和链接 预处理 Preprocessing 预处理器会处理源代码中以 开头的预处理指令 例如 include和 define等 将它们替换为相应的内容 同时 还会删除注释和空格 将多行代码
  • qt-事件循环系统

    Qt中 如果创建的console程序 使用的是QCoreApplication对象 如果创建的是GUI程序 使用的是QApplication对象 而QApplication 继承自 QGUIApplication 最终继承QCoreAppl
  • golang的cms

    golang的cms 2019 03 06 12 53 by 轩脉刃 阅读 评论 收藏 编辑 golang的cms 说说cms cms 内容管理系统 是建站利器 它的本质是为了快速建站 cms本质是一个后台服务站 使用这个后台 能很快搭建一
  • 做区块链卡牌游戏有什么好处?

    区块链卡牌游戏是一种基于区块链技术的创新性游戏形式 它将传统的卡牌游戏与区块链技术相结合 实现了去中心化 数字化资产的交易和收集 这种新型游戏形式正逐渐在游戏行业引起了广泛的关注和热潮 本文将深入探讨区块链卡牌游戏的定义 特点以及其在未来的
  • 自己撸一个阅读类休闲app

    其实自己早就想撸一个app 因为自己一直没什么机会可以做那种好看的app 对我而言好看就是能安装在手机上 然后看着舒服的 所以也对自己所学进行一次整合 然后再次扬帆 感谢那些贡献开源api的大神 也感谢gank 主要使用的开眼的api ga
  • KafkaTemplate是如何发送消息的?

    Kafka使用KafkaTemplate发送消息 需要先实例化bean 配置如下
  • 如何在Eclipse中查看JDK以及Java框架的源码

    对于Java程序员来说 有时候是需要查看JDK或者一些Java框架的源码来分析问题的 而默认情况下 你按住Ctrl 再点击 Java本身的类库 例如ArrayList 是无法查看源码的 那么如何在Eclipse中查看JDK以及Java框架的
  • 如何计算 Node.js GC 负载

    在 Node js 中 我们关注的比较的是 CPU 负载 但是在有 GC 的语言中 GC 负载也是需要关注的一个指标 因为 GC 过高会影响我们应用的性能 本文介绍关于 GC 负载的一些内容 如何获取 GC 耗时 操作系统本身会计算每隔线程
  • 【caffe跑试验遇到错误:Check failed: error == cudaSuccess (2 vs. 0) out of memory】

    刚开始跑caffe试验 老是遇见各种错误 今天又遇见 span style font size 18px color ff0000 I1214 09 32 19 428040 11425 net cpp 748 Ignoring sourc
  • SAS的基本使用介绍1(数据集建立与输入输出格式)

    SAS的基本使用 提前说明 本软件安装较为复杂 而且所占空间很大 运行helloworld Data a File print Put hello world
  • 华为OD机试 - 求满足条件的最长子串的长度(Java)

    题目描述 给定一个字符串 只包含字母和数字 按要求找出字符串中的最长 连续 子串的长度 字符串本身是其最长的子串 子串要求 1 只包含1个字母 a z A Z 其余必须是数字 2 字母可以在子串中的任意位置 如果找不到满足要求的子串 如全是
  • React-Native笔记--react-native-router-flux

    项目中已经开始使用react native router flux 这个库比较大 内容也比较丰富 它是react navigation的增强版 添加了如modal refresh等功能 使用的过程中一点点总结下来 方便以后再用 使用前 np
  • 华为OD机试真题-最差产品奖【2023.Q1】

    题目内容 题目描述 A公司准备对他下面的N个产品评选最差奖 评选的方式是首先对每个产品进行评分 然后根据评分区间计算相邻几个产品中最差的产品 评选的标准是依次找到从当前产品开始前M个产品中最差的产品 请给出最差产品的评分序列 输入描述 第一
  • 建信金科是外包吗_offer比较:北京数据所vs上海建信金科 - 找工作啦(Job)版 - 北大未名BBS...

    数院老博士一个 一直纠结自己毕业的论文 十月中旬才开始找工作 现在有两家愿意给offer 求各位别喷小弱薪资低 北京是兴唐通信也就是数据所 包括保密津贴之类的一个月到手一万二左右 绩效三个月 不过刚面过他们的优秀人才计划 可能会略有上浮 有
  • GB/T 28181联网系统通信协议结构和技术实现

    技术回顾 在本文开头 我们先一起回顾下GB T28181联网系统通信协议结构 联网系统在进行视音频传输及控制时应建立两个传输通道 会话通道和媒体流通道 会话通道用于在设备之间建立会话并传输系统控制命令 媒体流通道用于传输视音频数据 经过压缩
  • pytorch、torchvision历史版本的whl文件下载地址、版本对应关系与离线安装方法

    安装pytorch不需要预装cuda pytorch库的cuda版本本身就有显卡驱动 无论是win还是ubuntu都可使用下面的流程完成离线安装 这里说的离线安装是指先下载完整的pytorch的安装包 再安装pytorch 一 下载和安装p
  • 论文盲审环节,怎么审?

    来源 https www zhihu com question 379907471 编辑 深度学习与计算机视觉 声明 仅做学术分享 侵删 你是否临近毕业 是否好奇论文盲审是怎么审 看看经历过盲审的小伙伴都是怎么说的吧 作者 mosuchen
  • 【MySql】复合查询

    文章目录 回顾基本查询 多表查询 自连接 子查询 合并查询 OJ题目 前面我们讲解的mysql表的查询都是对一张表进行查询 在实际开发中这远远不够 回顾基本查询 回顾一下前面所学的基本查询 通过一些案例来练习回顾 查询工资高于500或岗位为