博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle数据库之分组查询(转)
阅读量:5917 次
发布时间:2019-06-19

本文共 2997 字,大约阅读时间需要 9 分钟。

  本章内容和大家分享的是数据当中的分组查询。分组查询复杂一点的是建立在多张表的查询的基础之上,(我们在上一节课的学习中已经给大家分享了多表查询的使用技巧,大家可以自行访问:  )而在实际项目中的分组查询的使用也是比较多的,作为初学者来说,学好分组查询的姿势是十分有必要的!

分组查询概念

什么是分组查询:分组查询是按照一定的规则进行分组,分组以后数据会聚合,需要使用聚合函数,但是使用聚合函数不一定要分组,分组的关键字是group by。

首先,我们先来思考一下下面的sql语句的正确性:

---1.select * from t_student group by sex;     ---按照性别分组  男或者女  但是实际显示的是所有性别,*是所有 所以会报错,因为这种方式不是group by 表达式

查看结果:

---2.select sex from t_student;               ---这种方式最后显示的是所有的男女,也不是分组我们想要的 男 女  数据

查看结果:

---3.select t.studentid,t.sex from t_student t group by sex;  --6条id数据对应2条数据 不是group by表达式

查询结果:

---4.select sex from t_student group by sex;---按照性别分组,只显示性别没有任何毛病--成功

查看结果:

我们看一下聚合函数的使用,聚合函数有count()  sum()  max()  min()  avg()  round() 

--聚合函数count() ---统计sum()   ---求和max()   ---最大值min()   ---最小值avg()   ---平均值round() ---四舍五入函数

 下面小编给大家演示一下关于这些聚合函数的基础操作,有助于我们后面的分组使用:

select max(age) from t_student;--求年龄的最大值select count(studentid) from t_student;--求学生总数select sum(studentid) from t_student;--所有学生id的和select min(studentid) from t_student; --求学生id中的最小值select avg(studentid) from t_student;--求学生id的平均值

再议聚合函数:

select sex,sum(age) from t_student group by sex;--以性别分组,显示性别中的男女年龄的之和

查看结果:

select sex,count(studentid) from t_student group by sex;--以学生性别分组,显示男生和女生分别有多少?

 查看结果:

select sex,max(age) from t_student group by sex;--以性别分组,显示男生中年龄最大的和女生中年龄最大的。

 查看结果:

ok,我们通过上面的例子来继续练习一下分组查询。 

 --统计706班男生,女生人数?

select sex,count(t2.studentid) from t_class t1,t_student t2 where t1.classid=t2.classid and t1.classid=1group by sex;

查询结果:

--查询826班男生、女生年龄的总和

select sex,sum(t2.age) from t_class t1,t_student t2 where t1.classid=t1.classid and t1.classid=3 group by sex;

 查看结果:

--查询每门课程的总分、最高分、最低分、平均分

--查询每门课程的总分、最高分、最低分、平均分select t1.coursename 课程名字,max(t2.score)最高分,min(t2.score)最低分,avg(t2.score)平均分 from t_course t1,t_score t2 where t1.courseid=t2.courseidgroup by t1.coursename;

查看结果:

--查询826班每位学生每门课程的总分、平均分、最高分、最低分

select t3.coursename 课程名字,t2.name 学生姓名,       sum(t4.score) 总分,       avg(t4.score) 平均分,       max(t4.score) 最高分,       min(t4.score) 最低分  from t_class t1, t_student t2, t_course t3, t_score t4 where t1.classid = t2.classid   and t2.studentid = t4.studentid   and t4.courseid = t3.courseid   and t1.classid = 3 group by t3.coursename,t2.name;

查看结果:

--查询每个学员的总分、平均分、最高分、最低分,只显示总分在250分以上的学员

敲笔记了哈:

1.where 使用在分组查询之前,where后面不能使用聚合函数

2.having 分组之后的过滤,having 紧跟group by ,有having 一定有group by ,但是有group by 不一定有having  

3.having 后面可以使用聚合函数 

--显示姓名 select t1.name 学生姓名,       sum(t2.score) 总分,       avg(t2.score) 平均分,       max(t2.score) 最高分,       min(t2.score) 最低分  from t_student t1, t_score t2 where t1.studentid = t2.studentid group by t1.name having sum(t2.score)>250;

查看结果:

另外的一种展示结果:

--不显示性名select sum(t2.score) 总分,       avg(t2.score) 平均分,       max(t2.score) 最高分,       min(t2.score) 最低分  from t_student t1, t_score t2 where t1.studentid = t2.studentid group by t1.studentidhaving sum(t2.score) > 250;

查询结果:

 

到此,分组查询我们就介绍到这里了。。。

 

作者:丨Fighter.Lu丨 点滴记录,开源共享。帮助更多有需要的人解决问题!博主博客地址:http://www.cnblogs.com/fighter007/

转载于:https://www.cnblogs.com/qdck/p/10843130.html

你可能感兴趣的文章
Windows server 2003 FTP 全攻略(二)
查看>>
用户管理脚本之删除用户——Delete_user.sh
查看>>
007 content for
查看>>
性能监控之日志监控部分
查看>>
前端重构实践(二) —— 模块化开发
查看>>
ssh 与 locale
查看>>
使用makecontext实现用户线程【转】
查看>>
Ext.Net学习笔记05:Ext.Net DirectEvents用法详解
查看>>
【译】使用C# yield关键字来提高性能和可读性
查看>>
将Flash 嵌入WPF 程序
查看>>
大数据影响人类认知和行为习惯
查看>>
《自己动手做交互系统》——2.3 制作过程
查看>>
《Android NFC开发实战详解》——6.2节Android NFC P2P开发基础
查看>>
保存138亿年?!5维磁盘在南安普顿大学研制成功
查看>>
notepad++ 使用
查看>>
react的生命周期有哪些?有什么需要注意的地方?
查看>>
闭包 !if(){}.call()
查看>>
关闭CentOS6启动进度条,显示详细自检信息
查看>>
垂直居中的几种实现方法
查看>>
结构体中的vector不能memset为0
查看>>