时间:2021-07-01 10:21:17 帮助过:3人阅读
内连接 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。说明结果集的数量并不等于左表记录的数量,因为两个表直接不是一对一的关系。其数量应该等于 内连接的结果集数量加上左表中不匹配的记录数量 。
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)
标签: