十二、子查询
子查询就是一个查询中包含某一个查询
select 列名 from 表名 where 条件
12.1 出现在列的位置上
select studentName from student s where s.studentNo=r.studentNo
这类子查询适合放在列的位置上,适合放在条件的位置上,因为查询结果返回的是多行单列的值
select
(select studentName from student s where s.studentNo=r.studentNo) as studentName,
(select subjectName from subject
sub where sub.subjectNo=r.subjectNo) as subjectName
,examDate,studentResult from result r.....
12.2 出现在表的位置上
select s.*,sub.subjectNo,sub.subjectName,sub.classHour,r.examDate,r.studentResult from student s , result r , subject sub where s.studentNo=r.studentNo and sub.subjectNo=r.subjectNo
这种多行多列的子查询适合放在表的位置上,因为查询结果会返回的是多行多列的值
select studentName,subjectName,examDate,studentResult from ( select s.*,sub.subjectNo,sub.subjectName,sub.classHour,r.examDate,r.studentResult from student s , result r , subject sub where s.studentNo=r.studentNo and sub.subjectNo=r.subjectNo) newstu
12.3 出现在条件的位置上
##查询出比熊大的mysql成绩还低的信息
select * from result where studentResult<( select studentResult from result where studentNo = (select studentNo from student where studentName='熊大') and subjectNo=(select subjectNo from subject where subjectName='mysql'))
案例:
##为每个学生制作在校期间各门课程的成绩单,要求每个学生参加每门课程的最后一次考试成绩作为该生本课程的最终成绩,按年级顺序输出各门课程的成绩 #成绩单,学生姓名,课程所属性的年级名称,课程名称,考试日期,考试成绩
select
(select studentName from student s where s.studentNo=newr.studentNo) as 姓名,
(select subjectName from subject sub where sub.subjectNo=newr.subjectNo) as 课程,
(select gradeName from grade g where g.gradeId=newr.subgradeid) as 年级,
newr.examDate as 考试时间,
newr.studentResult as 考试成绩
from
(
select r.*,(select gradeId from subject sub where sub.subjectNo=r.subjectNo) as subgradeid from result r,(select subjectNo, max(examDate) as maxdate from result group by subjectNo) maxr
where
r.subjectNo=maxr.subjectNo and r.examDate= maxr.maxdate) newr order by subgradeid desc
十三、联合查询
一个查询结果中包含有多张表中的字段数据
内连接:
两张表中关联字段相等的数据记录查询出来
语法:from 表1 别名1 inner join 表2 别名2 on 别名1.关联字段=别名2.关联字段 内连接要两边同时都满足时才显示
select
stu.studentName , sub.subjectName,r.examDate,r.studentResult
from
result r
inner join student stu on r.studentNo=stu.studentNo
inner join subject sub on r.subjectNo=sub.subjectNo
另一种写法
select
stu.studentName , sub.subjectName,r.examDate,r.studentResult
from
result r,student stu,subject sub
where
r.studentNo=stu.studentNo and r.subjectNo=sub.subjectNo
左连接:
以左边的表为基准数据全部显示,右边的表中的数据只有满足了on后面的条件的数据才显示
语法: from 表1 别名1 left join 表2 别名2 on 别名1.关联字段=别名2.关联字段
select * from
student stu left join result r
on
stu.studentNo=r.studentNo
左边表中的数据全部显示,右边对应得上的显示,如果左边对应不上右边的数据用null来补充。
右连接:
以右边的表为基准数据全部显示,左边的表中的数据只有满足了on后面的条件的数据才显示
from 表1 别名1 right join 表2 别名2 on 别名1.关联字段=别名2.关联字段
select * from
student stu right join result r
on
stu.studentNo=r.studentNo
完全连接:
左的表的数据全部显示,右边表没有的用null填充,右边表的数据全部显示,左边表没有的用null填充,就是左连接与右连接的结合
from 表1 别名1 left join 表2 别名2 on 别名1.关联字段=别名2.关联字段 union from 表1 别名1 right join 表2 别名2 on 别名1.关联字段=别名2.关联字段
select * from
student stu left join result r
on
stu.studentNo=r.studentNo
union
select * from
student stu right join result r
on
stu.studentNo=r.studentNo