为了实验二,对部分表的部分字段进行了修改
(一)
1.查询学生的基本信息:
SELECT * FROM S WHERE Sname = 'Tony'
2. 查询“CS”系学生的基本信息:
SELECT * FROM S WHERE sdept = 'CS'
如图:
3. 查询“CS”系学生年龄不在19到21之间的学生的学号、姓名:
SELECT Sno, Sname from S where sdept = 'CS' and Sage<19 or Sage>21
4. 找出“CS”系年龄最大的学生,显示其学号、姓名
SELECT * from S where Sage = (SELECT MAX(Sage) from S where sdept='CS')
5. 找出各系年龄最大的学生,显示其学号、姓名
在写的过程中出现了一些问题:
1)IN后面只能SELECT一个字段
2)本题中需要找出“各系”的学生,所以用GROUP BY 按照系进行分组
SELECT *
FROM S
WHERE S.Sage IN (
SELECT MAX(S.Sage) Sage
FROM S
GROUP BY S.sdept
)
现在有一个问题,就是EXISTS怎么用,比如我的代码是这样
SELECT *
FROM S S1
WHERE exists (
SELECT MAX(S2.Sage) Sage
FROM S S2
WHERE S1.Sno = S2.Sno
GROUP BY S2.sdept
)
6. 统计“CS”系学生的人数
SELECT COUNT(*) FROM S WHERE sdept = 'CS'
7. 统计各系学生的人数,结果按升序排列(用到GROUP BY,因为SELECT选择了两个元组,所以说分组聚集)
SELECT sdept,COUNT(*) FROM S GROUP BY sdept ORDER BY COUNT(*)ASC
8. 按系统计各系学生的平均年龄,结果按降序排列
SELECT sdept,AVG(Sage) FROM S GROUP BY sdept ORDER BY AVG(Sage) DESC
SELECT Cname,ccredit FROM C WHERE Cpno = ''
10.统计每位学生选修课程的门数、学分及其平均成绩
SELECT COUNT(SC.Cno) 门数,SUM(ccredit) 总学分,AVG(SC.grade) 平均成绩 FROM C,SC WHERE SC.Cno = C.Cno GROUP BY Sno
如图:
11.统计选修每门课程的学生人数及各门课程的平均成绩
SELECT SC.Cno,COUNT(SC.grade) 选修人数 ,AVG(SC.grade) 平均成绩 FROM SC GROUP BY SC.Cno
12.找出平均成绩在85分以上的学生,结果按系分组,并按平均成绩的升序排列(SC.Sno = S.Sno是确保SELECT在两个表中建立查询的连接)
SELECT S.Sno,S.sdept,AVG(SC.grade) 平均成绩 FROM SC,S WHERE SC.Sno = S.Sno GROUP BY S.Sno,S.sdept HAVING AVG(SC.grade) > 85 ORDER BY AVG(SC.grade)ASC
13.查询选修了“1”或“2”号课程的学生学号和姓名
第一种稍微麻烦一些,用的是并集运算,也就是UNION(写起来相对复杂,但是效率高,用到了索引)
SELECT SC.Sno,S.Sname FROM SC,S WHERE SC.Cno = '1' AND SC.Sno = S.Sno UNION SELECT SC.Sno,S.Sname FROM SC,S WHERE SC.Cno = '2' AND SC.Sno = S.Sno
下面这种就更加简洁,用OR然后再用括号括起来就行,但是简洁是简洁,效率会低,OR会导致全扫描
SELECT SC.Sno,S.Sname
FROM SC,S
WHERE SC.Sno = S.Sno AND
(SC.Cno = '1' OR SC.Cno = '2')
14.查询选修了课程名为“数据库系统”且成绩在60分以下的学生的学号、姓名和成绩
SELECT SC.Sno,Sname,grade FROM SC,S,C WHERE SC.Sno = S.Sno AND SC.Cno = C.Cno AND Cname = '数据库系统' AND grade < 60
如图
15.查询每位学生选修了课程的学生信息(显示:学号,姓名,课程号,课程名,成绩)
SELECT SC.Sno ,Sname,C.Cno,Cname,grade FROM SC,S,C WHERE SC.Sno = S.Sno AND SC.Cno = C.Cno
如图
16.查询没有选修课程的学生的基本信息
一般查询没有的,即某一个条件的补集,可以用NOT IN一个WHERE子查询
SELECT *
FROM S
WHERE S.Sno NOT IN(SELECT SC.Sno FROM S,SC WHERE SC.Sno = S.Sno)
17.查询选修了3门以上课程的学生学号
(这里我尝试过了用WHERE子查询,但发现又绕回来了,所以对于这种类似的题适合用GROUP BY…HAVING)
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(Cno) > 3
如图:
18.查询选修课程成绩至少有一门在80分以上的学生学号
(这里的关键字 DISTINCT 是用于强制去重复,因为假如一个同学选了多门课,则会出现学号重复的情况)
SELECT DISTINCT Sno
FROM SC
WHERE grade > 80
不去重的后果就是这样(错误示范)
19.查询选修课程成绩均在80分以上的学生学号
SELECT SC.Sno FROM SC WHERE SC.grade > 80
(二)
1. 将数据分别插入表S、C、SC;
2. 将表S、C、SC中的数据保存在磁盘上。
3. 在表S、C、SC上练习数据的插入、修改、删除操作。(比较在表上定义/未定义主码(Primary Key)或外码(Foreign Key)时的情况)
4. 将表S、C、SC中的数据全部删除,再利用磁盘上备份的数据来恢复数据。
//插入操作
INSERT INTO C(Cno, Cname, Cpno, ccredit)
VALUES
('001','Java程序设计','C++程序设计',3);
INSERT INTO S (Sno, Sname, Ssex, Sage, sdept)
VALUES
(8209180000,'lgx','男',18,'通信');
INSERT INTO SC(Sno, Cno, grade)
VALUES
(999999999,'4',72);
//更新操作
UPDATE C SET Cpno = 'Python语言' WHERE Cpno = 'C++程序设计'
UPDATE S SET Sname = '李' WHERE Sname = 'lgx'
UPDATE SC SET grade=99 WHERE grade=72
SELECT * FROM C WHERE Cno='T1';
SELECT * FROM S WHERE Sno='1111111111';
SELECT * FROM SC WHERE Sno = '1111111111';
//删除操作
DELETE FROM C WHERE Cno='001';
DELETE FROM S WHERE Sno='8209180000';
DELETE FROM SC WHERE Sno = '999999999';
//分别删除表中所有数据
TRUNCATE TABLE C
TRUNCATE TABLE S
TRUNCATE TABLE SC
5. 在表SC中插入某个学生的选课信息(如:学号为“2007001005”,课程号为“c123”,成绩待定)
INSERT INTO SC (Sno, Cno,grade) VALUES (2007001005, 'c123',NULL);
6. 求各系学生的平均成绩,并把结果存入数据库【有问题】
INSERT INTO SC(AVG_Grade) VALUES (SELECT AVG(grade)FROM SC GROUP BY sdept)
7. 将“CS”系全体学生的成绩置零
UPDATE SC SET grade=0 WHERE Sno IN (SELECT SC.Sno FROM SC,S WHERE SC.Sno= S.Sno AND S.sdept='CS')
8. 删除“CS”系全体学生的选课记录
DELETE FROM SC WHERE 'CS' = (SELECT sdept FROM S WHERE S.Sno = SC.Sno);
9. 删除学号为“S1”的相关信息
DELETE FROM S WHERE S.Sno = 'S1'
10.将学号为“S1”的学生的学号修改为“S001”
UPDATE S SET Sno='S001' WHERE Sno='S1'
11.把平均成绩大于80分的男同学的学号和平均成绩存入另一个表S——GRADE(SNO,AVG_GRADE)
emmm,这个题就大概模拟一下了
INSERT INTO S(Sno, grade)
SELECT SC.Sno, AVG(SC.grade) FROM SC,S
WHERE SC.Sno=S.Sno AND S.Ssex='男'
GROUP BY SC.Sno
HAVING AVG(SC.grade) > 80
12. 把选修了课程名为“数据结构”的学生的成绩提高10%
UPDATE SC SET Cno=Cno*1.10
WHERE Sno IN(SELECT * FROM SC,C WHERE C.Cname='数据结构' AND SC.Cno=C.Cno)
13. 把选修了“C2”号课程,且成绩低于该门课程的平均成绩的学生成绩删除掉
SELECT * FROM SC WHERE Cno='C2' AND grade<(SELECT AVG(grade) FROM SC)
实验二完成。