高级查询及分页总结

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

以上是关于高级查询及分页总结的主要内容,如果未能解决你的问题,请参考以下文章

五种函数子查询及分页查询思路

01---SQL数据库学习之创建存储过程及分页查询

linq 大数据 sql 查询及分页优化

查询多表数据同时需要排序及分页

高级查询与分页

thinkphp两表,多表联合查询及分页的连贯操作写法