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

结果如下:

相关推荐
The_Ticker25 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
Elastic 中国社区官方博客31 分钟前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
企鹅侠客35 分钟前
ETCD调优
数据库·etcd
Json_1817901448042 分钟前
电商拍立淘按图搜索API接口系列,文档说明参考
前端·数据库
煎饼小狗1 小时前
Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)
数据库·redis·缓存
永乐春秋1 小时前
WEB-通用漏洞&SQL注入&CTF&二次&堆叠&DNS带外
数据库·sql
打鱼又晒网2 小时前
【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析
数据库·mysql
大白要努力!2 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
tatasix3 小时前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。3 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库