MySQL练习(学生表,课程表,选课表)超详解

环境: 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”系学生年龄不在1921之间的学生的学号、姓名;

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 (Sage<19 OR Sage>21) 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<60;

# 9、查询选修了3门以上课程的学生学号;
SELECT sno 
FROM sc 
GROUP BY sc.Sno 
HAVING COUNT(*)>=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) ;

如果对你有帮助,请点个赞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章