【MySQL基础 | 中秋特辑】多表查询详细总结

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【MySQL学习专栏】🎈
本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

目录

  • 一、多表关系
    • 多对一(一对多)
    • 多对多案例演示
    • 一对一案例演示
  • 二、多表查询概述
    • 多表查询分类
  • 三、内连接
    • 隐式内连接演示
    • 显式内连接演示
  • 四、外连接
    • 左连接
    • 右连接
  • 五、自连接
    • 案例1
    • 案例2
  • 六、联合查询
  • 七、子查询
    • 7.1标量子查询
      • 案例1
      • 案例2
    • 7.2列子查询
      • 案例1
      • 案例2
      • 案例3
    • 7.3行子查询
      • 案例
    • 7.4表子查询
      • 案例1
      • 案例2

一、多表关系

我们在平常的项目开发中,数据库层面设计表结构时,会根据业务需求及业务模块之间的关系分析并设计表结构,由于业务之间相互关联,所以各个表结构也会之间也存在着各种联系。

各个表结构一般分为三种:多对一(多对一)、一对一、多对多

多对一(一对多)

多对一(一对多)案例分析:比如部门和员工之间的关系就可以满足多对一(一对多),即1个员工只能属于1个部门,但是一个部门下可以有多少个员工

数据库方面的实现:在多的一方建立外键,指向一的一方的主键。
举例,请看下图:
在这里插入图片描述

多对多案例演示

多对多案例分析:比如学生和选的课程之间的关系,即1个学生可以选择多门课程、同时1个课程也可以被多个学生选择。
数据库方面的实现:建立第三张中间表,中间表至少包含两个外键,分别关联两个主键(多对多关系中,只能通过中间表来维持关系)。
如下图举例(通过中间表就可以来维护学生表和课程表之间的关系。):
在这里插入图片描述

下面我们通过SQL语句来创建学生表和课程表,建表语句如下:

-- 多对多案例演示:学生表和课程表的创建
create table student(id int auto_increment primary key comment '主键ID',name varchar(10) comment '姓名',num varchar(10) comment '学号'
) comment '学生表';
-- 学生表数据插入
insert into student values(null,'Daming','2022020100'),(null,'Simon','2022020101'),(null,'Amy','2022020102'),(null,'Tom','2022020103'),(null,'James','2022020103');-- 课程表的创建
create table course(id int auto_increment primary key comment '主键ID',name varchar(10) comment '课程名称'
) comment '课程表';
-- 课程表数据插入
insert into course values(null,'C++'),(null,'Java'),(null,'Python'),(null,'PHP'),(null,'MySQL');

结果运行如下:
在这里插入图片描述

在这里插入图片描述
可以看到上图的学生表和课程表已经创建好了,但是两张表之间好像没有任何关系,所以我们需要建立中间表来维护两张表之间的关系。

中间表建表语句和插入数据如下:

-- 学生课程中间表
create table student_course(id int auto_increment primary key comment '主键',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 course(id)
) comment '学生课程中间表';
insert student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);

结果演示:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

一对一案例演示

下面来看一对一多表关系的案例介绍:
案例:用户与用户详情的关系。

一对一的多表关系多用于单表拆分,将一个表中的基础字段放在一张表中,其它详情字段放在另一个表中,以便提高工作效率。

多对多关系在数据库层面的实现方式:在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的(UNIQUE),即唯一约束。

下面是建表和添加数据的SQL语句,请看:

-- 一对一案例介绍
create table tb_user(id int auto_increment primary key comment '主键ID',name varchar(10) comment '姓名',age int comment '年龄',gender char(1) comment '1:男,2:女',phone char(11) comment '手机号'
) comment '用户基本信息表';
insert into tb_user(id,name,age,gender,phone) values(null,'Daming',23,'1','18888000001'),(null,'Amy',22,'2','18888000002'),(null,'Simon',21,'1','18888000003'),(null,'Tom',25,'1','18888000004');create table tb_user_edu(id int auto_increment primary key comment '主键ID',degree varchar(20) comment '学历',major varchar(30) comment '专业',primaryschool varchar(30) comment '小学',middleschool varchar(50) comment '中学',university varchar(30) comment '大学',userid int unique comment '用户名ID',constraint fk_userid foreign key (userid) references tb_user(id)
) comment '用户教育信息表';
insert into tb_user_edu(id,degree,major,primaryschool,middleschool,university,userid) values(null,'本科','绘画','北京市第一小学','北京市第一中学','北京大学',1),(null,'大专','游戏','浙江第一小学','浙江第一中学','浙江大学',2),(null,'本科','棋盘','杭州第一小学','杭州第一中学','清华大学',3),(null,'研究生','编程','青岛第一小学','青岛第一中学','青岛大学',4);

语句运行结果如下:
在这里插入图片描述
在这里插入图片描述
注意,我们为tb_user_edu表中的userid建立了唯一约束,所以一条记录对应着一个用户的基本信息。

二、多表查询概述

多表查询顾名思义就是从多张表中查询数据。

通过多表查询,可以在关联的表之间建立联系,并从这些表中选择和过滤需要的数据。

笛卡尔积:笛卡尔乘积是两个集合A、B所有组合的情况。如下图:
在这里插入图片描述
所以我们在多表查询中需要消除无效的笛卡尔积。

我们通过下面的两张表(emp员工表和dept部门表进行演示),建表语句如下:

-- 部门表
create table dept(id int auto_increment primary key comment 'ID' ,name varchar(10) not null comment '部门名称'
) comment '部门表';-- 员工表
create table emp(id int auto_increment primary key,name varchar(10) not null comment '姓名',age int comment '年龄',job varchar(10) comment '工作',salary int comment '薪资',entrydate date comment '入职时间',managerid int comment 'BossID',dept_id int comment '部门ID'
) comment '员工表';-- 部门表数据插入
insert into dept(id,name) values(1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办'),(6,'人事部');--员工表数据插入
insert into emp(id,name,age,job,salary,entrydate,managerid,dept_id) values(1,'Daming',18,'总经理',30000,'2010-9-12',null,5),(2,'Amy',19,'项目经理',15000,'2009-8-21',1,1),(3,'Simon',20,'后端开发',13000,'2008-8-7',2,1),(4,'David',21,'后端架构师',17000,'2007-7-9',2,1),(5,'Tom',23,'全栈',18000,'2004-8-6',3,1),(6,'Bob',18,'移动开发工程师',15000,'2001-7-30',2,1),(7,'高博',22,'Java架构师',20000,'1999-8-1',4,2),(8,'高翔',29,'前端工程师',10000,'2000-9-29',4,3),(9,'大明',27,'C++软件开发工程师',25000,'1995-9-2',4,2),(10,'Thame',24,'Go语言开发工程师',15000,'1999-5-20',1,2),(11,'Sam',26,'C++全栈开发师',20000,'2000-7-1',5,5),(12,'Jame',18,'安卓开发工程师',14000,'2003-5-1',4,3),(13,'James',29,'C++架构师',18000,'2000-8-9',3,2);-- 外键添加
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

部门表和员工结果如下:
在这里插入图片描述
在这里插入图片描述

下面我们上述表为例来演示一下多表查询:
SQL语句:

select * from emp,dept where emp.dept_id = dept.id;

查询结果如下:
在这里插入图片描述

多表查询分类

多表查询主要分为两大类:连接查询和子查询。

其中连接查询主要分为三种:内连接、外连接、自连接。
内连接:用于查询A、B交集部分的数据。
外连接:分为左外连接(查询左表所有数据和A、B集合的交集部分的数据)和右外连接(查询右表所有数据和A、B集合的交集部分的数据)。
自连接:当前的表与自身的连接查询,自连接必须使用表别名。

三、内连接

内连接:查询的是两张表交集的部分。
内连接分为隐式内连接和显式内连接。

隐式内连接语法:

SELECT 字段列表 FROM1,2 WHERE 条件...;

显式内连接语法:

SELECT 字段列表 FROM1 [INNER] JOIN2 ON 连接条件...;

隐式内连接演示

案例:查询每一个员工的姓名以及该员工所关联部门的名称(隐式内连接演示)。
表结构:emp,dept
连接条件:emp.dept_id = dept.id;

隐式内连接查询语句:

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

演示结果如下:
在这里插入图片描述

显式内连接演示

案例:查询每一个员工的姓名以及该员工所关联部门的名称(显式内连接实现)。
表结构:emp,dept
连接条件:emp.dept_id = dept.id;

显式内连接查询语句:

select emp.name,dept.name from emp inner join dept where emp.dept_id = dept.id;

查询结果如下:
在这里插入图片描述

四、外连接

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

左外连接:查询表1(左表)中的所有数据,这其中包含了表1和表2的交集部分的数据。

左连接

左外连接查询语法:

SELECT 字段列表 FROM1 LEFT [OUTER] JOIN2 ON 条件;

案例演示:查询emp表中的所有数据,和对应的部门信息(使用左外连接)。

查询语句

select emp.* ,dept.name from emp left outer join dept on emp.dept_id = dept.name;

查询结果如下:
在这里插入图片描述

右连接

右连接:查询表2(右表)中的所有数据,这其中包含了表1和表2的交集部分的数据。

右外连接查询语法:

SELECT 字段列表 FROM1 RIGHT [OUTER] JOIN2 ON 条件;

案例演示:查询dept表中的所有数据,和对应的员工信息(使用右外连接)。

查询语句:

select emp.*,dept.name from emp right outer join dept on emp.dept_id = dept.id;

查询结果如下:
在这里插入图片描述

五、自连接

子连接查询语法:

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;

子连接查询可以是内连接查询,也可以是外连接查询。

下面来进行具体案例的举例:

案例1

案例1:查询员工及其所属领导的名字。

查询语句:

select a.name,b.name from emp a,emp b where a.id = b.managerid;

查询结果演示:
在这里插入图片描述

案例2

案例2:查询所有员工及其所属领导的名字,即使该员工没有所属领导,也需要查询出来。

查询语句:select a.name,b.name from emp a left outer join emp b on a.managerid = b.id;

查询结果如下:
在这里插入图片描述

六、联合查询

联合查询关键字:UNION、UNION ALL

联合查询就是把多次查询的结果合并起来,从而形成一个新的查询结果集。

联合查询语法:

SELECT 字段列表 FROM 表A...
UNION[ALL]
SELECT 字段列表 FROM 表B...;

案例演示:将薪资低于19000的员工和年龄超过25岁的员工全部查询出来。

查询语句:

select * from emp where salary < 19000
union all
select * from emp where age < 25;

查询结果如下(可以看到有18条记录):
在这里插入图片描述

如果想要查询结果进行去重的话,我们需要把关键字ALL去掉即可去重,请看:
在这里插入图片描述
可以看到去重之后的结果总共有11条记录。

联合查询注意事项:

  • 联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
  • union all会将全部的数据合在一起(并不会进行去重),而union会对合并后的数据进行去重

七、子查询

概念:SQL语句中嵌套着SELECT语句,称为嵌套查询,又称子查询。
格式如下:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

注意:子查询的外部可以是INSERT/UPDATE/DELETE/SELECT中的任何一个。

根据子查询的结果不同,将子查询分为4类:

  • 标量子查询(子查询结果为单个值)
  • 列子查询(子查询结果为一列)
  • 行子查询(子查询结果为一行)
  • 表子查询(子查询结果为多列多行)

根据子查询位置,分为:WHERE之后FROM之后SELECT之后

7.1标量子查询

标量子查询的结果是单个值(数字、字符串、日期等),标量子查询是子查询中最为简单的一种形式。

标量子查询常用操作符= <> > < >= <=

下面我们来具体演示两个案例:

案例1

案例:查询市场部的所有员工信息。

解析:由于在emp表中是没有市场部这个部门名称的,所以我们把此问题拆分为两步:a.查询市场部的部门id b.根据部门id来查询员工信息

查询语句:

select * from emp where dept_id = (select id from dept where name = '市场部');

查询结果:
在这里插入图片描述

案例2

案例:查询在Tom入职之后的员工信息。

解析:依旧是分为两步走:a.查询Tom的入职时间 b.根据Tom的入职时间来查询员工信息

查询语句:

select * from emp where entrydate > (select entrydate from emp where name = 'Tom');

查询结果:
在这里插入图片描述

7.2列子查询

列子查询返回的结果是一列(可以是多行),将这种子查询称为列子查询。

列子查询常用操作符INNOT INALLANYSOME
在这里插入图片描述
我们接下来依旧是来通过案例来学习列子查询。

案例1

案例介绍:查询市场部和销售部的所有员工信息。

查询语句:

select * from emp where dept_id in(select id from dept where name = '市场部' or name = '销售部');

查询结果:
在这里插入图片描述

案例2

案例介绍:查询比市场部所有人工资都低的员工信息。

解析:如果将问题拆分的话会分为3步:a. 查询市场部的部门id b.根据市场部的部门id查询市场部人员的工资情况 c.根据市场部人员的工资情况来查询比市场部所有人工资都低的员工信息

查询语句1(拆分)

select id from dept where name = '市场部';
select salary from emp where dept_id = (select id from dept where name = '市场部');
select * from emp where salary < all(select salary from emp where dept_id = (select id from dept where name = '市场部'));

查询语句2(使用列子查询):

select * from emp where salary < all(select salary from emp where dept_id = (select id from dept where name = '市场部'));

查询结果
在这里插入图片描述

案例3

案例介绍:查询比研发部中任意一人工资高的员工信息。

查询语句:

select * from emp where salary > some(select salary from emp where dept_id = (select id from dept where name = '研发部'));

查询结果:
在这里插入图片描述

7.3行子查询

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

行子查询常用操作符:=<>INNOT IN

案例

案例介绍:查询与Amy工资及直属领导相同的员工信息。

查询语句

select * from emp where (salary,managerid) = (select salary,managerid from emp where name = 'Amy'); 

查询结果
在这里插入图片描述

7.4表子查询

表子查询返回的是多行多列。

常用操作符:IN

案例1

案例介绍:查询与Amy和Tom职位和薪资相同的员工信息。

查询语句:

select * from emp where(job,salary) in(select job,salary from emp where name = 'Amy' or name = 'Tom');

查询结果:
在这里插入图片描述
哈哈,这里查询出来的结果依旧是Amy和Tom,并不是因为查询语句出错了,而是因为当时表中没有合适的数据。

案例2

案例介绍:查询入职时间是2000-1-1之后的员工信息以及部门信息。

查询语句:

select * from (select * from emp where entrydate > '2000-1-1') e left outer join dept d on e.dept_id = d.id;

查询结果:
在这里插入图片描述

好了,以上就是本文的全部内容。主要讲解了MySQL中的多表查询,其中包括连接查询和子查询。

就到这里吧,再见啦友友们!!!

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

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

相关文章

SI3262:国产NFC+MCU+防水触摸按键三合一SoC芯片

目录 SI3262简介特点结构框图芯片特性 SI3262简介 Si3262是高度集成ACD低功耗MCUNFC15通道防水触摸按键的SoC芯片。 其MCU模块具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、TSC等丰富的…

基于微信小程序的婚庆婚纱摄影预约平台(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

nodejs+vue 医院病历管理系统

系统使用权限分别包括管理员、病人和医生&#xff0c;其中管理员拥有着最大的权限&#xff0c;同时管理员的功能模块也是最多的&#xff0c;管理员可以对系统上所有信息进行管理。用户可以修改个人信息&#xff0c;对医院病历信息进行查询&#xff0c;对住院信息进行添加、修改…

Learn Prompt-Prompt 高级技巧:思维链 Chain of Thought Prompting

Jason Wei等作者对思维链的定义是一系列的中间推理步骤&#xff08; a series of intermediate reasoning steps &#xff09;。目的是为了提高大型语言模型&#xff08;LLM&#xff09;进行复杂推理的能力。 思维链通常是伴随着算术&#xff0c;常识和符号推理等复杂推理任务出…

7实体与值对象 #

本系列包含以下文章&#xff1a; DDD入门DDD概念大白话战略设计代码工程结构请求处理流程聚合根与资源库实体与值对象&#xff08;本文&#xff09;应用服务与领域服务领域事件CQRS 案例项目介绍 # 既然DDD是“领域”驱动&#xff0c;那么我们便不能抛开业务而只讲技术&…

省时省力!推荐几款国内高效办公软件

随着信息技术的快速发展&#xff0c;办公室的工作越来越依赖于电脑和互联网。而高效的办公软件也成为了办公室必不可少的工具。今天我们来分享一些国内的高效办公软件品牌&#xff0c;希望对大家有所帮助。 1、J2L3x J2L3x 是一款专为团队通信而设计的工具&#xff0c;旨在将…

C语言自定义类型讲解:结构体,枚举,联合(2)

&#x1f435;本篇文章将会对位段、枚举和联合的相关知识进行讲解 1. 位段&#x1f4da; 1.1 什么是位段 位段的声明和结构体类似&#xff0c;但是有两点不同&#xff1a; 1.位段的成员必须是int&#xff0c;unsigned int&#xff0c;signed int (C99之后也可以是其他成员&am…

【C语言】通讯录

目录 一、关于通讯录 二、代码逻辑 三、通讯录实现 1.菜单设计 2.逻辑主要功能设计 3.增加联系人功能实现 4.显示全部联系人信息 5.删除联系人 6.查找联系人 7.修改联系人信息 8.对联系人进行排序 9.一键清空所有联系人 四、完整源码 test.c contact.c contact.…

Smart UI Web 16.0.1 WebComponents htmlelements Crack

Javascript Web 组件库 Smart UI Web 组件库是您构建令人惊叹的 Web 应用程序所需的唯一套件。它包含 70 多个快速且专业设计的 UI 组件&#xff0c;可在单个包中实现美观且始终现代的 Web 应用程序。 具有高级功能的即用型Javascript 组件。只需几行代码即可使用数据网格、甘特…

Docker 容器编排

是什么 Docker-Compose是 Docker 官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Compose 是 Docker 公司推出的一个工具软件&#xff0c;可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml&#xff0c;写好多个…

什么是关系模型? 关系模型的基本概念

关系模型由IBM公司研究员Edgar Frank Codd于1970年发表的论文中提出&#xff0c;经过多年的发展&#xff0c;已经成为目前最常用、最重要的模型之一。 在关系模型中有一些基本的概念&#xff0c;具体如下。 (1)关系(Relation)。关系一词与数学领域有关&#xff0c;它是集合基…

干货 | 基于在线监控数据的非现场监管问题识别模型研究

以下内容整理自2023年夏季学期大数据能力提升项目《大数据实践课》同学们所做的期末答辩汇报。 我们汇报的题目是基于在线监控数据的非现场监管问题识别模型研究&#xff0c;我们的汇报将从五个部分展开。首先是项目背景说明&#xff0c;该项目是为了遏制企业逃避监管行为的发生…

(自学)黑客技术——网络安全

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…

精彩回顾 | 迪捷软件亮相2023世界智能网联汽车大会

2023年9月24日&#xff0c;2023世界智能网联汽车大会&#xff08;以下简称大会&#xff09;在北京市圆满落幕。迪捷软件北京参展之行圆满收官。 本次大会由工业和信息化部、公安部、交通运输部、中国科学技术协会、北京市人民政府联合主办&#xff0c;是我国首个经国务院批准的…

希望杯、希望数学系列竞赛辨析和希望数学超1G的真题和学习资源

中国的中小学数学竞赛种类非常多&#xff0c;但是说到全国性的数学竞赛&#xff0c;影响力最大的之一就是“希望杯”&#xff0c;在2017年国家喊停学科竞赛后&#xff0c;“希望杯”逐步停止了&#xff0c;但是鉴于希望杯的巨大影响力&#xff0c;以及背后的利益纠葛&#xff0…

域名备案流程(个人备案,腾讯云 / 阿里云)

文章目录 1.网站备案的目的2.备案准备的材料2.1 网站域名2.2 云资源或备案授权码2.3 电子材料 3.首次个人备案准备的材料3.1 主体相关3.2 域名相关3.3 网站相关3.4 网站服务相关3.5 变更相关 4.个人备案流程4.1 登录系统4.2 填写备案信息&#x1f340; 填写备案省份&#x1f34…

2023 “华为杯” 中国研究生数学建模竞赛(E题)深度剖析|数学建模完整代码+建模过程全解全析

​ 问题一 血肿扩张风险相关因素探索建模 思路&#xff1a; 根据题目要求,首先需要判断每个患者是否发生了血肿扩张事件。根据定义,如果后续检查的血肿体积比首次检查增加≥6 mL或≥33%,则判断为发生了血肿扩张。 具体判断步骤: (1) 从表1中提取每个患者的入院首次影像检查…

十大直线导轨品牌

在现如今的制造业领域中&#xff0c;直线导轨作为重要的传动元件&#xff0c;广泛应用于各种机械装置中&#xff0c;以下是十个在直线导轨领域具有优秀表现的品牌&#xff0c;我们一起来看看&#xff1a; 1、日本THK&#xff0c;致力于开发、生产并且销售LM滚动导轨、滚珠花键、…

设计模式篇---桥接模式

文章目录 概念结构实例总结 概念 桥接模式&#xff1a;将抽象部分与它的实现部分解耦&#xff0c;使得两者都能够独立变化。 毛笔和蜡笔都属于画笔&#xff0c;假设需要有大、中、小三种型号的画笔&#xff0c;绘画出12种颜色&#xff0c;蜡笔需要3*1236支&#xff0c;毛笔需要…

什么是JavaScript中的IIFE(Immediately Invoked Function Expression)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript中的IIFE⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们…