mysql练习题

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值