本节要点
关于笛卡尔积
交叉连接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语言中最重要,也是最难理解的部分,需要多多练习才能掌握。大家可以学习下我的视频课程,里面有非常详细的示例讲解。
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。