本节要点

关于笛卡尔积
交叉连接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语言中最重要,也是最难理解的部分,需要多多练习才能掌握。大家可以学习下我的视频课程,里面有非常详细的示例讲解。

picture loss