前言
前面我们学习了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。
如需转载,请联系授权,谢谢合作。