内容正文:
MySQL数据库应用开发
单元5 记录的查询
任务5.3 MySQL数据查询——多表查询
多表查询
知识点小结
本节实验
任务5.3 MySQL数据查询——多表查询
能力目标
1.掌握多表查询(内连接、外连接)--重点
2.掌握子查询(in、any、all、exists关键字)--难点
思政目标
1.培养精益求精的工作作风;
2.锻炼团结协作的工作能力。
多表查询
什么是连接查询?
连接查询实际上是通过多个表之间的共同列的相关性来查询数据的,是数据库查询最主要的方式。连接查询就是关系运算的连接运算。
连接查询分为内连接查询、外连接查询。主要区别在于,内连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。
内连接查询(常用的)
格式:FROM 表1 [inner] JION 表2 ON 条件表达式
4
内连接查询
例如:
从studentinfo数据库中查询学生的学号、姓名和所学课程的课程号、成绩。
select student.Sno,Sname,Cno,grade from student join sc on student.Sno=sc.Sno;
外连接查询
外连接可以查询两个或两个以上的表,外连接查询和内连接查询非常的相似,也需要通过指定字段进行连接,当该字段取值相等时,可以查询出该表的记录。而且,该字段取值不相等的记录也可以查询出来。
外连接查询分类:
1.左外连接:LEFT [OUTER] JOIN,显示左表的全部记录及右表符合连接条件的记录(以左为主)
2.右外连接:RIGHT [OUTER] JOIN,显示右表的全部记录以及左表符合条件的记录(以右为主)
基本语法如下:
SELECT 字段表 FROM 表1 LEFT | RIGHT [ OUTER ] JOIN 表2 ON 表1.字段=表2.字段
6
左外连接(left join)
左外连接的结果集中包含左表(JOIN关键字左边的表)中所有的记录,然后左表按照连接条件与右表进行连接。如果右表中没有满足连接条件的记录,则结果集中右表中的相应行数据填充为NULL。
例:利用左连接方式 查询课程表和选修表
SELECT course.Cno, course.Cname,sc.Cno,sc.Sno
FROM course left join sc
on course.Cno=sc.Cno;
左外连接(left join)
例:利用左连接方式查询课程表和选修表
右外连接(right join)
右外连接的结果集中包含满足连接条件的所有数据和右表(JOIN关键字右边的表)中不满足条件的数据,左表中的相应行数据为NULL。
例:利用右连接方式查询课程表和选修表
SELECT course.Cno, course.Cname,sc.Cno,sc.Sno
FROM course right join sc
on course.Cno=sc.Cno
limit 10;
右外连接(right join)
例:利用右连接方式查询课程表和选修表
子查询
什么是子查询?
子查询是将一个查询语句嵌套在另一个查询语句中。内层查询语句的查询结果,可以作为外层查询语句提供条件。执行时是从内层查询到外层查询。
引发子查询的情况:
1.使用[NOT]IN的子查询
2.使用比较运算符的子查询,=、>、 <、>=、 <=、 <>、 !=、 <=>;
3.使用[NOT]EXISTS的子查询。
带IN关键字的子查询
一个查询语句的条件可能落在另一个SELECT语句的查询结果中。这可以通过IN关键字来判断。
IN关键字可以判断某个字段的值是否在指定的集合中,如果字段的值在集合中,则满足查询条件,该记录将被查询出来;如果不在集合中,则不满足查询条件。
语法格式: [NOT] IN (元素1,元素2, 元素3, . . . )
其中,NOT是可选参数,加上NOT表示不在集合内满足条件:字符型元素要加上单引号。
带IN关键字的子查询
例:查询选修过课程的student的记录。
SELECT *
FROM student
WHERE sno IN( SELECT sno FROM sc);
带EXISTS关键字的子查询
exists关键字表示存在,使用exists关键字时,内查询语句不返回查询的记录。而是返回一个真假值。
如果内层查询语句查询到满足条件的记录,就会返回一个真值true,否则返回false。
当返回true时,外查询进行查询,否则外查询不进行查询。
带EXISTS关键字的子查询
例:查询选修了110101课程的学生的学号和姓名
select Sno,Sname from student where exists(select * from sc where stude