• 初级子查询


    一:简单子查询

    1:例:查询比李斯文大的学生的信息:

    select  *  from  student where  borndate>

    (select brondate from student where studentname='李斯文')

    执行顺序:先执行括号中的子查询,再以子查询返回的结果为条件执行父查询

    注意:当子查询的结果返回单个值的时候可以使用比较运算符(如:=,>,<,>=,<=)

    如果子查询返回多个值(两个以上)怎么办(筛选范围)?

    2:使用 in 关键字

    例:查询Java logic课程至少一次刚好等于60分的学生名单(所见即所得)

    select studentname from Result where studentNo

    (select studentNo from Result where subjectno=

    (select subjectno from subject where subjectname='java logic')

    and studentresult>=60

    )

    in关键字可以是父查询匹配子查询返回多个单列值

    3:not in(不在筛选的范围中)关键字

    例:如何查询没有参加java logic 课程的学生名单

    select student name from student where studentNo not in

    (select studentno from result where subjectno=

    (select subjectno from subject where subjectname='Java Logic')

    )

    4:exists和not exists子查询

    exists关键字能检索数据是否存在

    语法:if exists(子查询)

    语句

    例:检查oop课程的最近一次考试记录,如果有成绩达到80分者则每人加2分,否则,每人加5分.最终成绩不得大于100分

    --检查oop最近一次考试,如果成绩大于80分以上者加2分,
    --否则,加5分,最终成绩不得大于100分
    print '本次参加考试的学生的原始成绩'
    select Examdate ,studentNo,studentResult 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'))
    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+=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
    print '加2分后的成绩'
    select Examdate ,studentNo,studentResult 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'))
    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'))
    print '加5分后的成绩'
    select Examdate ,studentNo,studentResult 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'))
    end

    效果图展示:

    5:相关子查询:

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

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

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

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

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

    例:查询Books表中大于该类图书价格平均值的图书信息

    SElECT 图书名,出版社,类编号,价格
      FROM Books As a
      WHERE 价格 >
      (
        SELECT AVG(价格)
        FROM Books AS b
        WHERE b.类编号=a.类编号
      )
      GO

    解析:外层查询查询的是书的价格(条件是这本书的价格大于这类书的平均价格),内层查询查询的是这类书的平均价格(条件是书是同一类的书),所使用的表也是同一张表,各自取不一样的表别名,比方说这类书的标号是2将a.类编号=2代入 内层查询同步将b.类编号=2(保证了书是同一类的书),执行内层循环查询到这类书的平均价格,同步执行外层查询查询筛选出哪本书的价格大于这类书的平均价格

    6:分页查询:方法有二

    1:双top双order by方法:

    --查询学生表中第3到第5条的学生信息,哈哈
    select top 3 * from Student
    where StudentNo not in
    (select top 2 StudentNo from Student order by StudentNo)
    order by StudentNo

    解析:跳过几条写几条,内层查询查询的是所要跳过的记录,外层查询查询的是所要记录的数目

    2:row_number()over()函数:

    --查询学生表中第3到第5条的学生信息,呵呵
    select * from
    (select *,ROW_NUMBER()over(order by studentNo)as myid from Student) as tmp
    where myid between 3 and 5

    解析:自己创造出一列行数序号值出来,名为myid 为了能让where 条件中的语句识别myid,在from语句中写(关键字执行顺序:1.from2.where3.select)并给表起一个别名,再使用between... and ...进行分页查询

    效果完成图:

  • 相关阅读:
    Android4.0 以后不允许在主线程进行网络连接
    关于升级linux下apache
    事物复制中大项目(Large Article)出问题如何快速修复
    国企银行面试总结
    Git命令详解(一)-个人使用
    函数体的规模要小,尽量控制在 50 行代码之内
    函数的功能要单一,不要设计多用途的函数
    在函数体的“出口处”,对 return 语句的正确性和效率进行检查
    在函数体的“入口处”,对参数的有效性进行检查
    有些场合用“引用传递”替换“值传 递”可以提高效率
  • 原文地址:https://www.cnblogs.com/chimingyang/p/5261529.html
Copyright © 2020-2023  润新知