高级查询及分页总结
Posted Onlyだ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级查询及分页总结相关的知识,希望对你有一定的参考价值。
一、子查询
案例:
select * from Student
where Birthday>(
select Birthday from Student Where StudentName=‘张玲‘
)
提示:将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个。
二、IN和NOT IN子查询
1.IN
用IN条件:在不确保返回值的是一条的情况用IN。
select studentname,studentno
from student
where studentno in
(
select studentno from result
where subjectid in(
select subjectid from subject
where subjectname=‘oop‘
)and examdate=(
select max(examdate) from result
where subjectid in (
select subjectid from subject
where subjectname=‘oop‘
)
)
)
2. not in(不等于)
我想大家应该都知道了用NOT IN 是为了查询不等于 什么什么
案例:
select StudentName from Student
where StudentNo not in (
select StudentNo from Student Where StudentName=‘张玲‘
)
三、EXISTS和NOT EXIXTS子查询
1.EXISTS查询
EXISTS关键字能够检测数据是否存在。
如果子查询的结果非空,则EXISTS(子查询)将返回真(true),否则返回假(false)。
查询条件:查询科目为“oop”的最近一次考试成绩大于80的就加2分,否则小于80分的就加5分
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
--大于等于98就直接等于100分
update Result set StudentResult=100
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
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
select *from Result where SubjectId=(
select SubjectId from Subject where SubjectName=‘oop‘
)and StudentResult>80
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‘ )
)and StudentResult<80
select *from Result where SubjectId=(
select SubjectId from Subject where SubjectName=‘oop‘
)and StudentResult<80
end
2.not exists
EXISTS和IN一样,同样允许添加NOT关键字实现取反操作,NOT EXISTS表示不存在。
四、相关子查询
查询条件: 查询Booka表中大于该类图书价格平均值的图书信息
FROM Books As a
WHERE 价格 >
(
SELECT AVG(价格)
FROM Books AS b
WHERE b.类编号=a.类编号
)
该查询执行过程:
先将Books表中的第一条记录的“类编号”的值“2”代入子查询中,子查询变为:
SELECT AVG(价格)
FROM Books AS b
WHERE b.类编号=2
子查询的结果为该类图书的平均价格,所以外部查询变为:
SElECT 图书名,出版社,类编号,价格
FROM Books As a
WHERE 价格 > 34
如果WHERE条件为True,则第一条结果包括在结果集中,则否不包括。对Books表中
的所有行运行相同的过程,最后形成的结果集及最后返回结果。
五、分页
方式一:跳过几条取几条(双top 双order by 方式)
select Top 3 * from Student
where StudentNo not in
(
select top 3 StudentNo from Student
order by StudentNo
)
order by StudentNo
注意点:子查询的排序方式,必须和父查询排序的方式一致
方式二:局限性(SQL Server2005之后的版本支持该写法,因为我们要用
到row_number() over()函数,在之前是没有该函数)
select * from
(
select *,ROW_NUMBER() over(order by StudentNo) as myid from Student
) as temp
where myid between 4 and 6
-原理:在原表的基础上加多了一列ID,ID列从1开始给值,我们就可以使用 Between and 给值。
以上是关于高级查询及分页总结的主要内容,如果未能解决你的问题,请参考以下文章