【MySQL】_外连接

目录

[3.1 情况一:两个表数据一一对应](#3.1 情况一:两个表数据一一对应)

[3.2 情况二:两个表数据并非一一对应](#3.2 情况二:两个表数据并非一一对应)


本专栏关于联合查询已建立相应库与表,原文链接如下:

【MySQL】_联合查询基础表-CSDN博客

内连接原文如下:

【MySQL】_内连接-CSDN博客

基于以上内容,本篇介绍外连接;


内连接与外连接都是进行笛卡尔积计算,但是细节之处仍有差别:

3.1 情况一:两个表数据一一对应

基于以下数据库与表:

sql 复制代码
mysql> select* from student;
+------+------+
| id   | name |
+------+------+
|    1 | 张三 |
|    2 | 李四 |
|    3 | 王五 |
+------+------+
3 rows in set (0.00 sec)

mysql> select* from score;
+------------+-------+
| student_id | score |
+------------+-------+
|          1 |    90 |
|          2 |    80 |
|          3 |    70 |
+------------+-------+
3 rows in set (0.00 sec)

内连接指令为:

sql 复制代码
mysql> select name, score from student join score on student.id = score.student_id;

左外连接指令为:

sql 复制代码
mysql> select name, score from student left join score on student.id = score.student_id;

右外连接指令为:

sql 复制代码
mysql> select name, score from student left join score on student.id = score.student_id;

以上三条指令的查询结果均为:

sql 复制代码
+------+-------+
| name | score |
+------+-------+
| 张三 |    90 |
| 李四 |    80 |
| 王五 |    70 |
+------+-------+

即:当两个表的数据一一对应(即两个表的记录在彼此表中都有体现)时,内连接与外连接的查询结果是相同的;

3.2 情况二:两个表数据并非一一对应

基于以下数据库和表:

sql 复制代码
mysql> select* from student;
+------+------+
| id   | name |
+------+------+
|    1 | 张三 |
|    2 | 李四 |
|    3 | 王五 |
+------+------+
3 rows in set (0.00 sec)

mysql> select* from score;
+------------+-------+
| student_id | score |
+------------+-------+
|          1 |    90 |
|          2 |    80 |
|          4 |    70 |
+------------+-------+
3 rows in set (0.00 sec)

内连接指令与查询结果为:

sql 复制代码
mysql> select name, score from student join score on student.id = score.student_id;
+------+-------+
| name | score |
+------+-------+
| 张三 |    90 |
| 李四 |    80 |
+------+-------+
2 rows in set (0.00 sec)

左外连接指令与查询结果为:

sql 复制代码
mysql> select name, score from student left join score on student.id = score.student_id;
+------+-------+
| name | score |
+------+-------+
| 张三 |    90 |
| 李四 |    80 |
| 王五 |  NULL |
+------+-------+
3 rows in set (0.00 sec)

右外连接指令与查询结果为:

sql 复制代码
mysql> select name, score from student right join score on student.id = score.student_id;
+------+-------+
| name | score |
+------+-------+
| 张三 |    90 |
| 李四 |    80 |
| NULL |    70 |
+------+-------+
3 rows in set (0.00 sec)

即:当两个表的数据并非一一对应时,内连接只显示两个表中都有体现的数据;

注:(1)当两个表数据并非一一对应,进行外连接时,左外连接是以左表为准,右表没有对应的数据,则以空值填充;

右外连接是以右表为准,左表没有对应数据,以空值填充;

(2)join on针对多个表进行的语句为:

select* form 表1 join 表2 on 条件1 join 表4 on 条件2,如:

sql 复制代码
mysql> select* from student join score on student.id = score.student_id
    -> join course on course.id =score.course_id;

但是每次join on 语句都只计算两个表的笛卡尔积;

相关推荐
墨天梦7 分钟前
D26_数据库迁移与可复现构建
数据库·oracle
mmsx17 分钟前
Android 地图上绘制 KML:解析、样式与渲染
android·xml
运行时异常28 分钟前
【无标题】
android
猫咪很可爱31 分钟前
Oracle归档自动删除任务失败
数据库·oracle
cccccc语言我来了33 分钟前
Linux (11) 进程控制
linux·运维·数据库
猫咪很可爱39 分钟前
MySQL 定时 DDL 导致 mysqldump 备份失败:场景模拟、排查与优化建议
mysql
杨运交43 分钟前
[079][消息模块]基于 Redis Stream 的高可靠消息队列实现——Spring Data Redis 实战解析
数据库·redis·spring
右手吉他1 小时前
高通平台IA APN问题分析之一
android·物联网
Leo.yuan1 小时前
2026穿透式监管系统选型避坑:数据接不进、风险穿不透、系统难联动,哪些平台能解决?
大数据·数据库
数据库小学妹1 小时前
MySQL内存占用过高怎么排查?分层定位与OOM根因
数据库·经验分享·mysql·内存·oom