天涯论坛

 找回密码
 立即注册
搜索
查看: 71|回复: 3

SQL 多表查询仔细讲解

[复制链接]

3038

主题

148

回帖

9911万

积分

论坛元老

Rank: 8Rank: 8

积分
99119143
发表于 2024-8-4 14:58:01 | 显示全部楼层 |阅读模式

1. 前言

多表查找叫作为多表连接查找做为关系型数据库最重点查找方式,在平常工作中被广泛运用

平常的多表查找操作包括查找、内连接、左外连接、右外连接、完全连接、交叉连接

本篇文案将利用一个实例逐一介绍这些操作

2. 准备

以 Mysql 数据库为例,创建两张数据表:

student - 学生表

record - 选课记录表

其中,学生表 id 字段对应选课记录表中的 student_id 字段

Sql 如下:

# 学生表:studentcreate table

 student

(

    id   int          not null        primary key

,

    name varchar(255null

,

    age  int          null

)

    comment 学生表

;

# 选课记录表:recordcreate table record

(

    id         int          not null        primary key

,

    name       varchar(255not null

,

    student_id int          not null

,

    time       datetime     null

)

    comment 选课记录

;

而后,向 2 张表中插进有些数据

# 学生表数据

1,张三,18

2,李四,23

3,王五,30

4,马六,35

5,孙七,40

6,朱八,19

7,黄九,53

# 记录表数据

2021001,语文,1,2021-01-18 15:32:472021002,数学,2,2021-01-18 15:33:412021003,英语,3,2021-01-18 15:34:012021004,理学,4,2021-01-18 15:34:332021005,体育,5,2021-01-18 15:34:472021006,化学,8,2021-01-18 15:35:122021007,生物,9,2021-01-18 15:35:392021008,音乐,10,2021-01-1815:36:00

3.1 子查找

查找,又叫作之为内查找,是一种嵌套在其他 Sql 查找的 Where 子句中的查找

通常用于对查找结果的进一步限制,返回所必须的数据;查找能够用在SELECT、INSERT、UPDATE 和 DELETE 语句中

这儿以 SELECT 语句为例,在两张表中运用查找,筛选出满足条件的记录

# 子查找select * from student where id in (select student_id from record where student_id<=3

)

查找结果如下:

# 子查找的结果1

,张三,18

2

,李四,23

3

,王五,30)

必须重视的是,查找必要包括在圆括号内,并且不可运用 ORDER BY 进行排序

3.2 内连接

内连接是经过关键字 inner join 连接两张表,只返回满足 on 要求的,两张表的交集数据

# 内连接select * from student s inner join record r on s.id=r.student_id;

查找结果如下:

# 内连接查找结果

1,张三,18,2021001,语文,1,2021-01-18 15:32:472,李四,23,2021002,数学,2,2021-01-18 15:33:413,王五,30,2021003,英语,3,2021-01-18 15:34:014,马六,35,2021004,理学,4,2021-01-18 15:34:335,孙七,40,2021005,体育,5,2021-01-18 15:34:47

必须重视的是,倘若内连接经过 on 关键字指定要求的话,查找结果和交叉连接查找结果同样,只是执行效率高于交叉连接

3.3 外连接

外连接包括

左外连接

右外连接

其中,

左外连接:运用关键字 left join,以左表为准,返回左表的所有数据,右表满足 on 要求的数据会所有表示,否则用 null 值去填充

右外连接:和左外连接相反。运用关键 right join,以右表为准,返回右表的所有数据,左表满足 on 要求的数据会所有表示,否则用 null 值去填充

首要咱们来看左连接的实例

# 左外连接select * from student s left join record r on

 s.id=r.student_id;

返回结果如下:

# 左外连接结果

1,张三,18,2021001,语文,1,2021-01-18 15:32:472,李四,23,2021002,数学,2,2021-01-18 15:33:413,王五,30,2021003,英语,3,2021-01-18 15:34:014,马六,35,2021004,理学,4,2021-01-18 15:34:335,孙七,40,2021005,体育,5,2021-01-18 15:34:476,朱八,19,NULL,NULL,NULL,NULL7,黄九,53,NULL,NULL,NULL,NULL

而后,我们再来瞧瞧右连接

# 右外连接select * from student s right join record r on

 s.id=r.student_id;

返回结果如下:

# 右外连接结果

1,张三,18,2021001,语文,1,2021-01-18 15:32:472,李四,23,2021002,数学,2,2021-01-18 15:33:413,王五,30,2021003,英语,3,2021-01-18 15:34:014,马六,35,2021004,理学,4,2021-01-18 15:34:335,孙七,40,2021005,体育,5,2021-01-18 15:34:47NULL,NULL,NULL,2021006,化学,8,2021-01-18 15:35:12NULL,NULL,NULL,2021007,生物,9,2021-01-18 15:35:39NULL,NULL,NULL,2021008,音乐,10,2021-01-18 15:36:00

3.4 完全连接

完全连接,是经过关键字 full join连接两张表,返回左表和右表的所有数据,并运用 null 值填充缺失的数据

# 完全连接select * from student s full join record r on

 s.id = r.student_id;

必须重视的是,Mysql 并不支持完全连接,咱们能够运用左连接 + union + 右连接的方式去模拟完全连接

select * from student left join record on

 student.id = record.student_id

unionselect * from student right join record on

 student.id = record.student_id;

查找结果如下:

# 完全连接结果1,张三,18,2021001,语文,1,2021-01-18 15:32:472,李四,23,2021002,数学,2,2021-01-18 15:33:413,王五,30,2021003,英语,3,2021-01-18 15:34:014,马六,35,2021004,理学,4,2021-01-18 15:34:335,孙七,40,2021005,体育,5,2021-01-18 15:34:476,朱八,19,NULL,NULL,NULL,NULL7,黄九,53,NULL,NULL,NULL,NULLNULL,NULL,NULL,2021006,化学,8,2021-01-18 15:35:12NULL,NULL,NULL,2021007,生物,9,2021-01-18 15:35:39NULL,NULL,NULL,2021008,音乐,10,2021-01-18 15:36:00

3.5 交叉连接

交叉连接,又叫作之为笛卡尔积,运用关键字 cross join 连接两张表进行查找

倘若运用 where 加入限制要求,则返回两张表行数的乘积;倘若加入限制要求,则返回满足要求表达式的数据并合成一行

以加入限制要求的交叉连接查找为例

# 交叉连接select * from xag.student as s cross join xag.record as r where

 s.id=r.student_id;

查找结果如下:

# 交叉连接结果

1,张三,18,2021001,语文,1,2021-01-18 15:32:472,李四,23,2021002,数学,2,2021-01-18 15:33:413,王五,30,2021003,英语,3,2021-01-18 15:34:014,马六,35,2021004,理学,4,2021-01-1815:34:335,孙七,40,2021005,体育,5,2021-01-18 15:34:47

必须重视的是,交叉连接查找倘若带有限制要求,它会先生成两张表行数成绩生成查找结果集,而后经过限制要求去过滤;因此呢,在数据量大的时候,查找速度会很慢

4. 最后

相比单表查找,多表查找能够覆盖更加多业务场景,大大提高咱们的工作效率!实质工作其中能够按照必须选取性的去运用





上一篇:SQL多表连接 - 内连接INNER JOIN
下一篇:数据库多表查询的各样连接,你能搞定吗?
回复

使用道具 举报

3043

主题

2万

回帖

9606万

积分

论坛元老

Rank: 8Rank: 8

积分
96065868
发表于 2024-10-1 20:04:15 | 显示全部楼层
谷歌外贸网站优化技术。
回复

使用道具 举报

3119

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99108641
发表于 2024-10-24 10:16:22 | 显示全部楼层
楼主的文章深得我心,表示由衷的感谢!
回复

使用道具 举报

3045

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109052
发表于 2024-11-12 17:43:06 | 显示全部楼层
太棒了、厉害、为你打call、点赞、非常精彩等。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-22 13:36 , Processed in 0.113726 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.