【进阶】MySQL中的连接查询

浏览: 1461

前言

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

交叉连接

交叉连接(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条。因此,对于存在大量数据的表,应该避免使用交叉连接。


内连接

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

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

#1)使用INNER JOIN的显式语法结构

SELECT 目标列1, 目标列2, ..., 目标列n

FROM table1 [INNER] JOIN table2

ON 连接条件

[WHERE 过滤条件];

#2)使用WHERE子句定义连接条件的隐式语法结构:

SELECT 目标列1, 目标列2, ..., 目标列n

FROM table1, table2

WHERE 连接条件 [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_class

WEHRE 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.classNo

WHERE department=’管理学院’;

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

#查询选修了课程名称为“程序设计”的学生学号、姓名、和成绩。

SELECT a.studentNo, studentName, score 

FROM tb_student AS a, tb_course AS b,tb_score c

WEHRE a. studentNo = c. studentNo ANDb.courseNo = c.courseNo

AND courseName=’程序设计’;

SELECT a.studentNo, studentName, score

FROM tb_student AS a JOIN tb_course b JOINtb_score c

ON a. studentNo = c. studentNo ANDb.courseNo = c.courseNo

WHERE courseName=’程序设计’;

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

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


2、自连接

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

#查询与“数据库”这门课学分相同的课程信息

SELECT c1.*

FROM tb_course c1, tb_course c2

WHERE c1.credit = c2.credit ANDc2.courseName = ‘数据库’;

或者

SELECT c1.*

FROM tb_course c1 JOIN tb_course c2

ON c1.credit = c2.credit

WHERE c2.courseName = ‘数据库’;

3、自然连接

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

#用自然连接查询每个学生及其选修课程的情况,要求显示学生学号、姓名、选修的课程号和成绩

SELECT a.studentNo, studentName, courseNo, score

FROM tb_student a NATURAL JOIN tb_score b;


外连接

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

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

1、左外连接

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

#使用左连接查询所有学生及其选修课程的情况,包括没有选修课程的学生,要求显示学号、姓名、性别、班号、选修的课程号和成绩。

SELECT a.studentNo, studentName, sex,classNo, courseNo, score

FROM tb_student a LEFT OUTER JOIN tb_scoreb

ON 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_studentb

ON a. studentNo = b. studentNo;

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


小结

上面就是今天的主题内容了,今天简单分享下MySQL中的连接查询,这对获取目标很有帮助,在工作中,我们常用的就是两个外连接,希望同学们仔细看一下。希望通过上面的操作能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。

如果想快速联系我,欢迎关注微信公众号:AiryData。

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

原文链接:【进阶】MySQL中的数据更新

推荐 0
本文由 Airy 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册