当前位置:Gxlcms > 数据库问题 > 03--SQLtie三言两语SQLtie链接(join)

03--SQLtie三言两语SQLtie链接(join)

时间:2021-07-01 10:21:17 帮助过:3人阅读

+----+--------+ | id | name | +----+--------+ | 1 | 张三 | | 2 | 李四 | | 3 | 王二 | | 4 | 初一 | | 5 | 初二 | +----+--------+ teacher +----+-----------+ | id | name | +----+-----------+ | 1 | 王老师 | | 2 | 李老师 | | 3 | 张老师 | | 4 | 肖老师 | | 5 | NULL | | 6 | 陈老师 | +----+-----------+ course +----+--------+------+ | id | cname | tid | +----+--------+------+ | 1 | 数学 | 1 | | 2 | 英语 | 2 | | 3 | 语文 | 3 | | 4 | 体育 | 1 | | 5 | 物理 | NULL | +----+--------+------+ student_course +-----+-----+ | sid | cid | +-----+-----+ | 1 | 1 | | 1 | 2 | | 1 | 3 | | 2 | 1 | | 2 | 4 | | 3 | 5 | | 3 | 6 | | 4 | 4 | +-----+-----+

内连接之后的结果集数量是多少?等于左表或者右表中记录的数量吗?

内连接 teacher course 的结果

select * from teacher inner join course on teacher.id = course.tid;
+----+-----------+----+--------+------+
| id | name      | id | cname  | tid  |
+----+-----------+----+--------+------+
|  1 | 王老师    |  1 | 数学   |    1 |
|  2 | 李老师    |  2 | 英语   |    2 |
|  3 | 张老师    |  3 | 语文   |    3 |
|  1 | 王老师    |  4 | 体育   |    1 |
+----+-----------+----+--------+------+

可以发现,王老师同时教数学和体育,因此左表中王老师匹配了右表中两条记录,物理没有老师教,所以没有出现在结果中。说明 内连接的结果集数量等于左右表中匹配记录的数量 。

左连接之后的结果集数量是多少?等于左表的记录数量吗?

左连接 teacher course 的结果

select * from teacher left join course on teacher.id = course.tid;
+----+-----------+------+--------+------+
| id | name      | id   | cname  | tid  |
+----+-----------+------+--------+------+
|  1 | 王老师    |    1 | 数学   |    1 |
|  2 | 李老师    |    2 | 英语   |    2 |
|  3 | 张老师    |    3 | 语文   |    3 |
|  1 | 王老师    |    4 | 体育   |    1 |
|  4 | 肖老师    | NULL | NULL   | NULL |
|  5 | NULL      | NULL | NULL   | NULL |
|  6 | 陈老师    | NULL | NULL   | NULL |
+----+-----------+------+--------+------+

可以看到,没有教授课程的老师也出现在结果中,对应的字段都为NULL。说明结果集的数量并不等于左表记录的数量,因为两个表直接不是一对一的关系。其数量应该等于 内连接的结果集数量加上左表中不匹配的记录数量 。

Mysql 中不支持 full outer join

可以通过 union 操作模拟。

SELECT * FROM teacher
LEFT JOIN course ON teacher.id = course.tid
UNION
SELECT * FROM teacher
RIGHT JOIN course ON teacher.id = course.id;

+------+-----------+------+--------+------+
| id   | name      | id   | cname  | tid  |
+------+-----------+------+--------+------+
|    1 | 王老师    |    1 | 数学   |    1 |
|    2 | 李老师    |    2 | 英语   |    2 |
|    3 | 张老师    |    3 | 语文   |    3 |
|    1 | 王老师    |    4 | 体育   |    1 |
|    4 | 肖老师    | NULL | NULL   | NULL |
|    5 | NULL      | NULL | NULL   | NULL |
|    6 | 陈老师    | NULL | NULL   | NULL |
|    4 | 肖老师    |    4 | 体育   |    1 |
|    5 | NULL      |    5 | 物理   | NULL |
+------+-----------+------+--------+------+
多表连接问题

考虑查出所有学生的课程的记录

select * from student
left join student_course on student.id = student_course.sid
left join course on student_course.cid = course.id;

+----+--------+------+------+------+--------+------+
| id | name   | sid  | cid  | id   | cname  | tid  |
+----+--------+------+------+------+--------+------+
|  1 | 张三   |    1 |    1 |    1 | 数学   |    1 |
|  2 | 李四   |    2 |    1 |    1 | 数学   |    1 |
|  1 | 张三   |    1 |    2 |    2 | 英语   |    2 |
|  1 | 张三   |    1 |    3 |    3 | 语文   |    3 |
|  2 | 李四   |    2 |    4 |    4 | 体育   |    1 |
|  4 | 初一   |    4 |    4 |    4 | 体育   |    1 |
|  3 | 王二   |    3 |    5 |    5 | 物理   | NULL |
|  3 | 王二   |    3 |    6 | NULL | NULL   | NULL |
|  5 | 初二   | NULL | NULL | NULL | NULL   | NULL |
+----+--------+------+------+------+--------+------+

用学生表连接中间表,再连接课程表可以得到结果。连接操作是针对两个表之间的,所以上面的结果是从左到右,两两连接得到的。

如果你有更多关于连接的问题,或者发现文章中的错误,欢迎留言交流

参考资料

《数据库系统概念》

 

 

03--SQLtie三言两语SQLtie链接(join)

标签:

人气教程排行