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

结果如下:

相关推荐
影子240119 小时前
java jdbc连接sqlserver2008R2版本数据库报错,驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接
java·数据库·ssl
0_0梅伊阁诗人20 小时前
Django ORM 模型
开发语言·数据库·笔记·python·oracle·django
倔强的石头10620 小时前
Windows系统下KingbaseES数据库保姆级安装教程(附常见问题解决)
数据库·windows
躲在云朵里`20 小时前
Redis深度解析:核心数据结构、线程模型与高频面试题
数据结构·数据库·redis
m0_4538068720 小时前
【已解决】mongoose在mongodb中添加数据,数据库默认复数问题
数据库·mongodb
非凡ghost20 小时前
AOMEI Partition Assistant磁盘分区工具:磁盘管理的得力助手
linux·运维·前端·数据库·学习·生活·软件需求
恣艺20 小时前
Redis是什么?一篇讲透它的定位、特点与应用场景
数据库·redis·缓存
天天爱吃肉821821 小时前
【比亚迪璇玑架构深度解析:重新定义智能电动汽车的“整车智能”】
数据库·人工智能·嵌入式硬件·架构·汽车
一成码农21 小时前
MySQL问题8
数据库·mysql
axban21 小时前
QT M/V架构开发实战:M/V架构的初步认识
开发语言·数据库·qt