高级查询及分页总结

一、子查询

案例:

 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   给值。

原文地址:https://www.cnblogs.com/Smile-123/p/5263563.html