环境: win10系统,MySQL数据库
一、题目:已知关系:
S(Sno,Sname,Sage,Ssex,Sdept)
C(cno,cname,cpno,ccredit)
SC(sno,cno,grade)
(其中sno:学号;sname:姓名;Ssex:性别;Sdept:系别;Sage :年龄;cno:课程号;cname:课程名;
cpno: 直接先行课;ccredit:学分;grade:成绩),
1、查询“CS”系学生的基本信息;
2、查询“CS”系学生年龄不在19到21之间的学生的学号、姓名;
3、查询学生中的最大年龄;
4、找出“计算机”系年龄最大的学生,显示其学号、姓名;
5、统计各系学生的人数,结果按升序排列;
6、按系统计各系学生的平均年龄,结果按降序排列;
7、查询选修了“1”或“2”号课程的学生学号和姓名;
8、查询选修了课程名为“数据库”且成绩在60分以下的学生的学号、姓名和成绩;
9、查询选修了3门以上课程的学生学号;
10、查询选修课程成绩至少有一门在80分以上的学生学号;
11、查询选修课程成绩均在80分以上的学生学号;
12、查询选修课程平均成绩在80分以上的学生学号
13、找出各系年龄最大的学生,显示其学号、姓名;
二、创建学生,课程,选课表并插入数据
#创建学生表:包括学号,姓名,年龄,性别,院系
CREATE TABLE S
(
Sno VARCHAR(7)PRIMARY KEY,
Sname VARCHAR(10)NOT NULL,
Sage INT,
Ssex VARCHAR(2),
Sdept VARCHAR(20)DEFAULT('计算机系')
);
#创建课程表:包括课程号,课程名,选修课课程号,学分
CREATE TABLE C
(
Cno VARCHAR(10)PRIMARY KEY,
Cname VARCHAR (20)NOT NULL,
Cpno VARCHAR(10),
Ccredit INT
);
#创建选课表
CREATE TABLE SC
(
Sno VARCHAR(7),
Cno VARCHAR(10),
grade INT,
FOREIGN KEY (sno) REFERENCES S(Sno),
FOREIGN KEY (cno) REFERENCES C(cno)
);
# 向学生表S中插入数据
INSERT INTO s
(Sno,Sname,Sage,Ssex,Sdept)
VALUE
("10001","张三",20,'男','计算机'),
("10002","李梅",19,'女','计算机'),
("10003","王五",18,'男','CS'),
("10004","小明",21,'男','计算机'),
("10006","黎明",18,'男','艺术表演'),
("10008","杰克",21,'男','计算机'),
("10005","小红",22,'女','CS');
# 向课程表C中插入数据
INSERT INTO c
(Cno,Cname,Cpno,Ccredit)
VALUE
("1","离散数学",NULL,5),
("2","线性代数",'3',6),
("3","高等数学",NULL,4),
("4","数据结构",'3',6),
("5","操作系统",'1',4),
("6","数据库",'4',5);
DELETE FROM c;
# 向选课表SC中插入数据
INSERT INTO sc
(Sno,Cno,grade)
VALUE
("10001","1",70),
("10001","6",56),
("10003","4",90),
("10003","5",83),
("10004","1",75),
("10004","3",90),
("10008","1",70),
("10008","5",70),
("10008","6",88),
("10002","1",85),
("10002","6",89);
三、习题答案
# 1、查询“CS”系学生的基本信息;
SELECT * FROM s WHERE Sdept="CS";
# 2、查询“CS”系学生年龄不在19到21之间的学生的学号、姓名;
SELECT Sno,Sname,Sage,Sdept
FROM s
WHERE (Sage21) AND Sdept = "CS";
# 3、查询学生中的最大年龄;
SELECT MAX(Sage) FROM s;
# 4、找出“计算机”系年龄最大的学生,显示其学号、姓名;
SELECT Sno, Sname
FROM s
WHERE Sdept="计算机"
ORDER BY Sage DESC
LIMIT 1;
# 5、统计各系学生的人数,结果按升序排列;
SELECT Sdept,COUNT(*) '人数'
FROM s
GROUP BY Sdept
ORDER BY '人数';
# 6、按系统计各系学生的平均年龄,结果按降序排列;
SELECT Sdept,AVG(Sage) '平均年龄'
FROM s
GROUP BY Sdept
ORDER BY '平均年龄'DESC;
# 7、查询选修了“1”或“2”号课程的学生学号和姓名;
SELECT s.Sno,Sname
FROM s JOIN sc ON s.`Sno`=sc.`Sno`
WHERE Cno IN ("1","2");
# 8、查询选修了课程名为“数据库”且成绩在60分以下的学生的学号、姓名和成绩;
SELECT s.Sno,Sname
FROM s JOIN sc ON s.`Sno`=sc.`Sno`
JOIN c ON sc.`Cno`=c.`Cno`
WHERE Cname ="数据库" AND grade=3;
# 10、查询选修课程成绩至少有一门在80分以上的学生学号;
SELECT sno
FROM sc
GROUP BY sc.Sno
HAVING MAX(grade)>80;
# 11、查询选修课程成绩均在80分以上的学生学号;
SELECT sno
FROM sc
GROUP BY sc.Sno
HAVING MIN(grade)>80;
# 12、查询选修课程平均成绩在80分以上的学生学号
SELECT sno
FROM sc
GROUP BY sc.Sno
HAVING AVG(grade)>80;
# 13、找出各系年龄最大的学生,显示其学号、姓名;
SELECT sno,Sname
FROM s JOIN
(SELECT Sdept,MAX(Sage) Sage
FROM s
GROUP BY Sdept) a
ON (s.`Sage`=a.Sage AND s.`Sdept` = a.Sdept) ;
如果对你有帮助,请点个赞。