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

  • 相关阅读:
    SQL删除重复记录
    C#分页插件 Webdiyer
    B/S系统操作日志设计思路
    VS2010自动添加版权信息以及更改默认的jquery库
    Gridview中添加CheckBox全选
    利用log4net记录操作日志
    如何在定义游标的时候使用动态sql语句
    java 获取指定月份第一天和最后一天
    java 判断星期几
    SSH登陆错误"WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! "
  • 原文地址:https://www.cnblogs.com/Smile-123/p/5263563.html
Copyright © 2011-2022 走看看