聚合分析和分组

SQL提供了一些列的聚集函数对表中的数据进行统计分析,在SQL中可以使用分组命令将列中的数据按照一定的条件进行分组。一般只将聚合函数作用在满足条件的分组上。因此聚合函数与分组命令一般结合使用.常见的聚合函数有sum(),max(),min( ),avg( ),count( )

1、sum( column_name)

求某列的所有非空数值之和

eg1:求所有女教师的工资总和

结果:

2、count(*)和count(column_name)

查询结果:

从这个结果分析:count(*)执行求出的是表的总行数(包括有null值的行),而count(column_name)计算的是这一列中非null数据的行数。此外count可以对进行连接操作后的列进行计数操作,有连接运算符一节可以知道只要参与连接的列中有一列为null,则连接的结果都为null。count对连接后的列进行计数,同样不包括列值为null的行在内。因此上述查询结果的后面两列的行数均为8.

2、最大/最小值函数max( )/min( )

注意:

SQL不支持如下的select语句:

理由:聚合函数处理的是数据组,在这里max()和avg()函数都是将这个表看成一组,而tname,tsex都没有进行分组。上面两个不正确的例子中第二个例子可以改写为子查询的方式来返回最大值。代码如下:

说明:

  • max( ),min( )函数还可以用于字符型数据,时间型数据。例如

  • 确定最大值(最小值)时,max()或者min()函数都会忽略null值,但是如果在该列中,所有行的值都是null,则max()或者min()函数将返回null

3、avg()函数

eg1:avg()函数对null值的处理

从teacher表中查询所有教师的平均工资

查询结果:

由上述结果可以知道,avg()函数将忽略null列的值,将总的数值数除以非空行数,得到平均值。

eg2:用where子句来限制用于计算平均值的行

从teacher表中查询所有计算机系的教师的平均年龄

计算结果:

为什么能够有条件的计算平均值?

--------这与select语句的执行顺序是分不开的。where子句在select子句之前执行,排出了不符合条件的行,剩下的行才参与avg()函数的计算。

4、组合查询

(1)分组的语法:

select column,sum(column)

from teacher

group by column

eg1:从teacher表中查询男教师和女教师的平均工资

查询结果:

(2)group by 根据多个字段进行分组,

eg2:

查询结果:

(3)rollup运算符(略)

(4)cube运算符(略)

(5)group by 对null值的处理

group by子句将所有null值作为一组,也就是说在group by子句中认为null和null的值是“相等”的

eg:

查询结果:

从结果可以看出,工资为null的被分为一个组做统计

(6)having子句

  • 当having子句和group by子句在一起使用时,having子句用于对group by 分组后的各个组进行筛选,去除掉每个分组中不符合having子句条件的分组。

eg:从teacher表中查询至少有两位老师的系及教师人数。实现代码:

执行结果:

  • having子句和where子句都是用于筛选,两者的异同

-------第一,如果查询语句中有group by 子句,则having子句只能作用于group by 分成的各个分组

第二,如果没有group by 子句,有where子句的输出,并把这个输出作为一个分组

第三,如果既没有group by子句,也没有where子句,那么having子句作用与from子句的输出,并将这个输出作为一个分组。

这三点和前面谈到的select语句执行顺序有关http://blog.csdn.net/qinyushuang/archive/2010/12/31/6109037.aspx

综上,where子句只可以作用域select语句,而having子句可以作用于group by ,where子句,select子句的输出,具体作用于哪个子句,就上上面所说的三点说明。

eg1:

从teacher表中查询有女教师的系,及其拥有女教师的数量

执行结果:

eg2:一个错误的例子

执行出错,原因:包括在having子句中的列必须是分组的列

eg3:having子句作用where子句的一个例子

执行结果:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结