初级子查询
Posted 程序不是生活的全部,但生活中一定要有程序
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初级子查询相关的知识,希望对你有一定的参考价值。
一:简单子查询
1:例:查询比李斯文大的学生的信息:
select * from student where borndate>
(select brondate from student where studentname=‘李斯文‘)
执行顺序:先执行括号中的子查询,再以子查询返回的结果为条件执行父查询
注意:当子查询的结果返回单个值的时候可以使用比较运算符(如:=,>,<,>=,<=)
如果子查询返回多个值(两个以上)怎么办(筛选范围)?
2:使用 in 关键字
例:查询Java logic课程至少一次刚好等于60分的学生名单(所见即所得)
select studentname from Result where studentNo
(select studentNo from Result where subjectno=
(select subjectno from subject where subjectname=‘java logic‘)
and studentresult>=60
)
in关键字可以是父查询匹配子查询返回多个单列值
3:not in(不在筛选的范围中)关键字
例:如何查询没有参加java logic 课程的学生名单
select student name from student where studentNo not in
(select studentno from result where subjectno=
(select subjectno from subject where subjectname=‘Java Logic‘)
)
4:exists和not exists子查询
exists关键字能检索数据是否存在
语法:if exists(子查询)
语句
例:检查oop课程的最近一次考试记录,如果有成绩达到80分者则每人加2分,否则,每人加5分.最终成绩不得大于100分
--检查oop最近一次考试,如果成绩大于80分以上者加2分,
--否则,加5分,最终成绩不得大于100分
print ‘本次参加考试的学生的原始成绩‘
select Examdate ,studentNo,studentResult from Result
where SubjectId=(select SubjectId from Subject where SubjectName=‘oop‘)
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName=‘oop‘))
if exists(
select * from Result where SubjectId=
(select SubjectId from Subject where SubjectName=‘oop‘)
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName=‘oop‘))
and StudentResult>80
)
begin
update Result set StudentResult+=2 where SubjectId=
(select SubjectId from Subject where SubjectName=‘oop‘)
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName=‘oop‘))
and StudentResult<=98
print ‘加2分后的成绩‘
select Examdate ,studentNo,studentResult from Result
where SubjectId=(select SubjectId from Subject where SubjectName=‘oop‘)
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName=‘oop‘))
end
else
begin
update Result set StudentResult+=5 where SubjectId=
(select SubjectId from Subject where SubjectName=‘oop‘)
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName=‘oop‘))
print ‘加5分后的成绩‘
select Examdate ,studentNo,studentResult from Result
where SubjectId=(select SubjectId from Subject where SubjectName=‘oop‘)
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName=‘oop‘))
end
效果图展示:
5:相关子查询:
相关子查询的执行依赖于外部查询。多数情况下是子查询的WHERE子句中引用了外部查询的表。执行过程:
(1)从外层查询中取出一个元组,将元组相关列的值传给内层查询。
(2)执行内层查询,得到子查询操作的值。
(3)外查询根据子查询返回的结果或结果集得到满足条件的行。
(4)然后外层查询取出下一个元组重复做步骤1-3,直到外层的元组全部处理完毕。
例:查询Books表中大于该类图书价格平均值的图书信息
SElECT 图书名,出版社,类编号,价格
FROM Books As a
WHERE 价格 >
(
SELECT AVG(价格)
FROM Books AS b
WHERE b.类编号=a.类编号
)
GO
解析:外层查询查询的是书的价格(条件是这本书的价格大于这类书的平均价格),内层查询查询的是这类书的平均价格(条件是书是同一类的书),所使用的表也是同一张表,各自取不一样的表别名,比方说这类书的标号是2将a.类编号=2代入 内层查询同步将b.类编号=2(保证了书是同一类的书),执行内层循环查询到这类书的平均价格,同步执行外层查询查询筛选出哪本书的价格大于这类书的平均价格
6:分页查询:方法有二
1:双top双order by方法:
--查询学生表中第3到第5条的学生信息,哈哈
select top 3 * from Student
where StudentNo not in
(select top 2 StudentNo from Student order by StudentNo)
order by StudentNo
解析:跳过几条写几条,内层查询查询的是所要跳过的记录,外层查询查询的是所要记录的数目
2:row_number()over()函数:
--查询学生表中第3到第5条的学生信息,呵呵
select * from
(select *,ROW_NUMBER()over(order by studentNo)as myid from Student) as tmp
where myid between 3 and 5
解析:自己创造出一列行数序号值出来,名为myid 为了能让where 条件中的语句识别myid,在from语句中写(关键字执行顺序:1.from2.where3.select)并给表起一个别名,再使用between... and ...进行分页查询
效果完成图:
以上是关于初级子查询的主要内容,如果未能解决你的问题,请参考以下文章