目录
[3.1 情况一:两个表数据一一对应](#3.1 情况一:两个表数据一一对应)
[3.2 情况二:两个表数据并非一一对应](#3.2 情况二:两个表数据并非一一对应)
本专栏关于联合查询已建立相应库与表,原文链接如下:
内连接原文如下:
基于以上内容,本篇介绍外连接;
内连接与外连接都是进行笛卡尔积计算,但是细节之处仍有差别:
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 语句都只计算两个表的笛卡尔积;