MySQL基础-多表查询

目录

简单概述

1.多表之间的关系

1.1 一对多/多对一

1.2 多对多

 1.3 一对一

2. 多表查询-内连接

2.1 隐式内连接

2.2 显式内连接

2.3 内连接小结

 3.多表查询-外连接

3.1 左外连接

 3.2 右外连接

 4.多表查询-自连接

4.1 应用

5.多表查询-联合查询

 6.子查询

6.1 标量子查询

6.2 列子查询

 6.3 行子查询

7.小结


简单概述

在MySQL中,多表查询是指在一个查询中同时涉及多个表的操作。它可以帮助我们从多个表中检索相关数据,并将它们结合在一起进行分析和展示。

1.多表之间的关系

1.1 一对多/多对一

典型的案例就像我上一篇中所写的:MySQL基础篇-约束-CSDN博客

外键约束的案例

也就是利用外键约束来将表之间建立联系

1.2 多对多

案例:学生与课程之间的关系

关系:一个学生可以选修多门课程,一个课程可以供多名学生选择

建立关系:这时候就要建立一张中间表,中间表中至少包含二个外键,分别关联二张表的主键

 创建对应的表

create table student(id int auto_increment primary key ,name varchar(10),no varchar(10)
) comment '学生表';insert into student values (null,'zs','2001010202'),(null,'ls','2001010202'),(null,'kk','2001010202'),(null,'ww','2001010202');create table course(id int auto_increment primary key ,name varchar(10)
) comment '课程表';insert into course values (null,'Java'),(null,'PHP'),(null,'C++');

创建关系表

create table student_course(id int auto_increment primary key ,studentid int not null comment '学生id',courseid int not null comment '课程id',constraint fk_courseid foreign key (courseid) references course (id),constraint fk_studentid foreign key (studentid) references student (id)
) comment '学生课程中间表';

此时学生表和课程表已经与其中的第三张表建立了联系

 1.3 一对一

案例:用户与用户详情的关系

关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。

这是一张用户的详情表

此时我们需要将用户的基本信息和受教育信息拆分出来,就可以使用这种一对一的关系来管理用户数据

 

在其中的一张表中使用约束外键将二者联系起来,这样就可以方便的管理了。

2. 多表查询-内连接

内连接返回的数据

使用内连接查询返回的数据必须要有强制条件那就是建立连接,二张表之间有外键约束建立了连接的数据才会返回。

2.1 隐式内连接

语法结构:

select * from 表名,表名 where 条件;

这里有二张表,他们之间通过 :dept_id 这个约束外键来建立了联系

现在要查询其中建立了联系且对应的数据

select spm.name,dept.name from spm,dept where spm.dept_id = dept.id;

结果: 这样就可以查找到员工对应的部门了

 扩展:通过上面的sql,可以看到where条件以及前面需要查询的字段,其中都需要涉及到

表名.某个字段,所以可以另起别名来简化

select s.name,d.name from spm s,dept d where s.dept_id = d.id;

这个sql的运行结果跟上面的结果是一样的

2.2 显式内连接

语法:

select * from 表名1 INNER JOIN 表名2 ON 条件;

跟上面一样的需求,求出对应的员工的部门

select e.name,d.name from spm e inner join dept d on e.dept_id = d.id;

2.3 内连接小结

显式内连接和隐式内连接的区别在于二点

一:语法不同,这个显而易见

二:sql代码可读性

总的来说,虽然两种方式都可以执行内连接操作,但显式内连接更为推荐,因为它具有更好的可读性和可维护性,能够清晰地展示查询中的连接关系,特别是在处理复杂查询时。而隐式内连接虽然有效,但容易让查询变得混乱和难以理解。因此,建议优先选择显式内连接的方式来编写SQL查询。

 3.多表查询-外连接

外连接返回的数据

外连接和内连接返回的数据基本差不多,但是外连接返回的数据包括没有匹配上的数据,比如绑定的外键是NULL值,外连接也可以查询的到。

3.1 左外连接

返回的数据:

  • 返回左表中的所有数据行,不论是否在右表中有匹配。
  • 如果有匹配,将返回右表中匹配的数据行。
  • 如果没有匹配,右表的列将包含NULL值。
  • 左表中没有匹配的数据行仍然会包含在结果中。

语法: 

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

例如现在要查询所有的员工信息以及他们的部门信息

select s.*,d.name from spm s left join dept d on d.id = s.dept_id

结果,可以即使是null,依然能够返回

 3.2 右外连接

返回的数据:

  • 返回右表中的所有数据行,不论是否在左表中有匹配。
  • 如果有匹配,将返回左表中匹配的数据行。
  • 如果没有匹配,左表的列将包含NULL值。
  • 右表中没有匹配的数据行仍然会包含在结果中。

语法:

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

 没错,它跟左外连接只相差了一个单词

案例:现在我们要查询部门表的所有信息以及对应的员工信息

select d.*,s.* from spm s right join dept d on d.id = s.dept_id;

结果,没有建立连接的则会返回null

 4.多表查询-自连接

语法:

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

4.1 应用

自连接顾名思义就是自己连接自己,在一张表中通过某个字段来将其中的数据建立联系。

例如这种情况:

通过managerid字段,来查询到对应员工的上级

自连接的常见的应用场景:

  1. 组织结构:自连接可用于表示组织结构,例如公司的部门和子部门之间的层次关系。在一个表中存储部门信息,使用自连接可以轻松地查找部门的上级部门或子部门。

  2. 朋友关系:在社交网络或朋友关系管理系统中,自连接可用于查找用户之间的朋友关系。通过在同一用户表中存储用户信息,并使用自连接来建立用户之间的联系,可以轻松地查找用户的朋友或关注者。

  3. 评论和回复:在博客、论坛或社交媒体应用中,自连接可用于构建评论和回复的层次结构。每个评论可以与其父评论相关联,形成回复链。

  4. 员工管理:在员工管理系统中,自连接可用于表示员工与其直接上级的关系。这对于构建组织结构图以及查询员工的管理链非常有用。

  5. 产品和分类:自连接可以用于表示产品与其父产品或分类之间的关系。这在创建产品目录或层次结构时非常有用。

  6. 文件系统:自连接可以用于表示文件系统中的文件和文件夹之间的关系。每个文件夹可以包含文件和子文件夹,形成层次结构。

  7. 图形数据库:自连接是图形数据库中的常见操作,用于表示图形中节点之间的关系,例如社交网络图、地理信息系统等。

自连接在处理具有层次结构或复杂关系的数据时还是挺有作用的。它允许在同一表中查找相关数据,简化了数据检索和操作。在设计数据库模型时,考虑数据的层次结构和关系时,自连接是很有用的。

 案例1:查询员工及其对应上级

select a.name ,b.name 上级 from spm a,spm b where a.managerid = b.id;

结果

案例2:查询员工及其对应上级,没有上级的也要查询出来

这个时候需要查询没有关联的数据,要用到外连接

select a.name ,b.name 上级 from spm a left join spm b on a.managerid = b.id;

结果

5.多表查询-联合查询

它用于合并两个或多个具有相同列结构的查询结果集,生成一个包含所有结果的单个结果集。联合查询通常用于将多个查询结果组合成一个单一的结果集,以便在应用程序中进行更方便的处理和显示。

 案例:查询员工表中age<30 和 salary < 5000 的员工

select * from spm where age < 30
union all
select * from spm where salary < 5000;

结果

可以看到游侠出现了2次,因为并没有做去重处理

select * from spm where age < 30
union 
select * from spm where salary < 5000;

 将 all 去掉就可以达到去重的效果了

 6.子查询

6.1 标量子查询

标量子查询的返回结果只包含单个值(数字,字符串,日期),而不是一组行或多列值。

常见的操作符:=, <>, >, >= , <, <=

案例:查询 “研发部” 的所有员工信息

select * from spm where dept_id = (select id from dept where name = '研发部')

其中括号内的sql返回结果为单一值

6.2 列子查询

列子查询返回的结果是一列(可以是多行)。

常用的操作符:IN (包含), NOT IN , ANY (任一个), SOME , ALL(所有的)

案例:查询研发部和财务部的所有员工信息

select * from spm where dept_id in (select id from dept where name = '研发部' or name = '财务部')

 6.3 行子查询

行子查询返回的结果是一行(可以是多列)。

常见操作符:= ,<> , IN , NOT IN

案例:查询与 ‘游侠’ 的薪资和上级相同的员工信息

 

select * from spm where (salary,managerid) = (select salary,managerid from spm where name = '游侠') and name != '游侠';

结果

7.小结

多表关系

  • 一对多:在多的一方设置外键,关联一的一方的主键
  • 多对多:建立中间表,中间表包含两个外键,关联两张表的主键
  • 一对一:用于表结构拆分,在其中任何一方设置外键(UNIQUE),关联另一方的主键

 多表查询

  • 内连接
  1. 隐式    where
  2. 显式    inner join ...  on ...
  • 外连接
  1. 左外    left join ....   on ...
  2. 右外    right join ... on ...
  • 自连接
  • 子查询

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

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

相关文章

leetcode 10. 正则表达式匹配

2023.9.20 感觉是目前做过dp题里最难的一题了... 本题首要的就是需要理解题意&#xff0c;翻了评论区我才发现之前一直理解的题意是错的。 我原来理解的 “ *匹配0次” 是指&#xff1a;*直接消失&#xff0c;不会影响到前面的字符。 但是*和前一个字符其实是连体的&#xff0…

现代 GPU 容易受到新 GPU.zip 侧通道攻击

来自四所美国大学的研究人员开发了一种新的 GPU 侧通道攻击&#xff0c;该攻击利用数据压缩在访问网页时泄露现代显卡中的敏感视觉数据。 研究人员通过 Chrome 浏览器执行跨源 SVG 过滤器像素窃取攻击&#xff0c;证明了这种“ GPU.zip ”攻击的有效性。 研究人员于 2023 年 …

mysql面试题2:说一说MySQL的架构设计?一条 MySQL 语句执行的步骤?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说MySQL的架构设计? MySQL的架构设计主要包括以下几个组件: 连接器(Connector):负责与客户端建立连接,并进行身份验证和授权。 查询缓存…

黑马JVM总结(二十五)

&#xff08;1&#xff09;字节码指令-cinit 构造方法可以分为两类&#xff0c;一类是cinit 一类init cinit是整个类的构造方法 putstatic&#xff1a;进行static变量的赋值&#xff0c;是到常量池里找到名字一个叫做i的变量 &#xff08;2&#xff09;字节码指令-init in…

自适应阈值分割-OTSU

OTSU 在前面固定阈值中选取了一个阈值为127进行阈值分割&#xff0c;那如何知道选的这个阈值效果好不好呢&#xff1f;答案是&#xff1a;不断尝试&#xff0c;所以这种方法在很多文献中都被称为经验阈值。 Otsu阈值法就提供了一种自动高效的二值化方法。Otsu算法也称最大类间…

python+vue电子资源管理系统

能实现不出家门就可以通过网络进行系统管理&#xff0c;交易等&#xff0c;而且过程简单、快捷。同样的&#xff0c;在人们的工作生活中&#xff0c;也就需要互联网技术来方便人们的日常工作生活&#xff0c;实现工作办公的自动化处理&#xff0c;实现信息化&#xff0c;无纸化…

社区团购新零售搭伙拼团小程序源码(前后端)

社区团购新零售搭伙拼团小程序源码是一款非常实用的电商小程序&#xff0c;它包含了前后端文件&#xff0c; 可以快速地进行部署和使用。该小程序是基于微信小程序开发的&#xff0c;支持社区团购、新零售、搭伙拼团等多种功能。 该小程序具有良好的用户体验&#xff0c;包括…

数据湖在爱奇艺数据中台的应用

01 我们眼中的数据湖 作为爱奇艺的数据中台团队&#xff0c;我们的核心任务是管理和服务公司内的大量数据资产。在实施数据治理的过程中&#xff0c;我们不断吸收新的理念&#xff0c;引入尖端的工具&#xff0c;以精细化我们的数据体系管理。“数据湖”作为近年来数据领域广泛…

链表入门(单链表讲)

链表 1.链表1.1 链表概念及其结构1.2 链表的分类 2.单链表代码实现2.1 单链表的定义2.2 单链表的初始化2.3 单链表的新增结点2.4 单链表的打印2.4 单链表的插入2.4.1 头插2.4.2 尾插2.4.3 任意位置插入 2.5 单链表的删除2.5.1 头删2.5.2 尾删2.5.3 任意位置删除 2.6 单链表的查…

【PickerView案例10-国旗选择界面02 Objective-C预言】

一、好了,我们继续来实现这个国旗选择界面: 1.它的界面里面,是不是很简单,就一个UIPickerView,就完事儿了 然后,显示的每一行内容呢, 1)一个文字Label 2)一个图片 那大家应该有意识,它返回的应该是一个View,对吧, 代理方法里面,有一个返回View的,viewForRow…

Django:五、登录界面实现动态图片验证码

一、下载包 pip install pillow 二、代码 这是一个函数&#xff0c;无输入&#xff0c;返回两个值。一个值是图片&#xff0c;一个值是图片中的数字及字母。 需要注意&#xff1a;font_fileMonaco.ttf 是一个验证码字体文件&#xff0c;如有需要&#xff0c;可三连私信。 …

【逆向】在程序空白区添加Shellcode

目录 硬编码 内存对齐和文件对齐 节表 实战 滴水逆向03-17 #include <windows.h>LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) …

Pycharm 搭建 Django 项目,看完这一篇就够了

1. 安装需求 在使用 python 框架 Django 需要注意下面事项 Pycharm 版本是专业版而不是社区版本Pycharm 配置好了 python 解释器 &#xff08;一般我们现在用的都是python3&#xff09;我自己使用的是 Pycharm 版本是2020.1.2 2. 准备工作 2.1 新建项目 首先我们打开 Pycharm …

Linux离线安装elasticsearch|header|kibna插件最详细

1.准备软件安装包 [hadoophost152 elasticsearch]$ ll -rw-r--r--. 1 hadoop hadoop 515807354 9月 23 23:40 elasticsearch-8.1.1-linux-x86_64.tar.gz -rw-r--r--. 1 hadoop hadoop 1295593 9月 23 23:48 elasticsearch-head-master.tar.gz -rw-r--r--. 1 hadoop hadoop…

记录一个 GUI 库的对比测试结果

1&#xff0c;Java 的 JavaFX 2&#xff0c;golang 的 Fyne 1, Java 测试的是一个俄罗斯方块的 GUI 程序。一切正常。 2&#xff0c;Golang github 的原仓库网络问题&#xff0c;没能测试上&#xff0c;使用以下库 https://gitee.com/mirrors/Fyne 下载代码后提示“编译失…

Tomcat 与 JDK 对应版本关系

对应关系 Tomcat版本 jdk版本11.0.x JDK 21及以后10.1.x JDK11及以后10.0.xJDK1.8及以后9.0.x JDK1.8及以后8.5.xJDK1.7及以后8.0.x JDK1.7及以后 查看对应关系方法&#xff1a; 登陆Tomcat官网&#xff1a;Apache Tomcat - Welcome! 结果&#xff1a;

河北吉力宝以步力宝健康鞋引发的全新生活生态商

在当今瞬息万变的商业世界中&#xff0c;成功企业通常都是那些不拘泥于传统、勇于创新的先锋之选。河北吉力宝正是这样一家企业&#xff0c;通过打造一双步力宝健康鞋&#xff0c;他们以功能性智能科技穿戴品为核心&#xff0c;成功创造了一种结合智能康养与时尚潮流的独特产品…

Leetcode 992. K 个不同整数的子数组

文章目录 题目代码&#xff08;9.27 首刷看解析&#xff09; 题目 Leetcode 992. K 个不同整数的子数组 代码&#xff08;9.27 首刷看解析&#xff09; 滑动窗口&#xff0c;恰好转换为&#xff1a;最多K个不同的数 - 最多K-1个不同的数 class Solution { public:int subarr…

测试用例的八大基本准则

测试用例的八大基本准则 测试用例的八大基本准则功能测试性能测试兼容性测试安全测试可靠性测试易用性测试数据库测试接口测试 测试案例 测试用例的八大基本准则 上节测试用例的设计中我们讨论如何设计一个测试用例&#xff0c;知道了测试用例的设计有&#xff1a;“边界值&am…

如何制作gif动图gif (多图合成gif、GIF录制软件、视频制作成GIF动图)

文章目录 1 在线制作多图合成gif动画2 GIF录制软件3 将现有的视频 制作成GIF动图 1 在线制作多图合成gif动画 在线制作gif动画链接:https://www.matools.com/gif ①选择需要制作gif动画的图片将其添加 ②调整时间间隔&#xff0c;图片宽高等设置 ③一键生成gif ④下载到本…