zoukankan      html  css  js  c++  java
  • 高级查询及分页总结

    一、子查询

    案例:

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

  • 相关阅读:
    Steve Jobs 2005年于 Stanford University 毕业典礼上的演讲
    欧姆龙血糖仪HEA214换购备忘
    (转载)2011年高考作文之《时间在流逝》(安徽考生)
    2012年部分节假日安排(转载)
    乔布斯语录(转载)
    欢乐谷一日游
    上海公交投诉电话:12319
    中国公路“买路钱”应该怎么管?(转载)
    C#操作excel
    SQL Server数据库对列的操作
  • 原文地址:https://www.cnblogs.com/Smile-123/p/5263563.html
Copyright © 2011-2022 走看看