当前位置: 首页 > 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就是不去掉重复的行。 

五、表的内外连接(拓展)

1.内连接 

内连接实际上就是利用 where 子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。
语法:
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

也就是说,之前的笛卡尔积就是内连接的一种。

比如之前的员工表,案例:显示SMITH的名字和部门名称

 之前的写法:

select ename, dname from EMP, DEPT where EMP.deptno=DEPT.deptno and
ename='SMITH';

标准内连接写法:

select ename, dname from EMP inner join DEPT on EMP.deptno=DEPT.deptno and
ename='SMITH';

其中and换成where也可以。

 

2.左外连接 

外连接分为左外连接和右外连接

如果联合查询,左侧的表完全显示我们就说是左外连接。

 语法:

select 字段名 from 表名1 left join 表名2 on 连接条件

先创建一个学生表和成绩表,并插入数据

-- 建两张表
create table stu (id int, name varchar(30)); -- 学生表
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
create table exam (id int, grade int); -- 成绩表
insert into exam values(1, 56),(2,76),(11, 8);

并且我们注意到,id是有关联性的,但是两张表的信息不是完全吻合的,就是为了方便测试外连接。 

案例:查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来

select * from stu left join exam on stu.id=exam.id;

 

我们发现3号和4号即便没有成绩也会显示出来。如果我们用内连接的话,就不会显示出来了

 

 

3.右外连接 

如果联合查询,右侧的表完全显示我们就说是右外连接。

语法:

select 字段 from 表名1 right join 表名2 on 连接条件;

其实从功能上来说,不需要右外连接也行,因为我们只需要把顺序换一下就可以用左外连接实现右外连接的功能。 

 案例:

stu 表和 exam 表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要
显示出来

 

select * from stu right join exam on stu.id=exam.id;

 

相关文章:

MySQL--复合查询

之前学过了基本的查询&#xff0c;虽然已经够80%的使用场景了&#xff0c;但是依旧需要了解剩下的20%。 一、多表笛卡尔积&#xff08;多表查询&#xff09; 以前我们使用基本查询的时候&#xff0c;from后面就跟一张表名&#xff0c;在多表查询这里&#xff0c;from后面可以跟…...

前端项目开发,3个HTTP请求工具

这一小节&#xff0c;我们介绍一下前端项目开发中&#xff0c;HTTP请求会用到的3个工具&#xff0c;分别是fetch、axios和js-tool-big-box中的jsonp请求。那么他们都有哪些小区别呢&#xff1f;我们一起来看一下。 目录 1 fetch 2 axios 3 js-tool-big-box 的 jsonp 请求 …...

Java_Mybatis

Mybatis是一款优秀的持久层框架&#xff0c;用户简化JDBC(使用Java语言操作关系型数据库的一套API)开发 使用Mybatis查询所有用户数据&#xff1a; 代码演示&#xff1a; UserMapper&#xff1a; Mapper //被调用时会通过动态代理自动创建实体类&#xff0c;并放入IOC容器中…...

2024HW|常见红队使用工具

目录 什么是HW&#xff1f; 什么是网络安全红蓝对抗&#xff1f; 红队 常见工具 信息收集工具 Nmap 简介 漏洞扫描工具 Nessus简介 AWVS 简介 抓包工具 Wireshark简介 TangGo 简介 web 应用安全工具 Burpsuite 简介 SQLMap webshell 管理工具 蚁剑 冰蝎 后…...

Redisson集成SpringBoot

前言&#xff1a;Redisson集成SpringBoot主要有两种方式&#xff0c;一个是使用redisson-spring-boot-starter依赖&#xff08;优先推荐&#xff09;&#xff0c;毕竟springboot主打的就是约定大于配置&#xff0c;这个依赖就是为springboot准备的。 再一种方式就是引入rediss…...

设计模式(十二)行为型模式---模板方法模式

文章目录 模板方法模式结构优缺点UML图具体实现UML图代码实现 模板方法模式 模板方法模式&#xff08;Template Method&#xff09;是一种基于继承实现的设计模式&#xff0c;主要思想是&#xff1a;将定义的算法抽象成一组步骤&#xff0c;在抽象类中定义算法的骨架&#xff…...

【气象常用】剖面图

效果图&#xff1a; 主要步骤&#xff1a; 1. 数据准备&#xff1a;我用的era5的散度数据&#xff08;大家替换为自己的就好啦&#xff0c;era5数据下载方法可以看这里【数据下载】ERA5 各高度层月平均数据下载_era5月平均数据-CSDN博客&#xff09; 2. 数据处理&#xff1a…...

LabVIEW高低温试验箱控制系统

要实现LabVIEW高低温试验箱控制系统&#xff0c;需要进行硬件配置、软件设计和系统集成&#xff0c;确保LabVIEW能够有效地监控和控制试验箱的温度。以下是详细说明&#xff1a; 硬件配置 选择合适的试验箱&#xff1a; 确定高低温试验箱的型号和品牌。 确认试验箱是否支持外…...

Flutter 中的 SliverFillViewport 小部件:全面指南

Flutter 中的 SliverFillViewport 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言来构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;SliverFillViewport 是一个用于 Custo…...

明日周刊-第12期

以前小时候最期待六一儿童节了&#xff0c;父母总会给你满足一个愿望&#xff0c;也许是一件礼物也许是一次陪伴。然而这个世界上其实还有很多儿童过不上儿童节&#xff0c;比如某些地区的小孩子&#xff0c;他们更担心的是能不能见到明天的太阳。 文章目录 一周热点航天探索火…...

算法之美阅读笔记

这里写自定义目录标题 序04 缓存 -- 忘了它吧 序 在图书馆闲逛时&#xff0c;一本封面为绿色的清新的书引起了我的兴趣&#xff0c;书名是算法之美。我心里不禁嘀咕&#xff0c;大家好喜欢使用某某之美作为书名&#xff0c;比如&#xff1a;数学之美、架构之美。美丽美好的事物…...

新手学习STM32还是ESP32

对于新手来说&#xff0c;选择学习STM32还是ESP32取决于个人的学习目标和背景。以下是针对这两种微控制器的详细分析&#xff0c;以便您做出更明智的选择&#xff1a; STM32 1. 处理器架构与性能 STM32采用单核或多核处理器架构&#xff0c;基于ARM Cortex-M0&#xff0c;M0…...

关于vlookup的第一个参数的个人理解

VLOOKUP&#xff08;查阅值&#xff0c;包含查阅值和返回值的查找区域&#xff0c;查找区域中返回值的列号&#xff0c;精确查找或近似查找&#xff09; 我个人理解&#xff0c;第一个参数应该叫线索值&#xff0c;因为我们要通过它去找与其对应的&#xff08;也就是与其同行的…...

vector实现后半部分

一.迭代器失效 1.定义 指原迭代器在扩容/缩容/修改后指向无效元素或无效地址处 erase的迭代器失效 2.原因&#xff1a; 1.有的编译器实现erase会缩容拷贝 2.删除最后一个后&#xff0c;其指向无效元素 VS中不允许再次使用erase完的迭代器&#xff0c;为了让编写的代码移植…...

Maven配置

Maven – Download Apache Maven https://maven.apache.org/install.html 得下载有 bin的...

python 第一天

循环打印 while循环 languages ["Regional Assembly Language","Autocode","FORTRAN","IPL (LISP的先驱)","FLOW-MATIC (COBOL的先驱)","COMTRAN (COBOL的先驱)","LISP","ALGOL 58","F…...

Day03 左侧菜单数据绑定

一.左侧菜单数据绑定 1.首先&#xff0c;进行项目结构塔建。按照Prism 框架约定&#xff0c;要使用自动查找绑定功能。即View &#xff08;视图&#xff09;中自动查找并绑定到对应的ViewModel&#xff08;视图模型&#xff0c;处理视图业务逻辑&#xff09;。就需要在项目中按…...

JavaScript笔记三-JavaScript常用对象

1、数字对象&#xff08;Number&#xff09; 1.1 、属性 属性描述Number.MAX_VALUEJavaScript 中所能表示的最大值Number.MIN_VALUEJavaScript 中所能表示的最小值Number.NaN非数字Number.NEGATIVE_INFINITY负无穷&#xff0c;在溢出时返回Number.POSITIVE_INFINITY正无穷&am…...

最新的CleanMyMac X4.15.4中文破解版新功能介绍及CleanMyMac 安装激活指南

知名的Mac系统清理软件CleanMyMac发布了最新的CleanMyMac X4.15.4&#xff0c;更换了矩形图标&#xff0c;更好的融合和兼容macOS Snoma系统。新版CleanMyMac 支持Intel芯片和苹果M1/M2芯片的Mac。 优化 Mac 电脑&#xff0c;用 CleanMyMac X4.15.4中文版 就够了&#xff01;强…...

密文域可逆信息隐藏安全性研究-从图像到视频

前言 随着云存储、云计算等新兴技术的兴起&#xff0c;海量的隐私信息被广泛地上传、存储到服务器上。为保证用户的隐私性&#xff0c;必须对用户的数据进行加密&#xff0c;然后再将其上传到服务器上。因此&#xff0c;密文域的可逆信息隐藏(reversible data hiding in encry…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...

k8s从入门到放弃之Pod的容器探针检测

k8s从入门到放弃之Pod的容器探针检测 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;容器探测是指kubelet对容器执行定期诊断的过程&#xff0c;以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...