(SELECT Cno /*① 首先在Courses关系中 */ FROM /*找出“数据结构”的课程号,*/
WHERE Cname = ‘数据结构’)); /*结果为C02号 */
说明:本查询同样可以用连接查询实现: SELECT S.Sno, Sname
FROM Students S, Reports R, Courses C
WHERE S.Sno=R.Sno AND R.Cno=C.Cno AND C.Cname='数据结构';
2 带有比较运算符的嵌套查询
例3.44 将例3.42改为带有比较运算符的嵌套查询。由于一个学生只可能在一个系学习,因此子查询的结果是一个值,因此可以用=代替IN,其SQL语句如下: SELECT Sno , Sname, Sdept FROM Students WHERE Sdept =
(SELECT Sdept FROM Students WHERE Sname=’李伟’);
26
Courses
3 带谓词ANY或ALL的嵌套查询
例3.45 查询非自动化系的不超过自动化系所有学生的年龄的学生姓名(Sname)和年龄(Sage)。其查询命令为 SELECT Sname, Sage FROM Students WHERE Sdept<>'自动化'
AND Sage<=ALL (SELECT Sage
FROM Students
WHERE Sdept= '自动化');
说明:本查询也可以用集函数来实现。其SQL语句如下: SELECT Sname, Sage FROM Students WHERE Sdept<>'自动化'
AND Sage<= (SELECT MIN(Sage)
FROM Students
WHERE Sdept='自动化'); 4 带谓词EXISTS的嵌套查询
例3.46 查询所有选修了编号为“C01”课程的学生姓名(Sname)和所在系(Sdept)。 本查询的SQL语句是: SELECT Sname, Sdept
27
FROM Students WHERE EXISTS (SELECT * FROM Reports WHERE Cno='C01');
例3.47 将例3.42改为带谓词EXISTS的查询,其SQL语句如下
SELECT Sno, Sname, Sdept FROM Students A WHERE EXISTS (SELECT * FROM Students B
WHERE B.Sdept=A.Sdept AND B.Sname=’李伟’);
例3.48 查询选修了所有课程的学生姓名(Sname)和所在系。
由于没有全称量词,可将题目的意思转换成等价的用存在量词的形式:查询这样的学生,没有一门课程是他不选修的。其SQL语句为: SELECT Sname, Sdept FROM Students
28
Sno=Students.Sno AND
WHERE NOT EXISTS (SELECT * FROM Courses WHERE NOT EXISTS
(SELECT * FROM Reports WHERE Sno=Students.Sno
AND Cno=Courses.Cno)); 三、集合查询
例3.49 查询计算机科学系的学生或年龄不大于20岁的学生信息。 SELECT * FROM Students WHERE Sdept='计算机' UNION SELECT * FROM Students WHERE Sage<=20;
例3.50 查询数学系的学生且年龄不大于20岁的学生的交集,这实际上就是查询数学系中年龄不大于20岁的学生。 SELECT * FROM Students
WHERE Sdept='数学' AND Sage<=20;
29
例3.51 查询数学系的学生与年龄不大于20岁的学生的差集。
本查询的等价说法是,查询数学系中年龄大于20岁的学生。
SELECT * FROM Students
WHERE Sdept='计算机' AND Sage>20;
实 验5
实验项目名称 SQL的数据更新(2课时,验证) 实验主要内容及方法 sql数据的插入、修改和删除 实验要求:
(9) 掌握sql数据插入、修改和删除语句的一般格式。(10) 掌握sql数据插入、修改和删除使用方法。 实验目的:熟练掌握sql数据插入、修改和删除的使用。 实验设备:装有SQL SERVER 2005的电脑 实验步骤:
(1) 启动SSMS;
(2) 选择SQL SERVER后,按确认; (11) 选择数据库; (12) 验证如下例题:
30
;