当前位置: 首页 > 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…...

OpenProject全球化协作本地化策略指南:打破语言壁垒的实战方案

OpenProject全球化协作本地化策略指南&#xff1a;打破语言壁垒的实战方案 【免费下载链接】openproject OpenProject is the leading open source project management software. 项目地址: https://gitcode.com/GitHub_Trending/op/openproject OpenProject作为领先的开…...

nli-distilroberta-base在工业质检文档中的应用:SOP操作步骤与现场记录逻辑一致性核查

nli-distilroberta-base在工业质检文档中的应用&#xff1a;SOP操作步骤与现场记录逻辑一致性核查 1. 项目背景与价值 在工业制造领域&#xff0c;标准作业程序(SOP)与现场操作记录的一致性核查是质量管理的核心环节。传统人工核查方式存在效率低、主观性强、覆盖不全等问题。…...

Quartus中生成与烧录FPGA板载Flash的jic文件全流程解析

1. 为什么需要jic文件&#xff1f; 刚接触FPGA开发的朋友可能会疑惑&#xff1a;为什么编译生成的sof文件不能直接烧录到Flash&#xff1f;这个问题要从FPGA的特性说起。FPGA芯片内部是基于SRAM结构的&#xff0c;这意味着每次断电后配置数据都会丢失。想象一下你正在用电脑写文…...

像素幻梦工坊实战落地:数字艺术教育机构像素创作课AI教具部署

像素幻梦工坊实战落地&#xff1a;数字艺术教育机构像素创作课AI教具部署 1. 项目背景与教育价值 在数字艺术教育领域&#xff0c;像素艺术作为入门门槛较低但创意空间广阔的艺术形式&#xff0c;正受到越来越多教育机构的青睐。然而传统像素艺术教学面临两大挑战&#xff1a…...

8_Harness驾驭工程实践:企业级落地与OpenAI案例解析

8_Harness驾驭工程实践&#xff1a;企业级落地与OpenAI案例解析 关键字&#xff1a; 企业级落地、OpenAI、Ryan Lopopolo、Codex、Harness Engineering、Citi Bank、Ancestry、Ulta Beauty、Agent-First开发、部署策略、自托管、成本优化、迁移路径、最佳实践、0行手写代码、百…...

Android13 PendingIntent Flags: Choosing Between FLAG_IMMUTABLE and FLAG_MUTABLE for Optimal Performa

1. Android13 PendingIntent的Flags变革解析 最近在将项目从Android11迁移到Android13时&#xff0c;我遇到了一个典型的兼容性问题&#xff1a;Targeting S (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a Pendin…...

RWKV7-1.5B-g1a惊艳案例:将复杂段落压缩为三条逻辑闭环要点

RWKV7-1.5B-g1a惊艳案例&#xff1a;将复杂段落压缩为三条逻辑闭环要点 1. 模型能力展示&#xff1a;从复杂到简洁的文本处理 RWKV7-1.5B-g1a作为一款轻量级文本生成模型&#xff0c;在信息压缩和提炼方面展现出令人惊喜的能力。我们通过一个实际案例来展示它如何将复杂内容转…...

别再只用Canvas了!用Vue3组合式API优雅封装fabric.js的画笔与橡皮擦(附完整Hook代码)

重构Canvas交互&#xff1a;用Vue3组合式API封装fabric.js的工程化实践 在Web图形编辑领域&#xff0c;fabric.js以其强大的对象模型和交互能力成为许多开发者的首选。但当我们将它集成到Vue3项目中时&#xff0c;常常会遇到状态管理混乱、代码耦合度高的问题。本文将展示如何用…...

终极指南:如何快速搭建NixOS配置开发环境 [特殊字符]

终极指南&#xff1a;如何快速搭建NixOS配置开发环境 &#x1f680; 【免费下载链接】linux-nixos-hyprland-config-dotfiles Linux &#x1f427; configuration based on NixOS ❄️, Hyprland, and Catppuccin Macchiato theme &#x1f638; for a consistent, complete, a…...

OpenClaw智能邮件助手:nanobot镜像自动分类与回复重要邮件

OpenClaw智能邮件助手&#xff1a;nanobot镜像自动分类与回复重要邮件 1. 为什么需要智能邮件助手 每天早晨打开邮箱&#xff0c;看到堆积如山的未读邮件总是让人头疼。重要客户的询盘可能被埋没在促销广告中&#xff0c;紧急的协作请求可能因为延迟回复而影响项目进度。作为…...