MYSQL————联合查询

news2024/9/21 4:40:11

联合多个表进行查询

设计数据时把表进行拆分,为了消除表中字段的依赖关系,比如部分函数依赖,传递依赖,这时会导致一条SQL查出来的数据,对于业务来说是不完整的,我们就可以使用联合查询把关系中的数据全部查出来,在一个数据行中显示详细信息

两张表建立主外键关系

这是两张表,而在实际生活中,我们想要的是将两张表合并,去掉不需要的部分

列入下面这张表:

select student.id 学生编号,student.name 学生姓名,class.name 班级名称 from student,class where student.class_id=class.id;

 上面这段代码就是一句简单的联合查询


1.联合查询时MYSQL是如何执行的

1.1取多张表的笛卡尔积

语法:

select *from 表名1,表名2;

对多张表进行笛卡尔积的过程

1.先从第一张表中取一条记录,然后再与第二张表中的第一条记录进行组合,生成一条新的记录

2.先从第一张表中取一条记录, 然后再与第二张表中的第二条记录进行组合,生成一条新的记录

以此类推,将第一张表的每一条记录都与第二张表的每一条记录都组合一遍,生成新的记录

最后得到的结果就是一个全排列结果集

通过观察,两张表取笛卡尔积之后,有些数据是无效数据

如何过滤这些无效数据呢? 


1.2通过连接条件过滤掉无效数据

在创建两张表时,我们在表中设置了主外键(即每一张表中的班级编号),故此,我们可以判断两张表的班级编号是否相等(也就是主外键是否相等)来过滤掉无效的数据

class_id在两张表中都存在,MYSQL分不清当前语句中的class_id来自哪一个表,我们可以通过表名.列名的方法来解决这个问题

通过判断主外键是否相等来达到过滤无效数据的效果


1.3能够指定列查询,来精减结果集

在第二步时,查询出来的表还达不到我们想要的效果,即我们不想要class_id和id列出现

查询列表中通过表名.列名的方式指定要查询的字段

 select student.id,student.name,class.name from student,class where student.class_id=class.id;

在1上面的代码中,我们发现每次要指定哪个表中的哪一个列时,都需要写一遍表名,然后在点上列名,当表明很长时就很麻烦,这是我们可以给表名起别名来简化SQL语句

给表起完别名后,直接使用别名.列名就可以指定想要的列了


在上述的操作中,好有一个不完美的地方,就是班级名和学生姓名都用的name,那么我们可以给列取别名来达到一个区分的效果

 联合查询也叫做表连接查询

1.首先确定哪几张表要参与查询

2.根据表与表之间的主外键关系,确定过滤条件

3.精减查询字段,得到想要的结果

2.内连接

语法:

标准的内连接写法:

select 字段 表1 别名1[inner]join 表2 别名2 on 连接条件 and其他条件;

上面使用的方式:

select 字段from 表1 别名1,表2 别名2 where连接条件 and 其他条件;

3.外连接

外连接分为左外连接右外连接。如果联合查询,左侧的表完全显示就是左外连接,右侧的表完全显示就是右外连接

语法:

select 字段 from 表名1 left/right join 表名2 on 条件 and其他条件;

示例:

当使用左外连接时:

以left join左边的表为基准,将满足条件的左表中的记录以及他们对应右表中的记录都打印出来了 

但使用右外连接时:

 由于右表class表有一班,二班,三班,四班,而四班在student表中没有记录,所以当使用右外连接时,打印右表中所有满足条件的记录,而左表中没有与右表对应的记录将会被null代替

注意:MYSQL中不支持全外连接full join

4.自连接

自己和自己进行表连接

可以把行转化为列,在查询的时候可以使用where条件进行过滤,也就是说可以实现行与行之间的比较功能


示例:在下面这个表中,我们要找出数学成绩高于英语成绩的学生

1.缺定涉及的表

scores 表

2.取笛卡尔积

 

在去笛卡尔积时,两张表的表名都为scores,这时我们需要给这两张表取一个别名

3.设置连接条件,也就是两张表的id要相等

4.设置过滤条件,即数学成绩大于英语成绩

5.将不需要的列去掉

5.子查询

子查询也叫做嵌套查询

子查询是把一条SQL的查询结果,当做另一条SQL的查询条件,可以嵌套很多层

可以看出子查询是由很多条SQL语句组成的,也可以把子查询拆分成一条一条单独的语句取执行

最后再把结果和条件拼装在一起,得到查询结果

由于嵌套查询的层数是没有限制的,如果多层嵌套查询效率是不可控的,需要谨慎使用


5.1单行子查询:

示例:

在下列表中查询与孙悟空同一个班的学生

1.参与查询的表

只有一个学生表

2.先查出孙悟空的班级编号

3.在学生表中查出与‘孙悟空’的同班同学,条件是与‘孙悟空’班级编号相同的的所有学生信息

上面这个结果集是我们想要的

4.把查询条件的1用子查询去处理

5.对整体加过滤条件

过滤掉孙悟空这一条记录

子查询只是把单独的SQL拼装在一起而已

单行子查询:返回一行记录的子查询(返回的是一个对象)


5.2多行子查询

多行子查询:返回多行记录的子查询(返回的是一个集合,集合中包含多个对象

语法:

select*from table1 where table1.id in (select id from table2 where xxx=....);

示例:查询语文或英语课程的成绩信息

1.涉及哪些表

课程表和成绩表

2.在课程表中获取语文和英语课程的编号

3.根据获取的课程id,在成绩表中查询对应课程的分数

4.把以上分步查询的SQL语句拼装起来,变成子查询

查询重复的分数

可以使用分组查询的方式

1.同一个学生,同一门课程,同样的成绩,按这三个列同时去分组

2.分组之后在having子句中,用count(*)判断分组中的记录数

加入外层查询

外层查询中的条件字段,与内层查询中的结果,一一做比较,如果相等则满足条件,其中只要有一个不相等则不满足条件

[not]exists关键字

语法:

select *from 表名 where exists(select*from 表名1);

exists后面括号中的查询语句,如果有结果返回,则执行外层的查询,如果没有结果返回,则不执行外层的查询

内层查询返回非空结果集

exists相当于if语句的判断条件,有结果返回true,没有结果返回false

内层查询返回空结果集

外层也返回空结果集,也可以说外层查询没有执行

特殊情况:

返回的结果集是一个非空的,只不过列名为null值也为null

6.合并查询

将表结构相同的表的查询结果,合并多个查询结果到一个结果集中

关键字:

union去除重复的记录
union all保留重复的记录

示例:将id小于5和数学成绩大于80的学生记录合并

使用union关键字 

使用union关键字,去掉了重复的记录


使用union all关键字 

使用union all关键字将所有的两次查询的记录都打印了出来,并没有进行去重操作 

除此之外,当两张表的字段结构相同时,也可以使用合并查询(不需要表的所有结构都相同)

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

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

相关文章

dk安装redis

docker search redis docker pull redis 由于我是使用的镜像 所以我的拉取命令就是 docker pull dockerpull.com/redis 拉下镜像之后,点击下面地址选择自己需要的 redis 版本的配置文件 redis/redis.conf at 6.2.6 redis/redis GitHubRedis is an in-memory data…

Python和Java及MATLAB和CUDA显微镜导图

🎯要点 交互式设备控制和图像处理图像背景和阴影校正可视化萤光团位置算法和读取光学图像读写转换显微镜图像生物医学细胞图像分析荧光图像算法计算亮度数据和模拟表征新型染料和缓冲液强度估计细菌图像分析扫描透射和高分辨率透射图像模拟多模态成像分割可视化透射…

python安装protobuf记录

需求背景 客户需要protobuf环境配置以及插件安装,我主要通过在pycharm里面配置参数,将问题解决! 导语 Python中的protobuf(Protocol Buffers)是一种用于序列化结构化数据的语言无关、平台无关、可扩展的机制。它能够让您在不同的应用程序和语…

搭建基于QT的TCP服务器与客户端

1、实现功能 1、服务器和客户端能够建立连接 2、服务器可以给客户端发送信息 3、客户端可以给服务器发送信息 2、server 2-1、widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> QT_BEGIN_NA…

2024 年 IBM 量子开发者大会:等你来

在 2024 年 IBM Quantum™ 开发者大会上&#xff0c;与会者将获得 IBM Quantum 尖端工具和即将推出的路线图更新的独家、亲身预览&#xff0c;所有这些都围绕一个主题 — — Qiskit 的性能。 2024 年 IBM 量子开发者大会 在此申请 重要日期 7 月 24 日&#xff1a; 开放申请 8 …

leetcode 902. Numbers At Most N Given Digit Set

题目链接 Given an array of digits which is sorted in non-decreasing order. You can write numbers using each digits[i] as many times as we want. For example, if digits [1,3,5], we may write numbers such as 13, 551, and 1351315. Return the number of posit…

Docker续6:容器网络

1.bridge-utils 一个用于Linux系统的网络桥接工具集。它提供了一些命令行工具&#xff0c;帮助用户创建、管理和配置网络桥接。网络桥接是一种将多个网络接口连接在一起&#xff0c;以使它们能够作为单个网络段进行通信的技术。 bridge-utils 常用的命令包括&#xff1a; b…

大阪OSAKA分子泵电源TC163HTC203TC353TC523TC1104TC553TC1813手侧

大阪OSAKA分子泵电源TC163HTC203TC353TC523TC1104TC553TC1813手侧

六、泛型事件框架

一、创建一个BaseEventSO的 基类 写一个泛型事件《T》 启动事件?.Invoke 二、创建一个监听类 同样泛型匹配Event的监听事件 创建OnEable在其中注册事件&#xff1b;OnDisable中注销事件 写一个if语句进行判断是否为空 三、创建一个ObjectEvent 传递Object 原因&#xf…

axios发送post请求实例

在body中的数据格式又有两种&#xff0c;一种是 json 数据格式&#xff0c;另一种是 字符串。具体要用哪种格式取决于后端入参的格式。 如果后端接收json数据类型&#xff0c;post 的 headers 需要设置 { ‘content-type’: ’application/json’ }&#xff0c;传给后端的数…

初学流量分析

一、基本知识 比赛中提供一个包含流量数据的 PCAP 文件&#xff0c;有时候也会需要选手们先进行修复或重构传输文件后&#xff0c;再进行分析。 PCAP 这一块作为重点&#xff0c;复杂的地方在于数据包里充满着大量无关的流量信息&#xff0c;因此如何分类和过滤数据是参赛者需…

stm32f103c8t6引脚功能

STM32F103C8T6拥有丰富的引脚功能&#xff0c;主要包括广泛的GPIO引脚、多种通信接口和特定的调试及电源管理引脚。 STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器&#xff0c;广泛应用于各种嵌入式系统设计中。它具有72MHz的处理速度&#xff0c;搭载128KB的Flash内存…

行业寒冬下的职场生态:卷与痛的交响曲

在2024年的初春&#xff0c;当万物复苏的季节理应带来希望与机遇之时&#xff0c;职场却笼罩在一片前所未有的“寒冬”之中。经济的波动、技术的快速迭代以及市场需求的微妙变化&#xff0c;共同编织了一幅复杂而严峻的行业图景。工作岗位的数量锐减&#xff0c;质量下滑&#…

域名解析DNS服务

DNS服务基础知识 DNS&#xff1a;Domain Name System (域名系统) DNS 是互联网上解决网络中机器命名的一种系统。在网络中&#xff0c;一台主机去访问另外一台主机时&#xff0c;必须要 知道目标主机的IP地址&#xff0c;虽然网络上的节点都可以用IP地址来标识&#xff0c;并且…

Unity | 基础知识

装箱和拆箱&#xff1a; 获取对方的类型&#xff1a; GetType通过打点调用 as进行类型转换 运用Convert进行类型转换&#xff1a; 二维数组的定义 结构体类型 不同名称空间来调用&#xff1a;

构建开发全能型档期预约系统

档期预约系统作为一种高效的时间管理和资源分配工具&#xff0c;在现代社会中的应用越来越广泛。以下是关于档期预约系统的详细分析&#xff1a; 一、系统概述 档期预约系统旨在帮助各类服务机构&#xff08;如医疗机构、美容院、教育培训机构等&#xff09;优化服务流程&…

低代码开发平台:重塑未来软件开发格局的关键力量

低代码开发平台正以前所未有的速度改变着软件开发的面貌&#xff0c;通过最小化手动编码&#xff0c;让用户能够迅速构建应用程序。随着企业对敏捷性和创新能力的追求日益增强&#xff0c;这类平台的需求激增。展望未来&#xff0c;技术进步与市场动态将引领低代码开发进入新的…

实习的一点回顾单元测试

多看看这个&#xff0c;生动 java - Spring、Spring Boot和TestNG测试指南 - 使用Mockito - 颇忒脱 - SegmentFault 思否 如何在Springboot项目中添加testngmockitojacoco单元测试_spring testng mockito-CSDN博客 1.介绍 TestNG 和 Mockito 是 Java 测试框架和库&#xff0…

从零开始学cv-13:形态学变换进阶操作

文章目录 前言一、孔洞填充二、形态学凸壳与细化 前言 通过上文的学习&#xff0c;我们已经基本掌握了基本的形态学操作&#xff0c;并且可以根据这些操作解决大部分实际问题&#xff0c;但还有一些单纯依靠上述算法难以解决的问题&#xff0c;下面我们来举几个更复杂的形态学…

基于单片机的家居环境监测系统的设计

本设计基于单片机的家居环境监测系统&#xff0c;采用STM32F103C6T6单片机作为主要的控制芯片&#xff0c;环境监测方面采用SHT30模块实现室内温度和湿度的监测&#xff1b;有害气体监测方面&#xff0c;用MQ-7传感器实现室内一氧化碳气体的监测&#xff1b;采用WIFI模块连接指…