MySQL:对于几个测试题的详细研究
最近在做MySQL作业时候遇到了很多问题,MySQL作业链接:https://www.cnblogs.com/wj-1314/p/9213885.html
所以下面谈一下稍微难一点的数据库问题,我们需要如何解决,这里一步一步的分解题目,得到答案。可能有些题目确实超出我的能力范围,希望看到的盆友能帮一下,谢谢。
首先这里总结一下几个重点。
1,上述作业要求使用SQL,不能使用视图。
2,一般来说,联表查询的效率要高于子查询,建议多使用联表查询。
一,按各科平均成绩从低到高和及格率的百分数从高到低顺序;
这道题的难点就是及格率的问题,如果只是单纯的按照各科平均成绩从低到高排序,那么很简答,如下:
select course_id,avg(score) as avg_score from score group by course_id order by avg_score asc;
结果如下:
那么及格率的百分数如何做呢,我们分析一下题目,首先是及格率,其次是百分数,
对于及格率的问题,我们的思路是 case when....then..... 简单的说一下这个,相当于三木运算,
select sum(case when score.score >60 then 1 else 0 end)/count(1) *100
from score group by course_id;
结果:
所以联立两个即可。
select course_id,avg(score) as avg_score,
sum(case when score.score > 60 then 1 else 0 end) / count(1) * 100 as percent
from score group by course_id order by avg(score) asc,percent desc;
二,课程平均分从高到低显示(显示任课老师)
首先在score中查找平均分数,并按照课程id分组,程序如下:
select course_id,avg(score) from score group by course_id;
结果:
把分数由低到高,则如下:
select course_id,avg(score) from score group by course_id order by avg(score) desc;
结果:
最后显示任课老师,这就需要连立表格了,也就是联表操作,从表格数据我们发现,以课程表为中心,联力老师,成绩表格即可,如下:
select course_id,teacher.tname,avg(score) from course
left join score on course.cid = score.course_id
left join teacher on course.teacher_id = teacher.tid
group by course_id order by avg(score) desc;
得到最终结果:
三,查询各科成绩前三名的记录(不考虑成绩并列的情况)
查询各科成绩前三名的记录(不考虑成绩并列情况) select score.sid,score.student_id, score.course_id,score.score,
t1.first_score,t1.second_score,t1.third_score
from score inner join (
select s1.sid,(select score from score as s2 where s1.course_id = s2.course_id
order by score desc limit ,) as first_score,
(select score from score as s3 where s1.course_id = s3.course_id
order by score desc limit ,) as second_score,
(select score from score as s4 where s1.course_id = s4.course_id
order by score desc limit ,) as third_score
from score as s1) as t1 on score.sid = t1.sid
where score.score in (t1.first_score,t1.second_score,t1.third_score);
上面的答案是我抄的别人的,我承认我初次接触,了解不是很深,今天就特意反思了一下,深入研究。
首先分析一下题目,这句话是什么意思? 是按人分类,每个人的各科成绩中位于自己科目成绩的前三;还是按科目分类,每科成绩前三名的人?
从下面的结果来看,是有点杂糅,我自己也有点懵逼。
但是仔细分析,确实没错,我把SQL美化一下,如下:
SELECT
score.sid,
score.student_id,
score.course_id,
score.score,
t1.first_score,
t1.second_score,
t1.third_score
FROM
score
INNER JOIN (
SELECT
s1.sid,
(
SELECT
score
FROM
score AS s2
WHERE
s1.course_id = s2.course_id
ORDER BY
score DESC
LIMIT 0,
1
) AS first_score,
(
SELECT
score
FROM
score AS s3
WHERE
s1.course_id = s3.course_id
ORDER BY
score DESC
LIMIT 1,
1
) AS second_score,
(
SELECT
score
FROM
score AS s4
WHERE
s1.course_id = s4.course_id
ORDER BY
score DESC
LIMIT 2,
1
) AS third_score
FROM
score AS s1
) AS t1 ON score.sid = t1.sid
WHERE
score.score IN (
t1.first_score,
t1.second_score,
t1.third_score
);
这下来分析,就是每一科成绩都有前三名,难点就是取每一科目的前三,这点我不是很熟悉。
四,group_concat的具体用法及其实例
group_concat函数的具体语法如下:
group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator '分隔符'] )
group_concat的基本功能是:以course_id分组,把sid字段的值在同一行打印出来,逗号分隔(默认)
如下:
select group_concat(sid) from score group by course_id;
结果:
五,case when....then的用法
case具有两种格式,简单的case函数和case搜索函数。
简单的case函数:
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
case搜索函数:
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
2种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
练习:查询班级信息,包括班级id、班级名称、年级、年级级别(12为低年级,34为中年级,56为高年级)
示例结果如下:
班级id 班级名称 年级 年级级别
1 一年一班 一年级 低
此题难点就是设置年级级别,如果忽略了这个,则查询班级信息,非常简单。如下:
select * from class;
结果:
根据上面的语法,我们使用case搜索函数,写的年级级别如下:
case
when class_grade.gid between 1 and 2 then '低'
when class_grade.gid between 3 and 4 then '中'
when class_grade.gid between 5 and 6 then '高'
else 0 end as '年级级别'
写出来后,组合即可。
select
class.cid as '班级id',
class.caption as '班级名称',
class_grade.gname as '年级',
case
when class_grade.gid between 1 and 2 then '低'
when class_grade.gid between 3 and 4 then '中'
when class_grade.gid between 5 and 6 then '高'
else 0 end as '年级级别'
from class
left join class_grade on class.grade_id = class_grade.gid;
六,MySQL中燃控函数如何实现?
MySQL中不存在类似于SQL Server或Orcal中的rank()函数来得到排名。而在实际的工作中,常常需要将查询后排序得到的排名给记录下来。由于项目需要,不仅要对成绩进行排名,而且需要相同成绩的具有相同的排名。根据网上的提供的排名方法,进一步进行扩充,得到了下面的实现方式。
链接:https://www.jianshu.com/p/bb1b72a1623e
题目:查询每门课程成绩最好的前两名学生id和姓名;
参考思路:
MySQL:对于几个测试题的详细研究的更多相关文章
- mysql的REGEXP 和like的详细研究和解释
1 regexp ^ 匹配字符串的开始部分 $ 匹配字符串的结束部分 . 匹配任何字符(包括回车和新行) a* 匹配0或多个a字符的任何序列 a+ 匹配1个或多个a字符的任何序列 a? 匹配0个或1个 ...
- MySQL配置文件my.cnf 例子最详细翻译
转的 MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记用. #BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载 ...
- 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式
单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式 一 表结构如下: 万行 CREATE TABLE t_audit_operate_log ( Fid b ...
- {MySQL的库、表的详细操作}一 库操作 二 表操作 三 行操作
MySQL的库.表的详细操作 MySQL数据库 本节目录 一 库操作 二 表操作 三 行操作 一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset utf ...
- MySQL与Oracle的语法区别详细对比
MySQL与Oracle的语法区别详细对比 Oracle和mysql的一些简单命令对比在本文中将会涉及到很多的实例,感兴趣的你不妨学习一下,就当巩固自己的知识了 Oracle和mysql的一些简单 ...
- MySQL的库、表的详细操作
目录 MySQL的库.表的详细操作 一 库操作 二 表操作 MySQL的库.表的详细操作 本节目录 一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset ...
- day 36 MySQL的库、表的详细操作
MySQL的库.表的详细操作 MySQL数据库 本节目录 一 库操作 二 表操作 三 行操作 一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset u ...
- MySQL与MariaDB核心特性比较详细版v1.0(覆盖mysql 8.0/mariadb 10.3,包括优化、功能及维护)
注:本文严禁任何形式的转载,原文使用word编写,为了大家阅读方便,提供pdf版下载. MySQL与MariaDB主要特性比较详细版v1.0(不含HA).pdf 链接:https://pan.baid ...
- MySQL如何使用索引 较为详细的分析和例子
在数据库表中,使用索引可以大大提高查询速度. 假如我们创建了一个 testIndex 表: CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name V ...
随机推荐
- shell启动执行cypher语句
1.跳转到目录:cd /data/soft/neo4j-community-not/ 2.修改配置文件:nano ./conf/neo4j.conf: 3. 登录:bin/cypher-shell - ...
- centos7通过yum安装JDK1.8
安装之前先检查一下系统有没有自带open-jdk 命令: rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 如果没有输入信息表示没有安装. ...
- Django的学习进阶(一)—— 外键的使用
一.描述 在利用django做网络开发的时候我们会遇到一个问题就是,我们建立了多张数据表,但是多张数据表中的内容是不一样的,但是之间有着联系比如: 我有两张表,一张是记录歌曲信息的内容,一张是对歌曲操 ...
- 2019.02.17 spoj Query on a tree VII(链分治)
传送门 跟QTREE6QTREE6QTREE6神似,改成了求连通块里的最大值. 于是我们对每条链开一个heapheapheap维护一下即可. MDMDMD终于1A1A1A链分治了. 代码: #incl ...
- 位图法bitmap
1.概念 1)所谓bitmap,就是用每一位(bit)来标记某个元素对应的value, 而key即是该元素,通常bitmap是一个int数组,用每一个int数的每一个bit来映射某个数据 2)由于采用 ...
- 第38章:MongoDB-集群--Replica Sets(副本集)---多机的搭建
①机器环境 182.48.115.236 master-node(主节点) 182.48.115.237 slave-node1(从节点) 182.48.115.238 slave- ...
- pycharm 如何进行全部搜索
界面里面先按ctrl F 弹出搜索页面 在搜索框内连续按两次shift shift可以搜索全文
- 安装php7.2并且整合nginx且分开部署
1.安装php 7.2 2.php配置 3.nginx配置 4.测试 5.报错与解决 6.利用upstream实现负载均衡 1.安装php 7.2 启动容器: liwangdeMacBook-Air: ...
- undo空间满的处理方法(含undo的学习与相关解释)
1.查看数据库当前实例使用的是哪个UNDO表空间: show parameter undo_tablespace 2.查看UNDO表空间对应的数据文件和大小 pages col file_name f ...
- [UWP]实现一个轻量级的应用内消息通知控件
在UWP应用开发中,我们常常有向用户发送一些提示性消息的需求.这种时候我们一般会选择MessageDialog.ContentDialog或者ToastNotification来完成功能. 但是,我们 ...