464 lines
15 KiB
Markdown
464 lines
15 KiB
Markdown
### 1. 数据库表
|
||
|
||
1. 学生表:students (id, name, birth, gender) --> (学号, 学生姓名, 出生年月, 性别)
|
||
2. 教师表:teachers (id, name) --> (教师号, 教师姓名)
|
||
3. 课程表:courses (id, name, teacher_id) --> (课程号, 课程名称, 教师号)
|
||
4. 成绩表:scores (student_id, course_id, score) --> (学号, 课程号, 成绩)
|
||
|
||
### 2. 创建数据库表
|
||
|
||
```sql
|
||
CREATE TABLE students (
|
||
id VARCHAR(20) NOT NULL,
|
||
name VARCHAR(20) NOT NULL,
|
||
birth DATE NOT NULL,
|
||
gender VARCHAR(20) NOT NULL,
|
||
PRIMARY KEY(id)
|
||
);
|
||
|
||
CREATE TABLE teachers (
|
||
id VARCHAR(20) NOT NULL,
|
||
name VARCHAR(20) NOT NULL,
|
||
PRIMARY KEY(id)
|
||
);
|
||
|
||
CREATE TABLE courses (
|
||
id VARCHAR(20) NOT NULL,
|
||
name VARCHAR(20) NOT NULL,
|
||
teacher_id VARCHAR(20) NOT NULL,
|
||
FOREIGN KEY(teacher_id) REFERENCES teachers(id),
|
||
PRIMARY KEY(id)
|
||
);
|
||
|
||
CREATE TABLE scores (
|
||
student_id VARCHAR(20) NOT NULL,
|
||
course_id VARCHAR(20) NOT NULL,
|
||
score FLOAT(3) NOT NULL,
|
||
FOREIGN KEY(student_id) REFERENCES students(id),
|
||
FOREIGN KEY(course_id) REFERENCES courses(id)
|
||
);
|
||
|
||
insert into students values('01', '赵雷', '1990-01-01', '男');
|
||
insert into students values('02', '钱电', '1990-12-21', '男');
|
||
insert into students values('03', '孙风', '1990-05-20', '男');
|
||
insert into students values('04', '李云', '1990-08-06', '男');
|
||
insert into students values('05', '周梅', '1991-12-01', '女');
|
||
insert into students values('06', '吴兰', '1992-03-01', '女');
|
||
insert into students values('07', '郑竹', '1989-07-01', '女');
|
||
insert into students values('08', '王菊', '1990-01-20', '女');
|
||
|
||
insert into teachers values('01', '张三');
|
||
insert into teachers values('02', '李四');
|
||
insert into teachers values('03', '王五');
|
||
|
||
insert into courses values('01', '语文', '02');
|
||
insert into courses values('02', '数学', '01');
|
||
insert into courses values('03', '英语', '03');
|
||
|
||
insert into scores values('01', '01', 80);
|
||
insert into scores values('01', '02', 90);
|
||
insert into scores values('01', '03', 99);
|
||
insert into scores values('02', '01', 70);
|
||
insert into scores values('02', '02', 60);
|
||
insert into scores values('02', '03', 80);
|
||
insert into scores values('03', '01', 80);
|
||
insert into scores values('03', '02', 80);
|
||
insert into scores values('03', '03', 80);
|
||
insert into scores values('04', '01', 50);
|
||
insert into scores values('04', '02', 30);
|
||
insert into scores values('04', '03', 20);
|
||
insert into scores values('05', '01', 76);
|
||
insert into scores values('05', '02', 87);
|
||
insert into scores values('06', '01', 31);
|
||
insert into scores values('06', '03', 34);
|
||
insert into scores values('07', '02', 89);
|
||
insert into scores values('07', '03', 98);
|
||
```
|
||
|
||
练习题
|
||
|
||
1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
|
||
|
||
1.1查询同时存在" 01 "课程和" 02 "课程的情况
|
||
|
||
1.2查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
|
||
|
||
1.3查询不存在" 01 "课程但存在" 02 "课程的情况
|
||
|
||
2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
|
||
|
||
3.查询在 scores 表存在成绩的学生信息
|
||
|
||
4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
|
||
|
||
4.1查有成绩的学生信息
|
||
|
||
5.查询「李」姓老师的数量
|
||
|
||
6.查询学过「张三」老师授课的同学的信息
|
||
|
||
7.查询没有学全所有课程的同学的信息
|
||
|
||
8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
|
||
|
||
9.查询和" 01 "号的同学学习的课程完全相同的其他同学的信息
|
||
|
||
10.查询没学过"张三"老师讲授的任一门课程的学生姓名
|
||
|
||
11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
|
||
|
||
12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息
|
||
|
||
13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
|
||
|
||
14.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率;(及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90)
|
||
|
||
15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺
|
||
|
||
15.1按各科成绩进行排序,并显示排名, Score 重复时合并名次
|
||
|
||
16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺
|
||
|
||
16.1查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
|
||
|
||
17.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
|
||
|
||
18.查询各科成绩前三名的记录
|
||
|
||
19.查询每门课程被选修的学生数
|
||
|
||
20.查询出只选修两门课程的学生学号和姓名
|
||
|
||
21.查询男生、女生人数
|
||
|
||
22.查询名字中含有「风」字的学生信息
|
||
|
||
23.查询同名同性学生名单,并统计同名人数
|
||
|
||
24.查询 1990 年出生的学生名单
|
||
|
||
25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
|
||
|
||
26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
|
||
|
||
27.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
|
||
|
||
28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
|
||
|
||
29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
|
||
|
||
30.查询不及格的课程
|
||
|
||
31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
|
||
|
||
32.求每门课程的学生人数
|
||
|
||
33.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
|
||
|
||
34.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
|
||
|
||
35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
|
||
|
||
36.查询每门课成绩最好的前两名
|
||
|
||
37.统计每门课程的学生选修人数(超过 5 人的课程才统计)
|
||
|
||
38.检索至少选修两门课程的学生学号
|
||
|
||
39.查询选修了全部课程的学生信息
|
||
|
||
40.查询各学生的年龄,只按年份来算
|
||
|
||
41.查询各学生的年龄,按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
|
||
|
||
42.查询本周过生日的学生
|
||
|
||
43.查询下周过生日的学生
|
||
|
||
44.查询本月过生日的学生
|
||
|
||
45.查询下月过生日的学生
|
||
|
||
```sql
|
||
#1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
|
||
SELECT st.*, c1.score '01课程', c2.score '02课程'
|
||
FROM students st, (
|
||
SELECT sc1.student_id, sc1.score
|
||
FROM scores sc1
|
||
WHERE sc1.course_id = '01'
|
||
)c1,
|
||
(
|
||
SELECT sc2.student_id, sc2.score
|
||
FROM scores sc2
|
||
WHERE sc2.course_id = '02'
|
||
)c2
|
||
WHERE st.id = c1.student_id AND st.id = c2.student_id AND c1.score > c2.score;
|
||
|
||
#1.1查询同时存在" 01 "课程和" 02 "课程的情况
|
||
SELECT st.*, c1.score '01课程', c2.score '02课程'
|
||
FROM students st, (
|
||
SELECT sc1.student_id, sc1.score
|
||
FROM scores sc1
|
||
WHERE sc1.course_id = '01'
|
||
)c1,
|
||
(
|
||
SELECT sc2.student_id, sc2.score
|
||
FROM scores sc2
|
||
WHERE sc2.course_id = '02'
|
||
)c2
|
||
WHERE st.id = c1.student_id AND st.id = c2.student_id;
|
||
|
||
#1.2查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
|
||
SELECT st.*, c1.score '01课程', c2.score '02课程'
|
||
FROM students st
|
||
LEFT JOIN
|
||
(
|
||
SELECT sc1.student_id, sc1.score
|
||
FROM scores sc1
|
||
WHERE sc1.course_id = '01'
|
||
)c1 ON st.id = c1.student_id
|
||
LEFT JOIN
|
||
(
|
||
SELECT sc2.student_id, sc2.score
|
||
FROM scores sc2
|
||
WHERE sc2.course_id = '02'
|
||
)c2 ON st.id = c2.student_id
|
||
WHERE c1.score IS NOT NULL;
|
||
|
||
#1.3查询不存在" 01 "课程但存在" 02 "课程的情况
|
||
SELECT st.*, c1.score '01课程', c2.score '02课程'
|
||
FROM students st
|
||
LEFT JOIN
|
||
(
|
||
SELECT sc1.student_id, sc1.score
|
||
FROM scores sc1
|
||
WHERE sc1.course_id = '01'
|
||
)c1 ON st.id = c1.student_id
|
||
LEFT JOIN
|
||
(
|
||
SELECT sc2.student_id, sc2.score
|
||
FROM scores sc2
|
||
WHERE sc2.course_id = '02'
|
||
)c2 ON st.id = c2.student_id
|
||
WHERE c1.score IS NULL AND c2.score IS NOT NULL;
|
||
|
||
#2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
|
||
SELECT st.`name`, AVG(sc.score)
|
||
FROM students st, scores sc
|
||
WHERE st.id = sc.student_id
|
||
GROUP BY st.id
|
||
HAVING AVG(sc.score) > 60;
|
||
|
||
#3.查询在 scores 表存在成绩的学生信息
|
||
SELECT *
|
||
FROM students
|
||
WHERE students.id IN (
|
||
SELECT student_id
|
||
FROM scores
|
||
);
|
||
#4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
|
||
SELECT st.id, st.`name`, COUNT(*), SUM(sc.score)
|
||
FROM students st
|
||
LEFT JOIN scores sc ON st.id = sc.student_id
|
||
GROUP BY st.id;
|
||
#4.1查有成绩的学生信息
|
||
SELECT st.id, st.`name`, COUNT(*), SUM(sc.score)
|
||
FROM students st
|
||
LEFT JOIN scores sc ON st.id = sc.student_id
|
||
WHERE sc.score IS NOT NULL
|
||
GROUP BY st.id;
|
||
|
||
#5.查询「李」姓老师的数量
|
||
SELECT COUNT(*)
|
||
FROM teachers t
|
||
WHERE t.`name` LIKE '李%';
|
||
|
||
#6.查询学过「张三」老师授课的同学的信息
|
||
SELECT DISTINCT st.*
|
||
FROM students st, scores sc
|
||
WHERE st.id = sc.student_id AND sc.course_id = (
|
||
SELECT c.id
|
||
FROM courses c, teachers t
|
||
WHERE c.teacher_id = t.id AND t.`name` = '张三'
|
||
);
|
||
|
||
#7.查询没有学全所有课程的同学的信息
|
||
SELECT st.*
|
||
FROM students st
|
||
LEFT JOIN scores sc ON st.id = sc.student_id
|
||
LEFT JOIN courses c ON sc.course_id = c.id
|
||
GROUP BY st.id
|
||
HAVING COUNT(*) < 3;
|
||
|
||
#8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
|
||
SELECT st.*
|
||
FROM students st, scores sc
|
||
WHERE st.id = sc.student_id AND st.id <> '01' AND sc.course_id IN(
|
||
SELECT course_id
|
||
FROM scores s
|
||
WHERE s.student_id = '01'
|
||
);
|
||
|
||
#9.查询和" 01 "号的同学学习的课程完全相同的其他同学的信息
|
||
SELECT st.*
|
||
FROM students st, scores sc
|
||
WHERE st.id = sc.student_id AND sc.course_id AND st.id <> '01'
|
||
GROUP BY st.id
|
||
HAVING GROUP_CONCAT(sc.course_id) = (
|
||
SELECT GROUP_CONCAT(c.course_id)
|
||
FROM scores c
|
||
WHERE c.student_id = '01'
|
||
);
|
||
|
||
#10.查询没学过"张三"老师讲授的任一门课程的学生姓名
|
||
SELECT s.`name`
|
||
FROM students s
|
||
WHERE s.id NOT IN (
|
||
SELECT st.id
|
||
FROM teachers t, courses c, students st, scores sc
|
||
WHERE t.id = c.teacher_id AND t.`name` = '张三' AND st.id = sc.student_id AND sc.course_id = c.id
|
||
);
|
||
|
||
#11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
|
||
SELECT sc.student_id, st.`name`,AVG(sc.score)
|
||
FROM scores sc, students st
|
||
WHERE sc.score < 60 AND sc.student_id = st.id
|
||
GROUP BY sc.student_id
|
||
HAVING COUNT(*) >= 2;
|
||
|
||
#12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息
|
||
SELECT st.*
|
||
FROM scores sc, students st
|
||
WHERE sc.course_id = '01' AND sc.score < 60 AND sc.student_id = st.id
|
||
ORDER BY sc.score DESC;
|
||
|
||
#13.按平均成绩从高到低显示所有学生的所有课程的平均成绩
|
||
SELECT c.`name`, AVG(sc.score)
|
||
FROM scores sc, courses c
|
||
WHERE sc.course_id = c.id
|
||
GROUP BY c.id
|
||
ORDER BY AVG(sc.score) DESC;
|
||
|
||
#14.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率;(及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90)
|
||
SELECT c.id '课程ID', c.`name` '课程名称', MAX(s.score) '最高分', MIN(s.score) '最低分', ROUND(AVG(s.score), 1) '平均值',
|
||
s2.s1 '及格率', s2.s2 '中等率', s2.s3 '优良率', s2.s4 '优秀率'
|
||
FROM scores s, courses c,
|
||
(
|
||
SELECT s.course_id,
|
||
CONCAT(TRUNCATE(COUNT(IF(s.score >=60, TRUE, NULL))/sc.count*100,2), '%') s1,
|
||
CONCAT(TRUNCATE(COUNT(IF(s.score >=70 AND s.score < 80, TRUE, NULL))/sc.count*100,2), '%') s2,
|
||
CONCAT(TRUNCATE(COUNT(IF(s.score >=80 AND s.score < 90, TRUE, NULL))/sc.count*100,2), '%') s3,
|
||
CONCAT(TRUNCATE(COUNT(IF(s.score >=90, TRUE, NULL))/sc.count*100,2), '%') s4
|
||
FROM scores s, (
|
||
SELECT course_id, COUNT(*) count
|
||
FROM scores
|
||
GROUP BY course_id
|
||
) sc
|
||
WHERE s.course_id = sc.course_id
|
||
GROUP BY s.course_id
|
||
)s2
|
||
WHERE s.course_id = c.id AND c.id = s2.course_id
|
||
GROUP BY c.id;
|
||
|
||
#15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺
|
||
|
||
#15.1按各科成绩进行排序,并显示排名, Score 重复时合并名次
|
||
|
||
#16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺
|
||
|
||
|
||
#16.1查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
|
||
SELECT sc.`name`, sc.s, @rank:=@rank+1
|
||
FROM (
|
||
SELECT st.`name`, IFNULL(SUM(sc.score),0) s
|
||
FROM students st
|
||
LEFT JOIN scores sc ON st.id = sc.student_id
|
||
GROUP BY st.id
|
||
ORDER BY s DESC
|
||
)sc, (SELECT @rank:=0) r;
|
||
#17.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
|
||
|
||
#18.查询各科成绩前三名的记录
|
||
SELECT s1.sname, s1.cname, s1.score, s1.rank1
|
||
FROM (
|
||
SELECT st.`name` sname, c.`name` cname, sc.score, @rank1:=@rank1+1 rank1
|
||
FROM students st, scores sc, courses c, (SELECT @rank1:=0) r
|
||
WHERE st.id = sc.student_id AND c.id = sc.course_id AND course_id = '01'
|
||
ORDER BY sc.score DESC
|
||
LIMIT 3
|
||
)s1
|
||
UNION
|
||
SELECT s2.sname, s2.cname, s2.score, s2.rank1
|
||
FROM (
|
||
SELECT st.`name` sname, c.`name` cname, sc.score, @rank2:=@rank2+1 rank1
|
||
FROM students st, scores sc, courses c, (SELECT @rank2:=0) r
|
||
WHERE st.id = sc.student_id AND c.id = sc.course_id AND course_id = '02'
|
||
ORDER BY sc.score DESC
|
||
LIMIT 3
|
||
)s2
|
||
UNION
|
||
SELECT s3.sname, s3.cname, s3.score, s3.rank1
|
||
FROM (
|
||
SELECT st.`name` sname, c.`name` cname, sc.score, @rank3:=@rank3+1 rank1
|
||
FROM students st, scores sc, courses c, (SELECT @rank3:=0) r
|
||
WHERE st.id = sc.student_id AND c.id = sc.course_id AND course_id = '03'
|
||
ORDER BY sc.score DESC
|
||
LIMIT 3
|
||
)s3;
|
||
|
||
#19.查询每门课程被选修的学生数
|
||
|
||
#20.查询出只选修两门课程的学生学号和姓名
|
||
|
||
#21.查询男生、女生人数
|
||
|
||
#22.查询名字中含有「风」字的学生信息
|
||
|
||
#23.查询同名同性学生名单,并统计同名人数
|
||
|
||
#24.查询 1990 年出生的学生名单
|
||
|
||
#25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
|
||
|
||
#26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
|
||
|
||
#27.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
|
||
|
||
#28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
|
||
|
||
#29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
|
||
|
||
#30.查询不及格的课程
|
||
|
||
#31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
|
||
|
||
#32.求每门课程的学生人数
|
||
|
||
#33.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
|
||
|
||
#34.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
|
||
|
||
#35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
|
||
|
||
#36.查询每门课成绩最好的前两名
|
||
|
||
#37.统计每门课程的学生选修人数(超过 5 人的课程才统计)
|
||
|
||
#38.检索至少选修两门课程的学生学号
|
||
|
||
#39.查询选修了全部课程的学生信息
|
||
|
||
#40.查询各学生的年龄,只按年份来算
|
||
|
||
#41.查询各学生的年龄,按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
|
||
|
||
#42.查询本周过生日的学生
|
||
|
||
#43.查询下周过生日的学生
|
||
|
||
#44.查询本月过生日的学生
|
||
|
||
#45.查询下月过生日的学生
|
||
```
|
||
|