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;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

13 VUE学习:组件v-model

基本用法 v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 [defineModel()]宏&#xff1a; <!-- Child.vue --> <script setup> const model defineModel()function update() {model.value } </script><te…

GitLab的安装及基础操作

1. 项目目标 &#xff08;1&#xff09;熟练使用rpm包安装gitlab &#xff08;2&#xff09;熟练配置gitlab &#xff08;3&#xff09;熟练创建gitlab群组、成员、项目 &#xff08;4&#xff09;熟练使用gitlab推送和拉取代码 2. 项目准备 2.1. 规划节点 主机名 主机I…

JavaScript连接MySQL:搭建全栈应用的桥梁

JavaScript连接MySQL&#xff1a;搭建全栈应用的桥梁 环境准备与依赖安装安装Node.js安装MySQL安装MySQL连接库 JavaScript与MySQL的基本交互建立连接执行查询插入、更新和删除数据插入数据示例 安全性和性能优化预防SQL注入连接池错误处理与日志记录 结语与讨论 在现代Web开发…

Gb 2024-05-22开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-22统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3非开发语言项目2Jupyter Notebook项目2Rust项目2JavaScript项目1Lua项目1编程面试大学:成为软件工程师的全面学习计划 创建周期:2…

Golang对nil的Slice和空Slice处理是一致的吗

在Go中&#xff0c;nil的slice和空的slice并不完全相同&#xff0c;尽管它们的许多行为在很多情况下是相似的。 nil slice var s []int在这种情况下&#xff0c;s是一个nil的slice。它的容量和长度都为0&#xff0c;且没有指向任何底层的数组。 空slice s : []int{} // s :…

upstream的指令参数max_conns,slow_start,down与backup,max_fails与fail_timeout参数使用说明

upstream的指令参数 1.upstream的指令参数之max_conns [限制服务器最大连接数] #配置上游服务器 upstream tomcats {server 192.168.28.102:8080 max_conns=2;server 192.168.28.103:8080 max_conns=3;server 192.168.28.104:8080 max_conns=5

查询DQL

016条件查询之等量关系 条件查询语法格式 select ... from... where过滤条件;等于 select empno, ename from emp where sal3000;select job, sal from emp where enameFORD;select grade, losal, hisal from salgrade where grade 1;不等于 <> 或 ! selectempno,en…

德比软件携手亚马逊云科技,用生成式AI赋能旅游行业降本增效

旅游行业是最早被数字化技术赋能的行业之一。比如&#xff0c;消费者早已习惯在携程、艺龙、Booking等OTA平台根据实时酒店信息预订酒店。 这种丝滑的消费者体验背后&#xff0c;离不开领先的管理软件支撑。实际上大型酒店集团与OTA平台之间的系统对接非常复杂&#xff0c;酒店…

Go GORM介绍

GORM 是一个功能强大的 Go 语言 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它提供了一种方便的方式来与 SQL 数据库进行交互&#xff0c;而不需要编写大量的 SQL 代码。 GORM的关键特性 全功能的ORM&#xff1a;支持几乎所有的ORM功能&#xff0c;包括模型定义、基…

在Ubuntu系统中使用Systemctl添加启动项的详细指南

在Ubuntu系统中使用Systemctl添加启动项的详细指南 在Ubuntu系统中&#xff0c;systemctl 是管理systemd服务的主要工具。通过它&#xff0c;你可以添加、启动、停止、重启、启用和禁用服务。 什么是Systemctl&#xff1f; systemctl 是一个用于管理systemd系统和服务管理器…

std::vector<数据类型>(大小),较常用的相关方法总结

一、初始化 我的理解是vector就相当于数组&#xff0c;可以是整型数组、字符串数组等&#xff0c;其中存放什么数组取决于<数据类型> std::vector<int> a; // 整型数组std::vector<string> b; // 字符串数组a {1,2,3,4,5,6};std::cerr << a.size() &…

OpenHarmony迎来首个互联网技术统一标准,鸿蒙OS生态走向如何?

开源三年半&#xff0c;OpenHarmony(以下简称“开源鸿蒙”)迎来了新进展。在5月25日召开的「OpenHarmony开发者大会」上&#xff0c;鸿蒙官宣了开源鸿蒙设备统一互联技术标准。 一直以来&#xff0c;各行业品牌操作系统相互独立、难以协同,成为其互联互通的痛点。为进一步解决…

顺序表以及实现(结构篇)

顺序表是一种线性表的存储结构&#xff0c;它使用一组地址连续的存储单元依次存储线性表的数据元素。在顺序表中&#xff0c;逻辑上相邻的元素在物理存储上也相邻&#xff0c;通常采用数组来实现这种存储方式。 前言&#xff1a; 顺序表格的特点&#xff1a; 随机访问&#x…

【MySQL精通之路】SQL语句(7)-数据库管理语句(3)-表维护语句

目录 1.ANALYZE TABLE语句 1.1 输出 1.2 KEY分布分析 1.3 直方图统计分析 2.CHECK TABLE语句 2.1 输出 2.2 检查版本兼容性 2.3 检查数据一致性 2.4 InnoDB表的CHECK TABLE的使用说明 2.5 MyISAM表的CHECK TABLE使用说明 3.CHECKSUM TABLE语句 3.1 性能注意事项 4…

Unity SetParent第二个参数worldPositionStays的意义

初学Unity的小知识&#xff1a; 改变对象的父级有三种调用方式&#xff0c;如下&#xff1a; transMe.SetParent(transParent,true); transMe.SetParent(transParent,false); transMe.parent transParent;具体有什么区别呢&#xff0c;这里写一个测试例子来详细说明&#xff…

LLaMA-Factory 微调训练

LLaMA-Factory 微调训练 该框架功能&#xff0c;标注-微调-导出-合并-部署&#xff0c;一整条流程都有&#xff0c;而且训练时消耗的gpu算力也会小一些 一&#xff0c;安装&#xff08;推荐在linux中训练&#xff0c;win可以用wsldocker&#xff09; git clone https://githu…

数据驱动的UI艺术:智能设计的视觉盛宴

数据驱动的UI艺术&#xff1a;智能设计的视觉盛宴 引言 在当今这个数据泛滥的时代&#xff0c;大数据不仅仅是一种技术手段&#xff0c;它更是一种艺术形式。当大数据遇上UI设计&#xff0c;两者的结合便催生了一种全新的艺术形式——数据驱动的UI艺术。本文将探讨如何将数据…

STM32建立工程问题汇总

老版本MDK&#xff0c;例如MDK4 工程内容如下&#xff1a; User文件夹中存放main.c文件&#xff0c;用户中断服务函数&#xff08;stm32f1xx.it.c&#xff09;&#xff0c;用户配置文件&#xff08;stm32f1xx_hal_conf.h&#xff09;等用户程序文件&#xff0c;或者mdk启动程序…

5,串口编程---实现简单的用串口发送接收数据

单片机通过串口向PC机发送数据 PC机通过串口接收单片机发过来的数据 1.UART和USART的区别&#xff1a; USART支持同步通信方式,可以通过外部时钟信号进行同步传输,而UART仅支持异步通信方式 本开发板STM32F103ZET6有5个串口&#xff0c;用串口1作调试串口&#xff0c;因为串…