数据分析系列 15/32 | MySQL连接查询三板斧

前面我们学习了MySQL的一些查询,但是都是针对一个表进行查询,当我们查询的表大于1个,则称为连接查询。连接查询是关系数据库中重要的查询方式,包括交叉连接、内连接、和外连接。

 

PART01

  交叉连接

交叉连接(CROSS JOIN)又称笛卡尔积,即把一张表的每一行与另一张表的每一行连接起来,返回两张表的每一行相连接后所有可能的搭配结果,其连接的结果会产生一些没有意义的记录,所以这种查询实际很少使用。

 

交叉连接SQL语法:

SELECT * FROM 表1 CROSS JOIN 表2;SELECT * FROM 表1 , 表2;#查询学生表与成绩表的交叉连接SELECT * FROM tb_student CROSS JOINtb_score;SELECT * FROM tb_student, tb_score;

说明:交叉连接返回的查询结果集的记录行数等于其所连接的两张表记录行数的乘积,例如tb_student表有10条记录,tb_score有10条记录,这两张表交叉连接后结果集的记录行数是10*10=100条。因此,对于存在大量数据的表,应该避免使用交叉连接。

PART02

  内连接

内连接(INNER JOIN)通过在查询中设置连接条件来移除交叉连接查询结果集中某些数据行。即在内连接查询中,只有满足条件的记录才能出现在结果集中。

内连接的SQL语法形式有两种:

#1)使用INNER JOIN的显式语法结构SELECT 目标列1, 目标列2, ..., 目标列nFROM table1 [INNER] JOIN table2ON 连接条件[WHERE 过滤条件];#2)使用WHERE子句定义连接条件的隐式语法结构:SELECT 目标列1, 目标列2, ..., 目标列nFROM table1, table2WHERE 连接条件 [AND 过滤条件];

上面两种表示形式的差别在于:使用INNER JOIN 连接后,FROM子句中的ON子句可用来设置连接表的连接条件,而其他过滤条件则可以在SELECT语句中的WHERE子句中指定,而使用WHERE子句定义连接条件的形式,表与表之间的连接条件和查询时的过滤条件均在WHERE子句中指定。

 

1、等值与非等值连接

连接查询中用来连接两个表的条件称为连接条件,一般形式为:

[<表1>.]<字段名>  <比较运算符>  [<表2>.]<字段名>

 

比较运算符主要有:=、>、<、>=、<=、!=(<>),“=”表示等值连接,其他都是非等值连接。

#查询每个学生选修课程的情况。SELECT tb_student.*, tb_score.* FROM tb_student,tb_score WEHRE tb_student.studentNo = tb_score.studentNo;SELECT tb_student.*, tb_score.* FROM tb_studentINNER JOIN tb_score ON tb_student.studentNo = tb_score.studentNo;#查询管理学院全体同学的学号、姓名、籍贯、班级编号和所在班级名称。SELECT studentNo, studentName, native,tb_student.classNo, className FROM tb_student, tb_classWEHRE tb_student.classNo = tb_class.classNoAND department=’管理学院’;SELECT studentNo, studentName, native, tb_student.classNo,className FROM tb_student JOIN tb_class ON tb_student.classNo= tb_class.classNoWHERE department=’管理学院’;

PS.由于内连接系统默认的表连接,因而在FROM子句中可以省略关键字INNER,而只用关键字JOIN连接表。

#查询选修了课程名称为“程序设计”的学生学号、姓名、和成绩。SELECT a.studentNo, studentName, score FROM tb_student AS a, tb_course AS b,tb_score cWEHRE a. studentNo = c. studentNo ANDb.courseNo = c.courseNoAND courseName=’程序设计’;SELECT a.studentNo, studentName, scoreFROM tb_student AS a JOIN tb_course b JOINtb_score cON a. studentNo = c. studentNo ANDb.courseNo = c.courseNoWHERE courseName=’程序设计’;

PS.可以看到,使用INNER JOIN实现多个表的内连接时,需要在FROM子句的多个表之间连续使用INNER JOIN或JOIN。

同时上面我们使用了表的别名,具体内容见这篇文章。SQL查询中需要使用别名问题

 

2、自连接

某个表与自身进行连接,称为自表连接或自身连接,简称自连接。使用自连接时,需要为表指定多个不同的别名,且对所有查询字段的引用均必须使用表别名限定,否则SELECT操作会失败。

#查询与“数据库”这门课学分相同的课程信息SELECT c1.*FROM tb_course c1, tb_course c2WHERE c1.credit = c2.credit ANDc2.courseName = ‘数据库’;或者SELECT c1.*FROM tb_course c1 JOIN tb_course c2ON c1.credit = c2.creditWHERE c2.courseName = ‘数据库’;

3、自然连接

自然连接(NATURAL JOIN)只有当连接字段在两张表中的字段名都相同是才可以使用,否则返回的是笛卡尔积的结果集,自然连接在FROM子句中使用关键字NATURAL JOIN。使用NATURAL JOIN进行自然连接时,不需要指定连接条件,系统自动两张表中相同的字段名来连接。

#用自然连接查询每个学生及其选修课程的情况,要求显示学生学号、姓名、选修的课程号和成绩SELECT a.studentNo, studentName, courseNo, scoreFROM tb_student a NATURAL JOIN tb_score b;

PART03

 外连接

外连接

外连接首先将连接的两张表分为基表和参考表,然后再以基表为依据返回满足和不满足连接条件的记录,就好像是在参考表中增加了一条全部由空值组成的“万能行”,它可以和基表中所有不满足连接条件的记录进行连接。

外连接根据连接表的顺序,可分为左外连接和右外连接两种。

 

1、左外连接

左外连接,也称左连接(LEFT OUTER JOIN 或 LEFT JOIN),用于返回该关键字左边表(基表)的所有记录,并用这些记录与该关键字右边表(参考表)中的记录进行匹配,如果左表的某些记录在右表中没有匹配的记录,就和右表中的“万能行”连接,即右表对应的字段值均被设置为空值NULL。

#使用左连接查询所有学生及其选修课程的情况,包括没有选修课程的学生,要求显示学号、姓名、性别、班号、选修的课程号和成绩。SELECT a.studentNo, studentName, sex,classNo, courseNo, scoreFROM tb_student a LEFT OUTER JOIN tb_scorebON a. studentNo = b. studentNo;

2、右外连接

右外连接,也称右连接(RIGHT OUTER JOIN 或 RIGHT JOIN),以右表为基表,连接方法与左外连接完全一样。即返回右表的所有记录,用这些记录与该关键字左边表(参考表)中的记录进行匹配,如果右表的某些记录在左表中没有匹配的记录,就和左表中的“万能行”连接,即左表对应的字段值均被设置为空值NULL。

 

#使用右连接查询所有学生及其选修课程的情况,包括没有选修课程的学生,要求显示学号、姓名、性别、班号、选修的课程号和成绩。SELECT courseNo, score, b.studentNo,studentName, sex, classNo,FROM tb_score a RIGHT OUTER JOIN tb_studentbON a. studentNo = b. studentNo

比较上面的两个连接,可以发现,都是以tb_student为基表,所以它们的查询结果相同。外连接可以在两个连接表没有任何匹配记录的情况下仍返回记录。

 

欢迎关注微信公众号,访问更多精彩:数据之魅

如需转载,请联系授权,谢谢合作。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章