【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】复合查询 的相关文章

  • SQL - 选择具有最大值的所有行

    我有这个 SQL 查询 SELECT id COUNT AS price FROM SELECT FROM rt WHERE somecondition AS st JOIN tt ON st id tt id GROUP BY id 现在
  • 检查 MySQL 和 PHP 中是否都存在 ids 列表

    最有效的方法是什么MySQL and PHP检查 id 列表是否全部存在 我希望函数返回结果是true if allid 存在 否则false 我刚在想 ids array 2233 5545 9478 5343 3545 do all g
  • 如何避免此 PDO 异常:当其他未缓冲的查询处于活动状态时无法执行查询

    我想在我的页面中打印一个包含 3 列的简单表格 building name tags and architecture style 如果我尝试检索列表building names and arch styles没有问题 SELECT bui
  • NodeJS MySQL - 如何知道连接是否释放

    我正在开发 NodeJS MySQL Web API 我在用mysql https www npmjs com package mysqlnpm 模块 我想知道连接是否已释放 是否有任何函数或变量 喜欢 if connection isRe
  • 为 Codeigniter 中的 foreach() 提供的参数无效

    我收到错误消息 我的视图中 foreach 的参数无效 我想显示 mysql 表中的所有条目 但我不断收到错误消息 我是 Codeigniter 的新手 无法真正弄清楚如何解决这个问题 代码如下 我的模型 display branch ph
  • 在MySQL中永久设置auto_increment_offset

    我以 root 身份运行命令 set auto increment offset 2 但从其他连接上看不到效果 为什么不 它是全球性的 From http dev mysql com doc refman 5 1 en replicatio
  • Node.js - 我可以在 PhoneGap / Cordova 应用程序上安装 NPM 包吗?

    感谢 Cordova 我正在构建一个移动应用程序 并且由于 Cordova 基于 Node js 我认为我可以在应用程序中使用 NPM 包 例如 我希望我的移动应用程序能够与远程 MySQL 数据库通信 我想我可以使用 mysql NPM
  • 在 LAMP 配置中创建个性化 URL

    在 LAMP 配置下创建用户个性化 URL 的最佳方法是什么 例如 可以按如下方式访问用户个人资料页面 http www website com profile php id 1 http www website com profile p
  • MySQL 多索引与多列索引进行搜索

    在我正在编写的软件中 它能够搜索给定的表以获取信息 搜索表单有 5 个字段 当然所有字段都对应于表中的不同列 但所有字段都是可选的 我的问题是关于多列索引是否有效以及为其构建查询的正确方法 如果我有一个跨 5 列的索引 并且我构建了一个查询
  • mysql utf8_general_ci 区分大小写

    我有一个 mysql 数据库 我使用 utf8 general ci 不区分大小写 在我的表中 我有一些列 例如 ID 和区分大小写的数据 例如 iSZ6fX 或 AscSc2 为了区分大写和小写 最好只在这些列上设置 utf8 bin 如
  • 如何在 Eclipse 中使用 MySql 数据库

    我对编程非常陌生 所以请耐心等待 如果一开始我没有理解的话 请提前道歉 我正在做一个本科编程项目 需要在 Java 程序中创建一些数据库 我正在使用 eclipse galilo 来编写我的程序 我已经下载了一个连接器 J 但还不知道应该如
  • PHP 和 MySQLi 中没有选择数据库错误[重复]

    这个问题在这里已经有答案了 我必须从 MySQL 数据库中选择数据 我一直在寻找答案 但仍然没有找到 我正在学习W3School http www w3schools com php php mysql select asp 我的 MySQ
  • MySql 完全联接(联合)和多个日期列的排序

    一个相当复杂的 sql 查询 我可能使它变得更加困难 我有两张桌子 消息 newsid 日期时间 新闻文本 图片 图片ID 日期时间 imgPath 两者没有关系 我只是在新闻 图片创建的日期之前加入 到目前为止的 SQL SELECT F
  • SQL Server到Mysql迁移(使用Mysql Workbench)数据传输错误

    我正在使用 Mysql Work bench 6 3 将数据库从 MS Sql server 2008 迁移到 Mysql 在 批量数据传输 期间出错并出现以下警告 这种情况仅发生在像 varchar char 这样的列类型上 当我尝试使用
  • 用于分页的php示例脚本[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 任何人都可以建议一个好的分页 php 脚本 其中人们想要分页显示数据库中的大量项目 以下链接可以帮助您
  • 为什么在 MAC OSX 上编译简单的 mysql c 应用程序时不断收到未定义的符号?

    我正在使用 MACOS 并尝试编写一个 测试 mysql 应用程序 该应用程序仅测试与本地数据库的连接 include
  • SimpleSAMLPHP 重定向循环

    我们正在尝试使用自定义 mysql 数据库设置 sso 但它在以下两个请求之间进入无限循环 POST http 192 168 0 15 simplesaml module php core loginuserpass php 设置Cook
  • ON DUPLICATE KEY UPDATE 的自动增量过多

    我有一个包含列的基本表 id 主要是AI 名称 唯一 etc 如果唯一列不存在 则插入该行 否则更新该行 INSERT INTO pages name etc VALUES bob randomness ON DUPLICATE KEY U
  • 为什么运行 docker 容器后 mysql 数据所有权更改为 systemd-journal-remote

    我的mysql数据库存储在 home mysql代替 var lib mysql 该目录曾经属于mysql 但是 当我运行命令时docker compose up使用这个 yml 文件 version 3 services mariadb
  • PHP 中的嵌套 JSON 输出

    我正在为 iOS 应用程序构建 API 并尝试将 mySQL 数据转换为 JSON 字符串进行处理 所需的输出将需要顶级订单详细信息 例如客户名称和地址 然后是订购的产品子数组 我需要的两个表中有相当多的字段 我希望拥有所有字段 我已经构建

随机推荐

  • 延迟渲染到最终结果------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或岗位为