第17课:强大的连接表

本节要点

关于笛卡尔积
交叉连接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)、查询出每篇文章作者用户编号、用户名、所在省市区。

【版权说明:仅允许非商业转载且请注明出处:Mac私塾 网址:http://macsishu.com】

发表评论

邮箱地址不会被公开。

Captcha Code