8. 分组和组函数

        组函数即《数据库函数》中提到的多行函数。每组记录作为整体计算,并返回一个结果,而不是每条记录返回一个结果。

常用的5个组函数:(以下expr均可以是变量、常量、数据列,无特别说明则数据类型可为任意类型)

AVG([DISTINCT|all] expr):计算多行expr的平均值,数据类型:数值型。

DISTINCT:不计算重复值;all(省略时效果相同):需要计算重复值。

COUNT(*|[DISTINCT|all]expr,[expr...]):计算多行expr的总条数

*:统计该表内的记录行数;distinct:不计算重复值。

MAX(expr)、MIN(expr):计算多行expr的最值

SUM([DISTINCT|all] expr):多行expr的总和,数据类型:数值型

Note:

  • distinct 和 * 不能同时使用。
  • 组函数默认把所有记录当成一组,可使用group by显示分组。
  • group by当一列或多列的值完全相同时,才把这些记录当成一组。
  • group by 时 null也算一组,默认升序。
  • 很多数据库分组有严格规则,如果查询列表使用了组函数或select使用group by分组,则要求出现在select的字段,要么用组函数包起来,要么必须出现在group by子句中。因为组函数或group by都将导致只有一条输出,而系统无法确定输出哪条。【但MySQL没有这些规则,会输出该组的第一条记录】

分组过滤having

  1. having子句后是条件表达式,满足该表达式的分组才会被选出来。
  2. 和where子句的区别:
  • where子句仅过滤行,过滤组必须用having子句;
  • where子句中不能使用组函数,having才可以;

# 多行expr的平均值

SELECT

    AVG(ALL `level`)

FROM

    student;

 

#COUNT,多行expr的总条数,不考虑null

SELECT

    # COUNT(*) # 表中记录条数

    # COUNT(DISTINCT `level`) # level列有多少个不同的值

    COUNT(DISTINCT age, `level`) # age、level不为null,且不同时相等的行数 

    # COUNT(DISTINCT*)# DISTINCT和*不能共用,会报异常

FROM

    student;

 

# SUM(expr)

SELECT

    # SUM(`level`) #
`level`数值列的和

    # expr是常量2,所以每行值都相同

    # so近似理解为行数的2倍,即n*COUNT(*)

    # SUM(2)

    SUM(DISTINCT 2) #每行都是2,再去重,故值为2

FROM

    student;

 

# MAX(expr)、Min()

SELECT

    MAX(id) #id列的最大值9

FROM

    student;

 

# 统计时对null的处理

SELECT

    AVG(IFNULL(`level`,0)) #不仅仅是简单的赋值,还增加了计算的列数

FROM

    student;

 

# GROUP BY显式分组,多列参数同时相等才算一组

# null也算一组

SELECT

    NAME,

    # name显示的是当前组的第一个字段(与升降序无关)

    sex,

    `level`,

    COUNT(*)

FROM

    student

GROUP BY

    # `level` DESC; # 降序

    LEVEL,

    sex;

 

# having过滤组

SELECT

    sex,

    LEVEL,

    COUNT(*)

FROM

    student

GROUP BY

    sex # 按sex分组

HAVING

    # 要求不重复level数量大于等于3的组(此处结果只有女生组)

    count(DISTINCT `level`)>=3;

 

时间: 2024-09-10 04:42:26

8. 分组和组函数的相关文章

Oracle分组与组函数

一.求和与求平均 1.什么是组函数 组函数就是我们前面我说过的多行函数.它主要针对表进行操作.因为只有表中,才有多行数据.下面我们以SUM和AVG这两个组函数为例,先从它们开始,介绍组函数的特性. 2.SUM 求和函数 gyj@OCM> select sum(salary) from t1; SUM(SALARY) ----------- 315888 ORACLE在执行SUM()函数时,会从SALARY列取出每一行,把结果累加到一起.我们在讲单行函数和多行函数时就说过,对于单行函数,将列中每一

6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

 1组函数 avg(),sum(),max(),min(),count()案例: selectavg(sal),sum(sal),max(sal),min(sal),count(sal) from emp / 截图: 2 组函数和null在一起 案例:求员工的平均奖金 错误sql: select avg(comm) 方式1,sum(comm)/count(comm)方式2,sum(comm)/count(*) 方式3 from emp; 截图: 错误原因: select count(comm

PL/SQL单行函数和组函数详解

函数|详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 组函数 本文将讨论如何利用单行函数以及使用规则. SQL中的单行函数 SQL和PL/SQL中自带很多类型的函数,有字符.数字.日期.转换.和混合型等多种函数用于处理单行数据,因此这些都可被统称为单行函数.这些函数均可用于SELECT,WHERE.ORDER BY等子句中,例如下面的例子中就包含了TO_CHAR,UPPER

Oracle常用sql语句(二)之组函数、多表查询

DML(数据操纵语言) INSERT .UPDATE. DELETE 插入操作:INSERT: 语法: INSERT INTO 表名(列名1,列名2 -)VALUES(列值1,列值2-); 注意:列名与列值的类型.个数.顺序要一一对应. 可以把列名当做java中的形参,把列值当做实参. 值不要超出列定义的长度. 如果插入空值,请使用null 插入的日期和字符一样,都使用引号括起来. 修改操作 UPDATE: 语法:UPDATE 表名 SET 列名1=列值1,列名2=列值2 --.. WHERE

OraclePL/SQL单行函数和组函数详解_oracle

正在看的ORACLE教程是:OraclePL/SQL单行函数和组函数详解. 1 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类:  2  3 单行函数  4  5 组函数   6  7 本文将讨论如何利用单行函数以及使用规则.  8  9 SQL中的单行函数 10 11 SQL和PL/SQL中自带很多类型的函数,有字符.数字.日期.转换.和混合型等多种函数用于处理单行数据,因此这些都可被统称

mysql 组函数count的具体用法

问题描述 mysql 组函数count的具体用法 SELECT d.department, COUNT(CASE e.sex WHEN e.sex='f' AND p.position !='主管' THEN p.id END) fq, COUNT(CASE e.sex WHEN e.sex='f' AND p.position ='主管' THEN p.id END) fz, COUNT(CASE e.sex WHEN e.sex='m' AND p.position !='主管' THEN

php二维数组用键名分组相加实例函数_php实例

本文介绍一篇关于php 二维数组以某一键名进行分组相加的实例程序,如果是从数据库里取数据的时候大可以SELECT SUM(t_value),t_id FROM t_table GROUP BY t_id,但是如果是在php程序中处理类似的问题就稍微麻烦点了,这里给个函数就是处理类似的问题 复制代码 代码如下: <?php /* 函数功能:对二维数组以某一键名进行分组相加,返回新的二维数组  * 参数说明:$arr-源数组:$new_arr-相加后得到的新数组:$target_key-要分组的键名

我在PHP中混淆的三组函数总结(htmlentities,html_entity_decode,addslashes)

一.htmlentities() 和htmlspecialchars() 1.htmlentities() 1.1  功能:把字符转换为 HTML 实体.字符包括ASCII实体和ISO 8859-1实体(HTML实体对照表:http://www.w3school.com.cn/tags/html_ref_entities.html) 1.2  语法:htmlentities(string,quotestyle,character-set) 1.3  参数:string是必选参数,是需要转换的字符

oracle聚组函数

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 AVG([distinct|all]x) [功能]统计数据表选中行x列的平均值.   [参数]all表示对所有的值求平均值,distinct只对不同的值求平均值,默认为all 如果有参数distinct或all,需有空格与x(列)隔开.   [参数]x,只能为数值型字段   [返回]数字值   [示例] 环境: create table table3(xm varchar(8),sal