FROM sc y WHERE y.sno=x.sno)
运行结果:
sno cno grade
--------- ---- --------------------------------------- 201313101 1 92.0 201313101 3 88.0 201313102 2 90.0
--[3_29] 查询其他系中比计算机科学系某一学生年龄小的学生学号、姓名和年龄。
select sname,sage from student
where sage
运行结果:
sname sage -------- ------ 王敏 18 张立 19
--[3_30] 查询其他系中比计算机科学系所有学生年龄都小的学生学号、姓名和年龄。
select sname,sage from student
where sage
运行结果:
sname sage -------- ------ 王敏 18
--[3_31] 查询所有选修了1号课程的学生学号、姓名。
SELECT sno,sname FROM student WHERE EXISTS (SELECT * FROM sc
WHERE sno=student.sno AND cno='1');
运行结果:
sno sname --------- -------- 201313101 李勇
--[3_32] 查询没有选修1号课程的学生学号、姓名。
SELECT sno,sname
11
FROM student WHERE NOT EXISTS
(SELECT * --此处*可换为sno FROM sc
WHERE sno=student.sno AND cno='1');
运行结果:
sno sname --------- -------- 201313102 刘晨 201313103 王敏 201313104 张立
--[3_33] 查询选修了全部课程的学生姓名。
SELECT sname --查询这样的学生y FROM student
WHERE NOT EXISTS --不存在课程x (SELECT * FROM course
WHERE NOT EXISTS --学生y不选修x (SELECT *
FROM sc
WHERE sno=student.sno --表SC与Student自然连接 AND cno=course.cno)) --表SC与course自然连接
运行结果:
sname --------
--[3_34] 查询至少选修了学生201313102选修的全部课程的学生号码。SELECT DISTINCT sno --查询这样的学生的x FROM sc SCX
WHERE NOT EXISTS --不存在这样的课程y (SELECT * FROM sc SCY
WHERE SCY.sno='201313102' AND --学生选修了y NOT EXISTS --学生x没有选修y (SELECT * FROM sc SCZ
WHERE SCZ.sno=SCX.sno AND SCZ.cno=SCY.cno))
运行结果:
sno --------- 201313101 201313102
4. 集合查询
--[3_35] 查询计算机科学系的学生及年龄不大于19岁的学生。
12
SELECT * FROM student WHERE sdept='cs' UNION SELECT *
FROM student WHERE sage<=19
运行结果:
sno sname ssex sage sdept --------- -------- ---- ------ --------------------
201313101 李勇 男 20 CS 201313102 刘晨 女 19 CS 201313103 王敏 女 18 MA 201313104 张立 男 19 IS
--[3_36] 查询选修了课程1或者选修了课程2的学生。
SELECT sno FROM sc WHERE cno='1' UNION SELECT sno FROM sc WHERE cno='2'
运行结果:
sno --------- 201313101 201313102
--[3_37] 查询计算机科学系的学生与年龄不大于19岁的学生的交集。SELECT * FROM student WHERE sdept='cs' INTERSECT SELECT * FROM student WHERE sage<=19
运行结果:
sno sname ssex sage sdept --------- -------- ---- ------ --------------------
201313102 刘晨 女 19 CS
--[3_38] 查询选修课程1的学生集合与选修课程2的学生集合的交集。SELECT sno FROM sc WHERE cno='1' INTERSECT
13
SELECT sno FROM sc WHERE cno='2'
运行结果:
sno --------- 201313101
--[3_39] 查询计算机科学系的学生与年龄不小于19岁的学生的差集。
SELECT * FROM student WHERE sdept='cs' EXCEPT SELECT * FROM student WHERE sage>19
运行结果:
sno sname ssex sage sdept --------- -------- ---- ------ --------------------
201313102 刘晨 女 19 CS
5.综合
--[3_40] 学士学位授予条件为:至少选修了1、3、4号3门学位课程,每门学位课必须及格且学位课平均成绩在75分以上。查询cs系可授予学士学位的学生名单。
select * from student
where sdept='cs' and sno in (select sno from sc
where cno in('1','3','4') and grade>=60
group by sno having count(sno)=3 and avg(grade)>=75)
运行结果:
sno sname ssex sage sdept --------- -------- ---- ------ --------------------
--[3_41] 学士学位授予条件为:至少选修了'数据库','操作系统','数据结构'3门学位课程,每--门学位课必须及格且学位课平均成绩在75分以上。查询cs系可授予学士学位的学生名单。
select * from student
where sdept='cs' and sno in (select sno from sc
where grade>=60 and cno in (select cno from course
where cname in('数据结构','数据库','操作系统'))
14
group by sno having count(sno)=3 and avg(grade)>=75)
运行结果:
sno sname ssex sage sdept --------- -------- ---- ------ --------------------
--[3_42] 统计每个学生(含未选修课程的学生)的学分。注意:不及格课程无学分。
SELECT student.sno 学号,sname 姓名,sum(ccredit) 学分 FROM sc JOIN course ON sc.cno=course.cno JOIN student ON student.sno = sc.sno Where grade>=60
Group by student.sno,sname
运行结果:
学号 姓名 学分 --------- -------- ----------- 201313101 李勇 8 201313102 刘晨 2
5. 插入(INSERT)、修改(UPDATE)和删除(DELETE)语句的使用 --[3_43] 插入一条选课记录( '201313103','1')。
if not exists(select *
from sc
where sno='201313103' and cno='1') INSERT INTO sc(sno,cno)
VALUES ('201313103','1') --新插入的记录在Grade列上取空值
运行结果:
(1 行受影响)
--[3_44] 对每一个系,求学生的平均年龄,并把结果存入数据库。 --第1步:建表,第2步:插入子查询结果
use ST
IF EXISTS(SELECT name FROM sysobjects
WHERE name = 'DeptAge' AND type = 'U')
DROP TABLE DeptAge --若表Deptage已存在,则先删除再重建 GO
CREATE TABLE DeptAge
(sdept CHAR(2), --系名 avgage SMALLINT) --学生平均年龄
运行结果:
命令已成功完成。
--[3_45] 复制表 ⑴先建立与sc表结构完全相同的表sc1,sc2 ⑵再将sc复制到sc1中。
use ST
IF EXISTS(SELECT name FROM sysobjects
WHERE name = 'sc1' AND type = 'U') DROP TABLE sc1
15