zoukankan      html  css  js  c++  java
  • 黑发不知勤学早,白首方悔读书迟———颜真卿

                                                                                         高级查询

    01.简单子查询

    子查询优势  1不用变量。2所想即所得。

    案例1查询学生表中比"美洋洋"小的学员信息(姓名,地址)

    案例2查询“oop”课程至少一次考试刚好等于60分的学生(姓名,成绩)

    --用子查询如何实现???

    --用到什么条件,交给子查询解决

    select studentname,studentresult

    from Student,Result

    where Student.StudentNo=Result.StudentNo

    and SubjectId=(select SubjectId from Subject where SubjectName='oop')

    and StudentResult=60

    --只检索学生姓名

    select studentname 

    from Student

    where StudentNo in

    (select StudentNo 

      from Result

       where StudentResult=60 and SubjectId=

        (select SubjectId 

         from Subject 

         where SubjectName='oop'

        )

    )

    子查询 小结

    简单子查询(嵌套子查询)执行机制:

    子查询的结果作为外层父查询的一个条件。

    也就意味着先执行子查询,再执行父查询

    子查询:子查询语句必须用小括号括起来,

    然后通过比较运算符:><,=等连接起来

     注意点:.子查询必须用小阔号括起来

    子查询先执行出一个结果,然后将该结果作为父查询

     的一个条件而存在。

    in/not in 子查询   

    案例:查询最近一次未参加oop考试的学生名单

    select studentname

    from student

    where studentno not 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'

          )

       )

    )

    and gradeid=  

      select gradeid from grade 

      where gradename='S1'

    )

    在这里注意  =  in   的用法

    当返回的数据不是一行,而是多行的时候  使用 in    反之  则使用= 。

                       ExistsNot  Exists子查询

                        案例检查“oop”课程最近一次考试。

    select * from result

    order by subjectid ,examdate

    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

       update result set studentresult=100

       where studentresult>98

       and subjectid=

       (

          select subjectid from subject 

          where subjectname='oop'

       )

       and examdate=

       (

         select max(examdate) from result

         where subjectid=

         (

      select subjectid from subject 

      where subjectname='oop'

         )

       )

       update result set studentresult+=2

       where studentresult<=98

       and subjectid=

       (

          select subjectid from subject 

          where subjectname='oop'

       )

       and examdate=

       (

         select max(examdate) from result

         where subjectid=

         (

      select subjectid from subject 

      where subjectname='oop'

         )

       )

      

    end

    else 

    begin

       update result set studentresult+=5

       where studentresult<=95

       and subjectid=

       (

          select subjectid from subject 

          where subjectname='oop'

       )

       and examdate=

       (

         select max(examdate) from result

         where subjectid=

         (

      select subjectid from subject 

      where subjectname='oop'

         )

       )

       update result set studentresult=100

       where studentresult>95

       and subjectid=

       (

          select subjectid from subject 

          where subjectname='oop'

       )

       and examdate=

       (

         select max(examdate) from result

         where subjectid=

         (

      select subjectid from subject 

      where subjectname='oop'

         )

       )

    end

        select studentno,studentname from student

        union

        select gradeid,gradename from grade

    --product  (id,proname,category)

    select distinct(gradename) from grade

     --重要:if exists(子查询子查询返回的必须是一个结果集,而不是一个bool值。

     --结果集(用一个表结构将数据呈现出来,如果没有结果,返回的是一个空表)

     --子查询的列可以跟单个列名,也可以跟星号,但是不能跟聚合函数,因为聚合函数

     --返回的值永远是真,因为聚合函数也是结果集的一种,不能作为Exists判定的依据。

    相关子查询的执行依赖于外部查询。多数情况下是子查询的WHERE子句中引用了外部查询的表。执行过程:

    1)从外层查询中取出一个元组,将元组相关列的值传给内层查询。

    2)执行内层查询,得到子查询操作的值。

    3)外查询根据子查询返回的结果或结果集得到满足条件的行。

    4)然后外层查询取出下一个元组重复做步骤1-3,直到外层的元组全部处理完毕。 

                                                           分页

    分页目的:为了加快网站对数据的查询(检索)速度,我们引入了分页的概念。

              方式一:核心思想:跳过几条取几条(双top order by 方式)

       --分页查询
        --双top双order by 例(跳五行查两行)
        select top 2* from Student
        where StudentNo not in
        (select top 5 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。

     

      

     

  • 相关阅读:
    Python 操作 MySQL数据库提示pymysql.err.InternalError: (1054, "Unknown column 'XXXXXXXXX' in 'where clause'")解决方法
    MySQL连接池不能查到刚写入的数据——连接池配置问题
    python 将字典转为bytes类型字典
    关于状态机的问题思考——什么时候达到新的状态?什么时候清除老状态?新状态与老状态之间的关系
    mysql 8.0.19 安装 及 端口修改
    sprintf printf 输出数据固定格式——数字前补零
    思维大爆炸
    IO点作为状态判断——一定要做软件“消抖”
    React-umi-request动态刷新Token功能实现及node.js 代码逻辑
    js测试题
  • 原文地址:https://www.cnblogs.com/zhangzhenzhen/p/5261906.html
Copyright © 2011-2022 走看看