本节要点
关于笛卡尔积
交叉连接CROSS JOIN
内连接INNER JOIN
全外连接FULL OUTER JOIN
左外连接LEFT OUTER JOIN
右外连接RIGHT OUTER JOIN
关于笛卡尔积
在数学中,笛卡尔积指的是两个集合的乘积。
比如说,下图左上是一个学生表,有3条记录,左下是一个老师表,有4条记录。
那么这两个集合的笛卡尔积,就是集合中的记录两两组合。学过排列组合的同学应该都知道,组合后的记录条数为3*4=12条。
交叉连接CROSS JOIN
在SQL语言中,使用CROSS JOIN实现两个集合的笛卡尔积。
SELECT * FROM student;--返回3条记录 SELECT * FROM teacher;--返回4条记录 SELECT * FROM student CROSS JOIN teacher;--返回12=3*4条记录
内连接INNER JOIN
先来看一个之前的查询:
(1)、如何同时查询出学生编号、学生姓名、老师编号、老师姓名?
在前面的课程中,我们使用子查询实现了这个查询需求:
SELECT student_id, student_name, teacher_id, ( SELECT teacher_name FROM teacher WHERE teacher.teacher_id = student.teacher_id ) FROM student;
其实,我们从这个SQL的查询结果可以看出来,它其实就是student表和teacher表的笛卡尔积的一个子集。
子集满足的条件就是:student.teacher_id = teacher.teacher_id。
那么,我们是不是可以从笛卡尔积的结果中,取出满足我们需要的这个子集呢?
其实是可以的,在SQL语言中,使用INNER JOIN(内连接)并配合子集的条件,就能查询出我们需要的数据:
select * from student a INNER JOIN teacher b ON a.teacher_id = b.teacher_id;
这里的INNER JOIN,代表这是一个内连接,ON后面跟的是从笛卡尔积中取数的条件。
内连接的意思是,只从笛卡尔积中取出满足条件的记录,其他所有不满足条件的记录都不要。
内连接还有一种简单的写法:
select * from student a , teacher b WHERE a.teacher_id = b.teacher_id;
上面这个SQL,与前面使用INNER JOIN的写法是等价的。但一般来说,我们建议使用明确写出INNER JOIN的写法,因为看起来更清晰。
全外连接FULL OUTER JOIN
除了满足条件的记录外,有时我们还想返回参与连接的两张表中不满足连接条件的数据。
如果同时返回参与连接的两张表中不满足连接条件的数据,那么就可以使用全外连接。
select * from student a FULL OUTER JOIN teacher b ON a.teacher_id = b.teacher_id;
对于返回的结果集中,左表不满足连接条件的记录,相对应的右表的数据全部为NULL;而右表不满足连接条件的记录,相对应的左表的数据全部为NULL;
左外连接LEFT OUTER JOIN
如果我们只想返回参与连接的两张表中,左表不满足连接条件的数据,而右表不满足条件的数据不需要,那么就可以使用左外连接。
select * from student a LEFT OUTER JOIN teacher b ON a.teacher_id = b.teacher_id;
右外连接RIGHT OUTER JOIN
如果我们只想返回参与连接的两张表中,右表不满足连接条件的数据,而左表不满足条件的数据不需要,那么就可以使用右外连接。
select * from student a RIGHT OUTER JOIN teacher b ON a.teacher_id = b.teacher_id;
关于表与表之间的连接,是SQL语言中最重要,也是最难理解的部分,需要多多练习才能掌握。大家可以学习下我的视频课程,里面有非常详细的示例讲解。
课后习题:
1、对于第6课课后习题中的论坛注册用户表、第15课课后习题中的文章表、用户访问的文章记录表,请编写SQL完成以下查询。
(1)、查询今天的访问记录,同时查询出文章标题、文章作者用户编号。
(2)、查询出每篇文章作者用户编号、用户名、所在省市区。