sql-50练习题16-20

sql-50练习题16-20

  • 前言
  • 数据库表结构介绍
  • [1-6 检索"01"课程分数小于60,按分数降序排列的学生信息](#1-6 检索"01"课程分数小于60,按分数降序排列的学生信息)
  • [1-7 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩](#1-7 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩)
  • [1-8 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率](#1-8 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率)
  • [1-9 查询学生的总成绩并进行排名](#1-9 查询学生的总成绩并进行排名)
  • [2-0 查询学生的总成绩并进行排名](#2-0 查询学生的总成绩并进行排名)

前言

sql真的非常灵活,一个题目可能有很多很多种解法,我记录的只是我自己的一个解题思路,如果大家有更好的不同解法欢迎在评论区一起探讨

ps:有些题可能解法会重复,比如求大于,我们下一个题可能是求小于,大家如果第一遍没有做出来,看了我写的之后有了思路,可以试一下反面的解法。

数据库表结构介绍

学生表

课程表

成绩表

教师表

1-6 检索"01"课程分数小于60,按分数降序排列的学生信息

sql 复制代码
SELECT
	a.*, b.c_id,
	b.s_score
FROM
	student a,
	score b
WHERE
	a.s_id = b.s_id
AND b.c_id = '01'
AND b.s_score < 60
ORDER BY
	b.s_score DESC;

结果如下:

1-7 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

sql 复制代码
SELECT
	a.s_id,
	(
		SELECT
			s_score
		FROM
			score
		WHERE
			s_id = a.s_id
		AND c_id = '01'
	) AS 语文,
	(
		SELECT
			s_score
		FROM
			score
		WHERE
			s_id = a.s_id
		AND c_id = '02'
	) AS 数学,
	(
		SELECT
			s_score
		FROM
			score
		WHERE
			s_id = a.s_id
		AND c_id = '03'
	) AS 英语,
	round(avg(s_score), 2) AS 平均分
FROM
	score a
GROUP BY
	a.s_id
ORDER BY
	平均分 DESC;

结果如下:

1-8 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率

-- round 函数主要是进行数值的小数点保留

-- 1、round(x,d) x指要处理的数,d是指保留几位小数。这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0;

-- 2、round(x) ,其实就是round(x,0),也就是默认d为0;

sql 复制代码
SELECT
	a.c_id,
	b.c_name,
	MAX(s_score),
	MIN(s_score),
	AVG(s_score),
	ROUND(
		100 * (
			SUM(
				CASE
				WHEN a.s_score >= 60
				AND a.s_score <= 90 THEN
					1
				ELSE
					0
				END
			) / SUM(
				CASE
				WHEN a.s_score THEN
					1
				ELSE
					0
				END
			)
		),
		2
	) AS 及格率,
	ROUND(
		100 * (
			SUM(
				CASE
				WHEN a.s_score >= 70
				AND a.s_score <= 80 THEN
					1
				ELSE
					0
				END
			) / SUM(
				CASE
				WHEN a.s_score THEN
					1
				ELSE
					0
				END
			)
		),
		2
	) AS 中等率,
	ROUND(
		100 * (
			SUM(
				CASE
				WHEN a.s_score >= 80
				AND a.s_score <= 90 THEN
					1
				ELSE
					0
				END
			) / SUM(
				CASE
				WHEN a.s_score THEN
					1
				ELSE
					0
				END
			)
		),
		2
	) AS 优良率,
	ROUND(
		100 * (
			SUM(
				CASE
				WHEN a.s_score >= 90 THEN
					1
				ELSE
					0
				END
			) / SUM(
				CASE
				WHEN a.s_score THEN
					1
				ELSE
					0
				END
			)
		),
		2
	) AS 优秀率
FROM
	score a
LEFT JOIN course b ON a.c_id = b.c_id
GROUP BY
	a.c_id

结果如下:

1-9 查询学生的总成绩并进行排名

sql 复制代码
SELECT 
    b.*, a.c_id, a.s_score, 
    (SELECT COUNT(DISTINCT a2.s_score) 
     FROM score a2 
     WHERE a2.c_id = a.c_id AND a2.s_score >= a.s_score) AS rk
FROM 
    score a
JOIN student b ON a.s_id = b.s_id;

结果如下:

2-0 查询学生的总成绩并进行排名

sql 复制代码
SELECT
	suma.*, (
		SELECT
			count(avgscore)
		FROM
			(
				SELECT
					a.s_id,
					avg(a.s_score) avgscore
				FROM
					score a
				GROUP BY
					a.s_id
			) sumb
		WHERE
			suma.avgscore < sumb.avgscore
	) + 1 rk
FROM
	(
		SELECT
			a.s_id,
			avg(a.s_score) avgscore
		FROM
			score a
		GROUP BY
			a.s_id
	) suma
ORDER BY
	rk ASC

结果如下:

相关推荐
Wang's Blog1 小时前
Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
数据库·redis
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO1 小时前
MySQL事务
数据库·mysql
coderWangbuer1 小时前
基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)
spring boot·后端·sql
数据龙傲天2 小时前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
engineer-gxd3 小时前
MySQL 表的操作
mysql
cyt涛3 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Rookie也要加油3 小时前
01_SQLite
数据库·sqlite
liuxin334455663 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
与衫4 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql
看山还是山,看水还是。4 小时前
MySQL 管理
数据库·笔记·mysql·adb