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

MySQL--复合查询

之前学过了基本的查询,虽然已经够80%的使用场景了,但是依旧需要了解剩下的20%。

一、多表笛卡尔积(多表查询)

  以前我们使用基本查询的时候,from后面就跟一张表名,在多表查询这里,from后面可以跟多张表名。

这里有两张测试表,一张是用户的成绩表,还有一张是用户的信息表。

假设我们直接在from后面跟上这两张表

我们发现它们的组合方式就是拿其中一张表的某一条数据,依次跟另一张表的所有数据进行组合。就是穷举组合。

但是我们发现,如果id不相等的话,查出来的结果是没有意义的,所以我们可以加判断条件,使查询结果合理,并且id列是重复的,我们可以指定显示哪些列。

select exam_result.id,name,chinese,qq,age from exam_result,user where exam_result.id = user.id;

在mysql下,一切皆为表。

比如,我们再来查询,年龄在13岁到15岁之间的。

二、自连接 

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

这样子写是不行的。

我们可以对表进行重命名后,再作查询。

 

案例1:找到数学成绩比孙悟空低的同学

方法1:可以用子查询的方式

select * from exam_result where math < (select math from exam_result where name = '孙悟空');

 

方法2:自连接。直接在同一张表里面自连接查询,记得重命名。 

select * from exam_result t1,exam_result t2 where t2.name='孙悟空' and t1.math<t2.math;

 另外我们其实只需要t1表中的信息,那么可以指定一下

三、子查询 

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

单行子查询 

 比如之前的案例:找到数学成绩比孙悟空低的同学

select * from exam_result where math < (select math from exam_result where name = '孙悟空');

因为在子查询那里查出来的条件是单列单行的,所以叫做单行子查询

多行子查询 

与单行不同的是,虽然多行的子查询条件还是只有一列,但是有多行。

这里主要用到三个关键字:in,all,any。

以之前的员工表为例:
in案例:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己

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

 

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

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

 any关键字:

显示工资比部门 30 的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门
的员工)
select ename, sal, deptno from EMP where sal > any(select sal from EMP where
deptno=30);

多列子查询

单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
案例: 查询和 SMITH 的部门和岗位完全相同的所有雇员,不含 SMITH 本人

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

总结:任何时刻,我们查出来的临时结构,本质在逻辑上也是表结构。

在from子句中使用子查询

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

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

//获取各个部门的平均工资,将其看作临时表
select ename, deptno, sal, format(asal,2) from EMP,
(select avg(sal) myavg, deptno dt from EMP group by deptno) tmp
where EMP.sal > tmp.myavg and EMP.deptno=tmp.dt;

 

案例:查找每个部门工资最高的人的姓名、工资、部门、最高工资 

select EMP.ename, EMP.sal, EMP.deptno, ms from EMP,
(select max(sal) mymax, deptno from EMP group by deptno) tmp
where EMP.deptno=tmp.deptno and EMP.sal=tmp.mymax;

 案例:显示每个部门的信息(部门名,编号,地址)和人员数量

-- 1. 对EMP表进行人员统计
select count(*), deptno from EMP group by deptno;
-- 2. 将上面的表看作临时表
select DEPT.deptno, dname, dept_num, loc from DEPT,
(select count(*) dept_num, deptno from EMP group by deptno) tmp
where DEPT.deptno=tmp.deptno;

这里不仅使用了子查询,还使用了多表查询。

总结:解决多表问题的本质就是:想办法将多表转化成单表,在mysql中,所有的select问题全都可以转化成单表问题。(多表查询的指导思想)

四、合并查询

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

跟多表查询还是不同的。

union:

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

 

如图上,就是将第一个数学大于70的结果表跟第二个语文大于85的结果的表合并在一起。

union all就是不去掉重复的行。 

相关文章:

  • wordpress woocommer 添加代码实现,点击按钮,将产品添加到购物车并且跳转到结账页面
  • 西储大学数据集学习
  • 2024年华为OD机试真题-火星文计算-C++-OD统一考试(C卷D卷)
  • Linux 删除SSH密钥(id_ed25519),重新生成
  • 生成式AI模型大PK——GPT-4、Claude 2.1和Claude 3.0 Opus
  • WPF之TextBlock文本标签
  • nuxt3+Element Plus项目搭建过程记录
  • 【源码】Spring Data JPA原理解析之Repository执行过程及SimpleJpaRepository源码
  • K-独立钻石(dfs),G-邪恶铭刻(贪心)
  • 反编译 Trino Dockerfile
  • 基于单片机的自行车里程监测系统的设计
  • 撤销最近一次的提交,使用git revert 和 git reset的区别
  • 【HarmonyOS尝鲜课】- 前言
  • TransFormer学习之VIT算法解析
  • 【调试笔记-20240525-Windows-配置 QEMU/x86_64 运行 OpenWrt-23.05 发行版并搭建 WordPress 博客网站】
  • $translatePartialLoader加载失败及解决方式
  • 「译」Node.js Streams 基础
  • 【笔记】你不知道的JS读书笔记——Promise
  • input实现文字超出省略号功能
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Otto开发初探——微服务依赖管理新利器
  • Redash本地开发环境搭建
  • springboot_database项目介绍
  • win10下安装mysql5.7
  • 订阅Forge Viewer所有的事件
  • 回流、重绘及其优化
  • 解析带emoji和链接的聊天系统消息
  • 今年的LC3大会没了?
  • 坑!为什么View.startAnimation不起作用?
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用Swoole加速Laravel(正式环境中)
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #QT(TCP网络编程-服务端)
  • #stm32驱动外设模块总结w5500模块
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • ${ }的特别功能
  • (02)Unity使用在线AI大模型(调用Python)
  • (C#)获取字符编码的类
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (备忘)Java Map 遍历
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (强烈推荐)移动端音视频从零到上手(上)
  • (算法)Travel Information Center
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原创)可支持最大高度的NestedScrollView
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .FileZilla的使用和主动模式被动模式介绍
  • .gitignore
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 药厂业务系统 CPU爆高分析