teacher
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`TId` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`Tname` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES ('01', '张三');
INSERT INTO `teacher` VALUES ('02', '李四');
INSERT INTO `teacher` VALUES ('03', '王五');
SET FOREIGN_KEY_CHECKS = 1;
sc
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sc
-- ----------------------------
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
`SId` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`CId` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`score` decimal(18, 1) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES ('01', '01', 80.0);
INSERT INTO `sc` VALUES ('01', '02', 90.0);
INSERT INTO `sc` VALUES ('01', '03', 99.0);
INSERT INTO `sc` VALUES ('02', '01', 70.0);
INSERT INTO `sc` VALUES ('02', '02', 60.0);
INSERT INTO `sc` VALUES ('02', '03', 80.0);
INSERT INTO `sc` VALUES ('03', '01', 80.0);
INSERT INTO `sc` VALUES ('03', '02', 80.0);
INSERT INTO `sc` VALUES ('03', '03', 80.0);
INSERT INTO `sc` VALUES ('04', '01', 50.0);
INSERT INTO `sc` VALUES ('04', '02', 30.0);
INSERT INTO `sc` VALUES ('04', '03', 20.0);
INSERT INTO `sc` VALUES ('05', '01', 76.0);
INSERT INTO `sc` VALUES ('05', '02', 87.0);
INSERT INTO `sc` VALUES ('06', '01', 31.0);
INSERT INTO `sc` VALUES ('06', '03', 34.0);
INSERT INTO `sc` VALUES ('07', '02', 89.0);
INSERT INTO `sc` VALUES ('07', '03', 98.0);
SET FOREIGN_KEY_CHECKS = 1;
course
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`CId` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`Cname` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`TId` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('01', '语文', '02');
INSERT INTO `course` VALUES ('02', '数学', '01');
INSERT INTO `course` VALUES ('03', '英语', '03');
SET FOREIGN_KEY_CHECKS = 1;
student
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`SId` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`Sname` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`Sage` datetime(0) NULL DEFAULT NULL,
`Ssex` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('01', '赵雷', '1990-01-01 00:00:00', '男');
INSERT INTO `student` VALUES ('02', '钱电', '1990-12-21 00:00:00', '男');
INSERT INTO `student` VALUES ('03', '孙风', '1990-05-20 00:00:00', '男');
INSERT INTO `student` VALUES ('04', '李云', '1990-08-15 00:00:00', '男');
INSERT INTO `student` VALUES ('05', '周梅', '1991-12-01 00:00:00', '女');
INSERT INTO `student` VALUES ('06', '吴兰', '1992-03-01 00:00:00', '女');
INSERT INTO `student` VALUES ('07', '郑竹', '1989-07-01 00:00:00', '女');
SET FOREIGN_KEY_CHECKS = 1;
1.查询" 01 “课程比” 02 "课程成绩高的学生的信息及课程分数
SELECT
st.*,
s1.score AS score01,
s2.score AS score02
FROM
student st
JOIN sc s1 ON st.Sid = s1.Sid AND s1.Cid = '01'
LEFT JOIN sc s2 ON st.Sid = s2.Sid AND s2.Cid = '02'
WHERE
s1.score > s2.score
1.1 查询同时存在" 01 “课程和” 02 "课程的情况
SELECT
st.*
FROM
student st
JOIN sc s1 ON st.Sid = s1.Sid
AND s1.Cid = '01'
LEFT JOIN sc s2 ON st.Sid = s2.Sid
AND s2.Cid = '02'
1.2 查询存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null )
SELECT
st.* ,t1.score as score01 ,t2.score as score02
FROM
student AS st
INNER JOIN ( SELECT SC.SId, SC.score FROM SC WHERE SC.CId = '01' ) AS t1 ON st.SId = t1.SId
LEFT JOIN ( SELECT SC.SId, SC.score FROM SC WHERE SC.CId = '02' ) AS t2 ON t1.SId = t2.SId
1.3 查询不存在" 01 “课程但存在” 02 "课程的情况
select *
from sc
where SId not in (select SId from sc where CId = '01')
and CId = '02'
2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
SELECT
st.SId,
st.Sname,
s1.avg
FROM
student st
INNER JOIN ( SELECT sc.SId, avg( sc.score ) AS avg FROM sc GROUP BY sc.SId HAVING avg >= 60 ) AS s1 ON st.SId = s1.SId
3.查询在 SC 表存在成绩的学生信息 注意 DISTINCT 关键字
select DISTINCT student.*
from student, sc
where student.sid = sc.sid
4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 NULL )
SELECT
st.SId,
st.Sname,
s1.count,
s1.sum
FROM
student st
INNER JOIN ( SELECT SId, COUNT( CId ) count, SUM( score ) sum FROM sc GROUP BY SId ) AS s1 ON s1.SId = st.SId
4.1 查有成绩的学生信息
SELECT
*
FROM
student
WHERE
EXISTS (
SELECT
*
FROM
sc
WHERE
student.SId = sc.SId)
5.查询「李」姓老师的数量
SELECT
count(*)
FROM
teacher
WHERE
teacher.Tname LIKE '李%'
6.查询学过「张三」老师授课的同学的信息
SELECT
student.*
FROM
student,
sc
WHERE
student.sid = sc.sid
AND sc.cid IN (
SELECT
cid
FROM
course,
teacher
WHERE
course.tid = teacher.tid
AND Tname = '张三')
7.查询没有学全所有课程的同学的信息
SELECT
student.*
FROM
student
WHERE
SId IN (
SELECT
SId
FROM
sc
GROUP BY
SId
HAVING
COUNT(*) < ( SELECT COUNT(*) FROM course )
)
8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
SELECT DISTINCT
student.*
FROM
sc,
student
WHERE
sc.CId IN ( SELECT CId FROM sc WHERE SId = '01' )
AND sc.SId = student.SId
9.查询和" 01 "号的同学学习的课程完全相同的其他同学的信息
SELECT DISTINCT
student.*
FROM
( SELECT student.SId, t.CId FROM student,( SELECT sc.CId FROM sc WHERE sc.SId = '01' ) AS t ) AS t1
LEFT JOIN sc ON t1.SId = sc.SId
AND t1.CId = sc.CId,
student
WHERE
sc.SId IS NOT NULL
AND t1.SId = student.SId
AND t1.SId <> '01'
10.查询没学过"张三"老师讲授的任一门课程的学生姓名
SELECT
*
FROM
student
WHERE
student.SId NOT IN (
SELECT
student.SId
FROM
student
LEFT JOIN sc ON student.SId = sc.SId
WHERE
EXISTS (
SELECT
*
FROM
teacher,
course
WHERE
teacher.Tname = '张三'
AND teacher.TId = course.TId
AND course.CId = sc.CId
))
11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
SELECT
st.SId,
st.Sname,
t2.avg
FROM
student st,
( SELECT sc.SId, avg( sc.score ) AS avg FROM sc GROUP BY sc.SId ) AS t2
WHERE
st.SId = t2.SId
AND st.SId IN (
SELECT
t1.SId
FROM
( SELECT * FROM sc WHERE sc.score < 60 ) AS t1
GROUP BY
t1.SId
HAVING
count(*) >= 2
)
12.检索" 01 "课程分数小于60,按分数降序排列的学生信息
SELECT
st.*,
t.score
FROM
student st,
( SELECT sc.* FROM sc WHERE sc.CId = '01' AND sc.score < 60 ) AS t
WHERE
st.SId = t.SId
ORDER BY
t.score DESC
13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
SELECT
a.SId,
( SELECT score FROM sc WHERE SId = a.SId AND CId = '01' ) AS cl,
( SELECT score FROM sc WHERE SId = a.SId AND CId = '02' ) AS ma,
( SELECT score FROM sc WHERE SId = a.SId AND CId = '03' ) AS en,
round( avg( score ), 2 ) AS avg
FROM
sc a
GROUP BY
a.SId
ORDER BY
avg DESC;
14.查询各科成绩最高分、最低分和平均分: 以如下形式显示:
----课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
----及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
SELECT
sc.CId,
c.Cname,
count(*) as count,
round(max( sc.score ), 2 ) as max,
round(min( sc.score ), 2 ) as min,
round( avg( score ), 2 ) AS avg,
round( 100 *( sum( CASE WHEN sc.score >= 60 THEN 1 ELSE 0 END )/ count(*)), 2 ) AS pass,
round( 100 *( sum( CASE WHEN sc.score >= 70 AND sc.score < 80 THEN 1 ELSE 0 END )/ count(*)), 2 ) AS moderate,
round( 100 *( sum( CASE WHEN sc.score >= 80 AND sc.score < 90 THEN 1 ELSE 0 END )/ count(*)), 2 ) AS excellent,
round( 100 *( sum( CASE WHEN sc.score >= 90 THEN 1 ELSE 0 END )/ count(*)), 2 ) AS proficiency
FROM
sc LEFT JOIN course c on c.CId = sc.CId
GROUP BY
sc.CId ,
c.Cname
ORDER BY
count(*) DESC,
sc.CId ASC
15.按各科成绩进行排序,并显示排名,Score 重复时保留名次空缺
SELECT
*,
RANK() OVER ( PARTITION BY sc.cid ORDER BY sc.score DESC )ranking
FROM
sc;
15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次
SELECT
*,
DENSE_RANK() OVER ( PARTITION BY sc.cid ORDER BY sc.score DESC )ranking
FROM
sc
16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺
SELECT
sc.SId,
RANK() OVER ( ORDER BY sum( sc.score ) DESC )ranking,
sum( sc.score ) AS sum
FROM
sc
GROUP BY
sc.SId
ORDER BY
sum DESC;
16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
SELECT
sc.SId,
DENSE_RANK() OVER ( ORDER BY sum( sc.score ) DESC )ranking,
sum( sc.score ) AS sum
FROM
sc
GROUP BY
sc.SId
ORDER BY
sum DESC;
17.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
SELECT
sc.CId,
c.Cname,
round( 100 *( sum( CASE WHEN sc.score >= 0 AND sc.score < 60 THEN 1 ELSE 0 END )/ count(*)), 2 ) AS num_60_0,
round( 100 *( sum( CASE WHEN sc.score >= 60 AND sc.score < 70 THEN 1 ELSE 0 END )/ count(*)), 2 ) AS num_70_60,
round( 100 *( sum( CASE WHEN sc.score >= 70 AND sc.score < 85 THEN 1 ELSE 0 END )/ count(*)), 2 ) AS num_85_70,
round( 100 *( sum( CASE WHEN sc.score >= 85 AND sc.score <= 100 THEN 1 ELSE 0 END )/ count(*)), 2 ) AS num_100_85
FROM
sc
LEFT JOIN course c ON c.CId = sc.CId
GROUP BY
sc.CId,
c.Cname
18.查询各科成绩前三名的记录
SELECT
*
FROM
( SELECT *, RANK() OVER ( PARTITION BY sc.CId ORDER BY sc.score desc) AS r FROM sc ) AS score
WHERE
score.r <= 3
19.查询每门课程被选修的学生数
SELECT
sc.CId,
c.Cname,
count(*)
FROM
sc
LEFT JOIN course c ON c.CId = sc.CId
GROUP BY
sc.CId,
c.Cname
20.查询出只选修两门课程的学生学号和姓名
SELECT
st.SId,
st.Sname
FROM
student st,
( SELECT sc.SId, count(*) AS count FROM sc GROUP BY sc.SId ) AS c
WHERE
c.count = 2
AND c.SId = st.SId
21.查询男生、女生人数
SELECT
st.Ssex,
count(*) AS num
FROM
student st
GROUP BY
st.Ssex
22.查询名字中含有「风」字的学生信息
SELECT
st.*
FROM
student st
WHERE
st.Sname LIKE '%风%'
23.查询同名同姓学生名单,并统计同名人数
SELECT
st.Sname,
count(*) AS num
FROM
student st
GROUP BY
st.Sname
HAVING
count(*) > 1
24.查询 1990 年出生的学生名单
SELECT
st.*
FROM
student st
WHERE
st.Sage LIKE '1990-%';
25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
SELECT
sc.CId,
avg( sc.score ) AS avg
FROM
sc
GROUP BY
sc.CId
ORDER BY
avg( sc.score ) DESC, sc.CId ASC
26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
SELECT
st.SId,
st.Sname,
t.avg
FROM
student st,
( SELECT sc.SId, avg( sc.score ) AS avg FROM sc GROUP BY sc.SId ) AS t
WHERE
t.SId = st.SId
AND avg >= 85
27.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
SELECT
st.Sname,
sc.score
FROM
student st
INNER JOIN sc ON st.SId = sc.SId
AND sc.score < 60
INNER JOIN course ON course.Cname = '数学'
AND course.CId = sc.CId
28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
SELECT
st.*,
sc.CId,
sc.score
FROM
student AS st
LEFT JOIN sc ON st.SId = sc.SId
ORDER BY
st.SId,
sc.CId;
29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
SELECT
st.Sname,
course.Cname,
sc.score
FROM
student AS st
LEFT JOIN sc ON st.SId = sc.SId
LEFT JOIN course ON sc.CId = course.CId
WHERE
sc.score > 70
30.查询不及格的课程
SELECT
student.Sname,
course.Cname,
sc.score
FROM
student,
sc,
course
WHERE
sc.score < 60
AND sc.CId = course.CId
AND student.SId = sc.SId
31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
SELECT
st.SId,
st.Sname
FROM
student st,
sc
WHERE
sc.CId = '01'
AND sc.score >= 80
AND st.SId = sc.SId
32.求每门课程的学生人数
SELECT
sc.CId,
sum( sc.CId ) AS sum
FROM
sc
GROUP BY
sc.CId
33.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
SELECT
st.*,
sc.score
FROM
student st,
sc
WHERE
sc.CId IN ( SELECT course.CId FROM course, teacher WHERE course.TId = teacher.TId AND teacher.Tname = '张三' )
AND st.SId = sc.SId
ORDER BY
sc.score DESC
LIMIT 1
34.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
SELECT
*
FROM
(
SELECT
student.*,
sc.score,
sc.CId,
DENSE_RANK() OVER ( ORDER BY sc.score DESC ) ranking
FROM
student,
sc
WHERE
sc.CId = ( SELECT course.CId FROM course, teacher WHERE course.TId = teacher.TId AND teacher.Tname = '张三' )
AND student.SId = sc.SId
) AS t
WHERE
t.ranking = '1'
35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
SELECT
sc.SId,
sc.CId,
sc.score
FROM
sc
WHERE
sc.score IN (
SELECT
score
FROM
( SELECT sc.score, count( sc.score ) AS count_people FROM sc GROUP BY sc.score ) A
WHERE
A.count_people > 1
)
ORDER BY sc.CId
36.查询每门功成绩最好的前两名
SELECT
*
FROM
(
SELECT
sc.SId,
sc.CId,
sc.score,
row_number() over ( PARTITION BY sc.CId ORDER BY sc.score DESC ) ranking
FROM
sc
ORDER BY
sc.score DESC
) A
WHERE
ranking <= 2
ORDER BY
A.CId
37.统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,
– 若人数相同,按课程号升序排列
SELECT
sc.CId,
count( 1 ) as num
FROM
sc LEFT JOIN course ON course.CId = sc.CId
GROUP BY
sc.CId
HAVING
count( 1 ) > 5
ORDER BY
count( 1 ) DESC,
sc.CId ASC
38.检索至少选修两门课程的学生学号
SELECT
st.SId
FROM
student st
LEFT JOIN sc ON sc.SId = st.SId
GROUP BY
st.SId
HAVING
count( 1 ) >= 2
39.查询各学生的年龄,只按年份来算
SELECT
Sname,
(
YEAR (
curdate())- YEAR ( Sage )) AS age
FROM
student
40.按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
SELECT
Sname,
timestampdiff(
YEAR,
Sage,
curdate()) age
FROM
student