SSD7——数据库实验(二)

数据库实验二

为了实验二,对部分表的部分字段进行了修改

(一)
1.查询学生的基本信息:

SELECT * FROM S WHERE Sname = 'Tony'

2. 查询“CS”系学生的基本信息:

SELECT * FROM S WHERE sdept = 'CS'

如图:
SSD7——数据库实验(二)_第1张图片
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
)

但是结果是这样,就不是很清楚
SSD7——数据库实验(二)_第2张图片
留作一个问题吧~

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

如图:
SSD7——数据库实验(二)_第3张图片
9. 查询无先修课的课程的课程名和学时数

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

如图:
SSD7——数据库实验(二)_第4张图片
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

SSD7——数据库实验(二)_第5张图片
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

如图
SSD7——数据库实验(二)_第6张图片
15.查询每位学生选修了课程的学生信息(显示:学号,姓名,课程号,课程名,成绩)

SELECT SC.Sno ,Sname,C.Cno,Cname,grade FROM SC,S,C WHERE SC.Sno = S.Sno AND SC.Cno = C.Cno

如图
SSD7——数据库实验(二)_第7张图片
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 

如图:
SSD7——数据库实验(二)_第8张图片
18.查询选修课程成绩至少有一门在80分以上的学生学号
(这里的关键字 DISTINCT 是用于强制去重复,因为假如一个同学选了多门课,则会出现学号重复的情况)

SELECT DISTINCT Sno
FROM SC
WHERE grade > 80

SSD7——数据库实验(二)_第9张图片
不去重的后果就是这样(错误示范)
SSD7——数据库实验(二)_第10张图片
19.查询选修课程成绩均在80分以上的学生学号

SELECT SC.Sno FROM SC WHERE SC.grade > 80

SSD7——数据库实验(二)_第11张图片
(二)
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)

实验二完成。

你可能感兴趣的:(数据库)