文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

数据库中group by的用法实例

2024-12-03 10:49

关注

如图有这样一张成绩表:

首先要理解group by 含义:“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。

先来看这样一条sql语句:select  subject,max(score) from grade GROUP BY subject

结果是:

这样正确的得出了每一科的最高分以及科目的名称。那是不是再在后面加个name就可以得出对应的学生的名字呢?我们可以试试:select  subject,max(score),name from grade GROUP BY subject

一看有结果以为成功了,但是对比数据后发现是错的,学生姓名和分数没对应上。如果你认为是成功的是因为对group by理解的不够,我也不知道这样查询为什么能出来结果,我使用的mysql数据库,如果是oracle的话就会报错。

注意:因为在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。

所以这样是错误的。

group by语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中,常见的聚合函数如下表:

函数 作用 支持性
sum(列名) 求和  
max(列名) 最大值  
min(列名) 最小值  
avg(列名) 平均值  
first(列名) 第一条记录 仅Access支持
last(列名) 最后一条记录 仅Access支持
count(列名) 统计记录数 注意和count(*)的区别

我们还是分析要求,通过要求来写sql语句。

这里提供几种方法:

我们已经通过group by分组来获得每一科的最高分以及科目名称,把它作为第一句sql,,然后再查询一下score表,找到学科和分数都相同的记录:(子sql语句作为主sql语句的一部分)

#a.* 表示a表中所有的字段,b.*表示b表中所有的字段

select b.* from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

结果如下:

对比发现数据是对的。

拓展问法:用一句SQL查出所有课程成绩最高和最低的学生及其分数。

首先,通过分组获得每个学科的最高分以及最低分:

select  subject,max(score),MIN(score) from grade GROUP BY subject

结果如下:

那我们如何把最高分对应的学生名字和最低分对应的名字放入呢,而且要求的数据展示是最高分一行,最低分一行。所以这样行不通。

通过上面的第一个问题得出的思路:

select b.* from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

这样既然能得到每个学科的最高分,学生名字,学科名,那同样把max(score)改成min(score)不就可以获得最低分,学生名字,学科名字了吗?现在重点是如何把两条sql语句查询出来的结果整合到一起。

select b.* from (select subject,min(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

此时想到了sql的关键字 :    UNION的定义

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

所以得出的sql是这样的:

select b.* from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score UNION

select b.* from (select subject,min(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

得出的结果是:

这样就ok了。如果还想添加一些东西。例如添加一列说明这个分数是最低分或者最高分。

select b.*,"最高分" from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score 

UNION

select b.*,"最低分" from (select subject,min(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

 

 

来源:田林家园内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯