SQL 经典50题(题目+解答)(2)

MySQL全方位练习(学生表 教师表 课程表 分数表) 一、创建表并初始化数据 1、表说明 student(学生表)、teacher(教师表)、course(课程表)、sc(分数表) 2、创建表 //学生表create table student( sno varchar2(10) primary key, sname varchar2(20), sage number(2), ... 阅读详情

前篇(1)和后篇(3)

若有帮助欢迎点赞、收藏、评论~

题解

12、查询和“01”号同学所学课程完全相同的其他同学的学号(!)

## 好吧,网上居然有人跟我一样用这种奇葩解法(个人觉得并不严谨——万一顺序不同所求字符串就不一样了)
SELECT m.s_id
FROM (
			SELECT s_id,
						 GROUP_CONCAT(c_id) c_str
			FROM Score
			GROUP BY s_id
			) m
WHERE c_str = (SELECT GROUP_CONCAT(c_id)
							FROM Score 
							WHERE s_id = '01');

13、查询没学过"张三"老师讲授的任一门课程的学生姓名(?)

## 这题在不断调试中做出来
WITH target_course_id AS   # 满足条件的所有课程id临时表
(
SELECT c_id 
FROM Course
WHERE t_id = (SELECT t_id FROM Teacher WHERE t_name = "张三")			 
),  
target_course_cnt AS   #  满足c_id条件的计数表
(
SELECT s_id,
			 IF(c_id IN (SELECT * FROM target_course_id), 1, 0) c_id_cnt
FROM Score 
)

SELECT st.s_name
FROM Student st
JOIN 
		(SELECT m.s_id
		 FROM (
					SELECT s_id, 
								 SUM(c_id_cnt) cnt 
					FROM target_course_cnt    #  计数临时表
					GROUP BY s_id
					) m # 满足条件课程的个数
		WHERE m.cnt = (SELECT COUNT(*) FROM target_course_id)  # 满足条件的课程id临时表
		) n  # 满足条件的 学生id
ON n.s_id = st.s_id;

15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

SELECT st.s_id, st.s_name
FROM Student st
JOIN 
		(
		SELECT s_id,
					 SUM(IF(s_score < 60, 1, 0)) sum_score
		FROM Score 
		GROUP BY s_id
		HAVING sum_score >= 2
		) m 
ON st.s_id = m.s_id

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

SELECT st.s_id, st.s_name, st.s_birth, st.s_sex
FROM Student st
JOIN Score sc
WHERE sc.c_id = '01' AND sc.s_score < 60
ORDER BY sc.s_score DESC

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

SELECT sc.s_id, sc.s_score, m.avg_score
FROM Score sc
LEFT JOIN 
					(SELECT s_id,
								 AVG(s_score) avg_score
					FROM Score
					GROUP BY s_id
					) m 
ON sc.s_id = m.s_id
ORDER BY m.avg_score DESC

另解:

# 另解(会稍微有些区别)

SELECT m.s_id, m.s_score, m.avg_score
FROM 
		(
		SELECT s_id, s_score, 
					 AVG(s_score) OVER(PARTITION BY s_id) avg_score
		FROM Score 
		) m
ORDER BY m.avg_score DESC

18、查询各科成绩最高分、最低分和平均分:以如下形式显示:

– 课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
– (及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90) (!!)

# 可以说,这是目前为止,写的最为复杂的一个查询(主要是合并了太多东西)——后来发现是乌龙
## 经验:不是最外层的字段,如果不想惹麻烦就一定不要使用汉字(内层表格中可以使用英文作为别名)
SELECT c.c_id "课程ID",
       c.c_name "课程名称",
			 p.max_score "最高分数",
			 p.min_score "最低分数",
			 p.avg_score "平均分数" ,
			 q.l4_rate "及格率",
			 q.l3_rate "中等率",
			 q.l2_rate "优良率",
			 q.l1_rate "优秀率"
FROM 
		(
		SELECT c_id, 
					 MAX(s_score) max_score, 
					 MIN(s_score) min_score, 
					 AVG(s_score) avg_score
		FROM Score
		GROUP BY c_id
		) p
JOIN 
		(
		SELECT m.c_id,
					 SUM(m.l4) / COUNT(*) l4_rate,
					 SUM(m.l3) / COUNT(*) l3_rate,
					 SUM(m.l2) / COUNT(*) l2_rate,
					 SUM(m.l1) / COUNT(*) l1_rate
		FROM 
				(
				SELECT c_id, 
							 IF(s_score >= 60 AND s_score < 70, 1, 0) l4,
							 IF(s_score BETWEEN 70 AND 80, 1, 0)  l3,
							 IF(s_score BETWEEN 80 AND 90, 1, 0) l2,
							 IF(s_score >= 90, 1, 0) l1
				FROM Score	 
				) m
		GROUP BY m.c_id 
		) q  # 各种率的计算
ON p.c_id = q.c_id  #  合并p和q两张计算的表
JOIN Course c 
ON p.c_id = c.c_id

另解:

SELECT sc.c_id "课程ID", c.c_name '课程名称',
			 MAX(sc.s_score) "最高分", 
			 MIN(sc.s_score) '最低分', 
			 AVG(sc.s_score) '平均分',
			 SUM(IF(sc.s_score BETWEEN 60 AND 70, 1, 0)) / COUNT(*) '及格率',
			 SUM(IF(sc.s_score BETWEEN 70 AND 80, 1, 0)) / COUNT(*) '中等率',
			 SUM(IF(sc.s_score BETWEEN 80 AND 90, 1, 0)) / COUNT(*) '优良率',
			 SUM(IF(sc.s_score >= 90, 1, 0)) / COUNT(*) '优秀率'
FROM Score sc 
JOIN Course c 
ON sc.c_id = c.c_id 
GROUP BY sc.c_id

19、按各科成绩进行排序,并显示排名

SELECT m.s_id, m.c_id, m.s_score, rk_score
FROM 
(
SELECT *,
			 ROW_NUMBER() OVER(PARTITION BY c_id ORDER BY s_score DESC) rk_score
FROM Score
) m
ORDER BY m.rk_score

20、查询学生的总成绩并进行排名

SELECT m.s_id, 
			 m.sum_score, 
			 ROW_NUMBER() OVER(ORDER BY m.sum_score DESC) score_rk
FROM 
		(
		SELECT s_id,
					 SUM(s_score) sum_score
		FROM Score
		GROUP BY s_id
		) m 
ORDER BY score_rk

21 、查询不同老师所教不同课程平均分从高到低显示

SELECT t.t_name, c.c_name, m.avg_score
FROM 
		(
		SELECT c_id, AVG(s_score) avg_score
		FROM Score
		GROUP BY c_id
		) m  # 不同老师所教不同课程平均分
JOIN Course c 
ON m.c_id = c.c_id
JOIN Teacher t 
ON c.t_id = t.t_id
ORDER BY m.avg_score DESC

22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

SELECT st.*, c.c_name, n.s_score
FROM 
		(
		SELECT * 
		FROM
				(
				SELECT *,
							 ROW_NUMBER() OVER(PARTITION BY c_id ORDER BY s_score DESC) score_rk
				FROM Score
				) m  # 排名
		WHERE m.score_rk = 2 OR m.score_rk = 3
		) n  # 取出第二三名
JOIN Student st 
ON st.s_id = n.s_id
JOIN Course c 
ON n.c_id = c.c_id

23、使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分数段人数:课程ID和课程名称

## 做复杂了:SUM(IF)是可以当做聚合字段与GZGROUP BY 直接使用的
SELECT n.*, c.c_name
FROM (
			SELECT m.c_id,
						 SUM(m.s_score) sum_score,
						 SUM(IF(m.score_level = 'l1', 1, 0)) l1_cnt,
						 SUM(IF(m.score_level = 'l2', 1, 0)) l2_cnt,
						 SUM(IF(m.score_level = 'l3', 1, 0)) l3_cnt,
						 SUM(IF(m.score_level = 'l4', 1, 0)) l4_cnt
			FROM 
					(
						SELECT s_id, c_id, s_score,
									CASE
												WHEN s_score BETWEEN 85 AND 100 THEN 'l1'
												WHEN s_score BETWEEN 70 AND 85 THEN 'l2'
												WHEN s_score BETWEEN 60 AND 70 THEN 'l3'
												ELSE 'l4'
									 END score_level
						 FROM Score
						 ) m
			GROUP BY m.c_id
			) n # 满足条件的课程分组 c_id 及其它信息
JOIN Course c 
ON n.c_id = c.c_id  # 获取课程名称c_name

24、查询学生平均成绩及其名次

SELECT m.*, ROW_NUMBER() OVER(ORDER BY m.avg_score DESC) rk_score  # 要理清层次和先后顺序
FROM 
(
SELECT s_id, AVG(s_score) avg_score
FROM Score
GROUP BY s_id
) m

25、查询各科成绩前三名的记录(不考虑成绩并列情况)

SELECT m.*
FROM
		(
		SELECT sc.c_id, c.c_name, sc.s_id, 
					 ROW_NUMBER() OVER(PARTITION BY sc.c_id ORDER BY sc.s_score DESC) rk_score
		FROM Score sc
		JOIN Course c 
		ON sc.c_id = c.c_id
		) m
WHERE m.rk_score <= 3

26、查询每门课程被选修的学生数

SELECT c.c_name, m.cnt_course
FROM
		(
		SELECT c_id, COUNT(s_id) cnt_course
		FROM Score
		GROUP BY c_id
		) m
JOIN Course c
ON m.c_id = c.c_id

27、查询出只有两门课程的全部学生的学号和姓名

SELECT DISTINCT st.s_id, st.s_name   # 注意去重复(窗口函数不去重)
FROM 
		(SELECT m.*   # 注意子查询的层级关系
		 FROM
				(
				SELECT *, 
							 COUNT(c_id) OVER(PARTITION BY s_id) cnt_course
				FROM Score
				) m 
		WHERE m.cnt_course = 2
		) n
JOIN Student st
ON st.s_id = n.s_id

另解:直接使用聚合函数即可

SELECT st.s_id, st.s_name
FROM 
		(
		SELECT s_id, COUNT(c_id) cnt 
		FROM Score
		GROUP BY s_id
		HAVING cnt = 2
		) m 
JOIN Student st 
ON m.s_id = st.s_id 

28、查询男生、女生人数

## 使用条件语句(有点想复杂了)
SELECT SUM(IF(s_sex = "男",1 ,0)) cnt_male,
			 SUM(IF(s_sex = "女",1, 0)) cnt_female
FROM Student
# 另解:直接GROUP BY(如果不需要知道对应对象时)
SELECT COUNT(s_id) cnt
FROM Student 
GROUP BY s_sex

29、查询名字中含有"风"字的学生信息

SELECT *
FROM Student
WHERE s_name LIKE "%风%"

31、查询1990年出生的学生名单

SELECT s_name
FROM Student
WHERE s_birth LIKE '%1990%'
## 另解
SELECT s_name
FROM Student
WHERE YEAR(s_birth) = '1990'
2022年SQL经典面试题总结(带解析) 吐血整理了一周SQL面试题,包括了选择题、问答题、实战题。每道题都给大家加了详细的解析。几乎每个知识点都涉及到了。刷完这套题,关于SQL的面试妥妥的。题目来源:各大厂面试题、牛客网1、要求删除商品表中价格大于3000的商品,下列SQL语句正确的是()A、DELETE FROM 商品 WHERE 价格>3000 B、DELETE * FROM 商品 WHERE 价格>3000 C、DELETE FROM 商品 D、UPDATE 商品 SET * =NULL WHERE 价格>30002、在book表中,将工具 阅读详情

相关推荐

SQL基础题型(内含数据库和答案),帮你更加熟练运用SQL

下面分享关于SQL的题目,包括数据库和答案解析。希望对大家有帮助。

m0_57448314的博客 2888

50道SQL练习题及答案与详细分析

50道SQL练习题及答案与详细分析

向上的"狼"的博客 5877

SQL 经典50题(题目+解答)(1)

SQL 经典50题(题目+解答)(1)

Robin_Pi的博客 1万+

常见的SQL面试题:经典50题(附详解)

已知有如下4张表: 学生表:student(学号,学生姓名,出生年月,性别) 成绩表:score(学号,课程号,成绩) 课程表:course(课程号,课程名称,教师号) 教师表:teacher(教师号,教师姓名) 根据以上信息按照下面要求写出对应的SQL语句。 ps:这些题考察SQL的编写能力,对于这类型的题目,需要你先把4张表之间的关联关系搞清楚了,最好的办法是自己在草稿纸上画出关联图,然后再编...

q_1092535160的博客 1万+

SQL笔试经典50题及答案解析(题目21-30)

前言 最近博主在准备数据分析岗位的笔试和面试,其中的考察重点就是SQL。听说练了这50道题目,什么现场手撕SQL统统都不怕,我就赶紧来练习了!壮士们,练完以后就什么都不怕啦~ 环境: Navicat Premium 12 说明: 本篇练习的是题目21-30,其余参考链接 文章目录创建表表说明表创建表显示题目题目21题目22题目23题目24题目25题目26题目27题目28题目29题目30 创建表 表...

weixin_43890183的博客 3951

Mysql经典50题--第一弹

在初学时期看到了大家都在发的Mysql经典50题,做过一遍之后的第二次回顾

查数菇乐园 5634

SQL经典50题 | 附答案

大家好,我是宝器! 今天给大家分享一份星友对SQL经典面试50题的刷题记录,宝器稍作了一些修改,以下是星友自述正文: 看完了SQL基础教程,然后再看SQL进阶教程感觉有些不是很懂,于是就开始刷题熟悉⼀下基础知 识,找了⽐较经典的很多⼈都刷过的SQL⾯试50题,B站也有挺好的视频解答,看题先⾃⼰做,不会就看视频解答,感觉难题都在前⾯。 刚开始基本是边看边做,慢慢后⾯简单了,基本能⾃⼰先做了再看,断断续续终于刷完了全部题⽬,重新梳理⼀遍看看知识点,分享⼀下刷题的代码,视频基本讲解很清楚了...

茹茹的博客 2万+

通义千问AI模型对接飞书机器人-集成飞书机器人(2-2)

http请求地址上一篇百炼平台配置的应用地址。

hefaji的博客 1916

MySQL 经典练习 50 题(完美解答版)

MySQL 经典练习 50 题(完美解答版)创建数据库和表数据库学生表课程表教师表成绩表表关系经典练习 50 题1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩(包括有成绩的和无成绩的)5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩6、查询"李"姓老师的数量7、询学过"张三"老师授课的同学

GodSuzzZ的博客 17万+

手把手教你安装 Vivado2019.2(附安装包)

Vivado 2019.2 作为 Xilinx 公司发布的一款设计套件版本,具有多个显著的优点,以下是对其优点的详细归纳

dpwkj的博客 1万+

手把手教你用Apple Developer App完成苹果开发者账号注册(含证件验证失败解决方案)

本文详细指导如何通过Apple Developer App完成苹果开发者账号注册,特别针对证件验证失败问题提供解决方案。从准备工作到注册流程,再到验证失败的处理方法,帮助开发者顺利完成注册,避免常见错误。

moss5的博客 1160

深夜小酌,50道经典SQL题,真香~

蹲坑之余,在网上找到了50道所谓经典SQL题,这不就是深夜必备小菜?我用脚叼起拖鞋,从冰箱拿出封印已久的半瓶可乐,打开数日未见的MySQL8,来吧,来场说卷就卷的刷题。

陈哈哈的菜园子 6223

深入解析EXI协议在ISO15118-2命令测试中的编解码实践

本文深入探讨了EXI协议在ISO15118-2车桩通信标准中的关键作用与实践方法。EXI编解码测试是确保通信准确性与效率的核心环节,文章详细介绍了从搭建测试环境、选择工具库到编写完整测试代码的全过程,并分析了结果差异的常见原因与调试技巧,为电动汽车充电系统的开发者提供了实用的技术指南。

potato的博客 1048

SQL 经典50题(题目+解答)(3)

SQL 经典50题(题目+解答)(3)

Robin_Pi的博客 5262

手把手教你学Simulink——机器人力控场景实例:基于Simulink的永磁同步电机重力补偿力矩控制仿真

本文介绍了基于Simulink的机器人重力补偿力矩控制仿真方法。针对机器人悬停时电机发热、抖动等问题,提出通过前馈补偿重力转矩的解决方案。文章详细阐述了从机器人动力学建模、重力补偿计算、PMSM转矩控制到系统集成的完整实现流程,并以2-DOF机械臂为例验证了补偿效果。结果表明,重力补偿能显著降低电机电流和拖拽力,提高系统柔顺性。文中还提供了高级功能扩展方向,如参数辨识、摩擦补偿等,为实际工程应用提供了参考框架。

MHD0815的博客 154

5.1 rocr-runtime libhsakmt event 机制全景—从 Doorbell 到 Signal

本文介绍了ROCm/KFD中的Event机制架构,主要解决GPU异步计算中的反馈问题。Event机制分为三层:硬件层触发事件,内核层管理事件通知,用户态接收处理。事件类型分为三大类:同步类事件(如SIGNAL、QUEUE_EVENT)用于任务完成通知,异常类事件(如MEMORY、HW_EXCEPTION)报告错误,拓扑类事件(如NODECHANGE)处理设备变更。该机制通过共享内存和中断实现高效通信,避免CPU轮询开销。后续文章将深入内核实现、Thunk层封装和多队列完成检测实战。

图形/计算GPU的驱动与虚拟化技术分享园地 1307

SQL经典面试50题 | 附答案

大家好,我是宝器!今天给大家分享一份星友对SQL经典面试50题的刷题记录,宝器稍作了一些修改,以下是星友自述正文:看完了SQL基础教程,然后再看SQL进阶教程感觉有些不是很懂,于是就开始...

weixin_44747933的博客 5735

基于Qt C++开发一套大疆农业无人机的AI飞控系统

如果需要补充**多机协同作业代码**、**农田测绘数据导出**、**作业数据统计大屏**或**移动端地面站适配**功能,可以告知具体需求,我会针对性完善。"开启" : "关闭") << "喷洒,流量:" << flowRate << "L/min";emit errorOccurred(QString("SDK初始化失败,错误码:%1").arg((int)ret));report += QString("问题区域数量:%1\n").arg(info.problemAreas.size());

寒寒豆豆软件公司的博客 382

SQL经典50题练习

SQL这套50题在网上流传很广,是比较经典、全面的一套题,最近刚入职数据开发工程师,SQL需要加强,因此自然不能错过这套题,答案都是自己写的,有错误或者可以改进的地方欢迎指出。 数据表介绍 题中所需数据来自四个表,分别是学生-成绩-课程-老师,此处列出四个表的字段与关联图 创建表及插入数据 学生表Student create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10)); i

weixin_43348955的博客 1万+

1小时读完100篇文献的正确打开方式

各位同仁好,我是七哥。一个在高校里从事人工智能 相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude 等大模型 学术实操相关问题,多多交流,相互成就,共同进步。文献阅读与整理一般都是最先开始、却也最容易被低估的一步。很多学术同仁一开始就陷入越读越多、越读越乱的状态:论文下载了一大堆,但真正能用来支撑自己观点的内容却始终难以提炼出来。一方面,我们需要通过文献了解该研究领域的整体发展脉络,把握当前学界已经讨论到什么程度;

智能AI让学术科研更容易 49

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SQL练习——经典50题

mysql50题练习,包含数据和解答

小雨不冷的博客 9853

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SQL面试必会50题(含答案和学习链接)

最近在刷 sql 题,刷完了网上的 SQL 面试必会 50 题,现把我的答案和思路整理如下,供大家参考。 这是目录一、创建四张表二、SQL面试必会50题(不含答案)三、SQL面试必会50题(含答案)四、学习资料 一、创建四张表 如图,以上学生表、成绩表、课程表、教师表是我们所有题目的基础表,创建的语句如下: --学生表 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s_bir.

欢迎来到小丁的技术空间 3万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SQL 经典 50 题

SQL 经典 50 题 引言 SQL 是一门基础简单、语法通俗易懂的语言。但是想要灵活应用 SQL,使其能够达到随心所欲的境界就需要大量的练习。下面这50道问题是十分经典的题目,全部练习之后会使你的 SQL 语句编写能力更上一个台阶。加油吧! 注:博主是使用的 MySQL8 练习的题目,大家自行练习时要注意和自己的数据库版本进行对应哦。 创建数据库 DROP TABLE IF EXISTS `Course`; CREATE TABLE `Course` ( `C` varchar(10) CHARAC

海纳百川 1275

互联网校招SQL笔试经典50题及答案解析

互联网校招SQL笔试经典50题及答案解析TOMOCAT​南开大学 应用统计硕士86 人赞同了该文章练习前的准备1、SQL环境搭建https://www.jianshu.com/p/edca5142391c2、建表语句create table Student(sid varchar(10),sname varchar(10),sage datetime,ssex nvarchar(10)); ins...

qq_35854212的博客 3521
上一篇: SQL 经典50题(题目+解答)(1)
下一篇: SQL 经典50题(题目+解答)(3)
Robin_Pi
博客等级 码龄9年 2万+粉丝 632原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值