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<条件>];