第十二周的笔记

1.带有IN谓词的子查询

 在嵌套查询中,子查询的结果往往是一个集合,所谓谓词IN是嵌套查询中经常使用的谓词。

例子:

(1)在学生成绩视图中,查询16信管的所有课程期末平均分在前30名之后的学生学号、姓名、平均分,结果按成绩降序排列

SELECT

    SS.StudentNo

,SS.StudentName

,CONVERT(DECIMAL(4,1),AVG(SS.FinalScore)) AS AverageFinalScore

FROM

vw_StudentScore AS SS

WHERE

    SS.StudentNo NOT IN

(SELECT TOP 30

SS.StudentNo

FROM

vw_StudentScore AS SS

WHERE

SS.Class='16信管'

GROUP BY

SS.StudentNo

ORDER BY

AVG(SS.FinalScore) DESC)

AND SS.Class='16信管'

GROUP BY

SS.StudentNo

,SS.StudentName

ORDER BY

AverageFinalScore DESC;

表表达式(包括子查询、视图、函数、公用表表达式)中不支持排序;

因为关系模型要求表中的行具有无序性,若指定排序后,返回的并非表,而是1个游标对象(该对象用于有序访问各行);

由于表表达式要求返回1张表,而不能返回游标,故不支持排序.

子查询中的ORDER BY子句仅用于为TOP选项提供排序依据,不能实现子查询的排序;

若需对结果排序,还需在主语句中指定排序.

 

 

(2)在学生成绩视图中,查询《C语言程序设计》成绩比16信管所有学生高的其它班级学生名单

SELECT

    SS.*

FROM

    vw_StudentScore AS SS

WHERE

    SS.Class<>'16信管'

AND SS.CourseName='C语言程序设计'

AND SS.FinalScore>ALL

    (SELECT

       SS.FinalScore

FROM

    vw_StudentScore AS SS

WHERE

    SS.Class='16信管'

AND SS.CourseName='C语言程序设计');

标量与单列表作多值比较

 

 

2.相关子查询:如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询。

例子:

(1)找出每个学生超过他自己选修课程的平均成绩的课程号

SELECT

    Sno,Cno

FROM

    SCx

WHERE

    Grade>=(SELECT AVG(Grade)

FROM  SCy

WHERE y.Sno=x.Sno);

X是表SC的别名,又是称为元组变量,可以用来表示SC的一个元组。内层查询是求一个学生所选修课程平均成绩的,至于是哪个学生的平均成绩要看参数x。Sno的值,而该值是与父查询相关的,因此这类查询称为相关子查询。

3.插入数据

插入元组格式

  INSERT

  INTO<表格>[(<属性列1>[,<属性列2>])...]

  VALUES(<常量1>[<常量2>]....);

4.修改数据

格式

UPDATE <表名>

SET<列名>=<表达式>[<列名>=<表达式>]..

[WHERE<条件>];

 

posted @ 2018-01-13 14:34  黄百万  阅读(162)  评论(0编辑  收藏  举报