小工具知识网

当前位置: 首页 > 行业知识 > 【MySQL】

行业知识

【MySQL】

2026-11-03 13:53:52 来源:互联网转载

���录

()

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

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

()

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

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

内连接原文如下:

【MySQL】_内连接-CSDN博客

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


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

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

基于以下数据库与表:

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)

内连接指令为:

mysql> select name, score from student join score on student.id = score.student_id;

左外连接指令为:

mysql> select name, score from student left join score on student.id = score.student_id;

右外连接指令为:

mysql> select name, score from student left join score on student.id = score.student_id;

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

+------+-------+| name | score |+------+-------+| 张三 |    90 || 李四 |    80 || 王五 |    70 |+------+-------+

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

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

基于以下数据库和表:

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)

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

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)

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

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)

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

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,如:

mysql> select* from student join score on student.id = score.student_id    -> join course on course.id =score.course_id;

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

上一篇:正确解决java.util.concurrent.TimeoutException异常的有效解决方法

下一篇:服务器怎么重设出生点?