MySQL必知必会6

汇总数据

聚集函数

我们经常需要汇总数据而不是把他检索出来,例如确定表的行数,获得表的行组的和及求表列的最大值或最小值,这些都需要对表中的数据进行汇总,为此,MySQL中提供了聚集函数来进行汇总数据。

以下是5个常用聚集函数:

在这里插入图片描述

以下说明各函数的使用:

MySQL还提供了一系列的标准偏差函数,在此不去叙述。

AVG( )函数

AVG( )可以求出特定列的平均值。

在这里插入图片描述

这个例子返回prod_price的平均值。函数的参数为列的名字。

AVG( ) 函数也可以求特定行的平均值,这个时候就要使用WHERE子句来过滤数据。

在这里插入图片描述

这个例子就是查找vend_id = 1003的行的数据的平均值。

AVG( )函数只能用来求特定列的平均值,且函数参数是列名,如果想查询多个列的平均值,需要使用多个AVG( )函数。

AVG( )函数忽略值为NULL的行。

COUNT( )函数

COUNT( )函数用来计数,可以确定行的数目,或符合条件的行的数目。

COUNT( )函数有两种使用方式:

1)使用COUNT(*)对表中行的数目进行计算。(包含值为NULL的行)

2)使用COUNT(column)对特定列中具有值得行进行计数,忽略值为NULL得行。

例如在customers表中

在这里插入图片描述

假设我们使用COUNT(*)和使用COUNT(cust_email),其结果是不同的。

在这里插入图片描述

主要是因为COUNT(*)查询表中的行数,而COUNT(column)只查询这一列值不为空的行数。

MAX( )函数

MAX( )返回指定列的最大值,参数要指定列名。

在这里插入图片描述

假设我们要查找的最大值有限定条件,我们也可以使用WHERE子句:

在这里插入图片描述

这个例子就加了限定条件vend_id = 1003。

MAX( )允许对于非数值数据的列进行检索,例如用于文本数据的时候,返回字典排序的最大值。

在这里插入图片描述

MAX( )函数忽略值为NULL的行。

MIN( )函数

MIN( )函数返回特定列的最小值,同MAX( )用法相同。

SUM( )函数

SUM( )函数返回指定列的和。

例如下面这个例子返回20005订单中quantity列的和。

在这里插入图片描述

聚集不同值

对于上述5各函数,都可以使用ALL和DISTINCT用以修饰,DISTINCT只对行中的不同的值进行操作。

在这里插入图片描述

这个返回列中不同行的平均值。

DISTINCT只能用于修饰列名,如果使用COUNT(DISTINCT *)会显示错误。

组合聚集函数

以上的例子都只涉及一个函数,但在实际操作中,可以包含多个函数。

在这里插入图片描述

这个例子通过多个函数,返回了列的行数,最小值,最大值,平均值。

分组数据

数据分组

在上一节中我们已经可以计算出某一个vend_id的产品数量,但如果我们想要得到每一个vend_id的数量该怎么做呢?

这个时候就可以使用分组来进行检索。

创建分组

分组是使用SELECT语句中的GROUP BY 子句来创建的。

来看一个例子以更好的理解GROUP BY 子句:

在这里插入图片描述

在这个例子中,通过GROUP BY 子句,把vend_id列分成几个不同的组,分组依据是vend_id,即vend_id中的不同值。

在使用GROUP 子句之前,要知道一些重要的规定。

1)GROUP BY 子句可以包含任意数目的列,即对分组进行嵌套,为数据分组进行更好的控制。

2)如果嵌套分组,数据将在最后的分组上进行汇总,即最后得出的分组时依据最后规定的分组条件。

3)GROUP BY 子句中列出的每一个列都是有效的列或表达式,但不能是聚集函数之类的(还记得聚集函数吗?)如果在SELECT语句中使用表达式,那么在GROUP BY 子句中也要使用表达式,不能使用别名。

4)除聚集计算语句以外,SELECT 中的所有列,都要在GROUP BY 中列出。

5)如果分组中有NULL值,则NUL为一个新的分组,所有NULL为一组。

6)GROUP BY 必须在WHERE字句之后,在ORDER子句之前。

过滤分组

除了能使用GROUP BY子句进行分组之外,MySQL还支持过滤分组,什么是过滤分组呢? 还记得过滤数据吗?过滤数据使用WHERE进行过滤,但分组中WHERE子句并不能完成任务。因为WHERE过滤的是行而不是分组,这个时候我们就要使用HAVING子句来进行过滤分组。

先看一个例子:

在这里插入图片描述

这个例子和上一个例子非常相似,只是多了一个过滤分组子句,他过滤了数量小于3的分组,和WHERE子句很相似。

但事实上WHERE 和HAVING 子句有很大的区别,WHERE子句其实是在分组之前进行过滤,而HAVING则是在分组之后进行过滤。因为HAVING子句在GROUP之后,WHERE 在GROUP之前。

那么有没有WHERE和HAVING混用的情况呢?

看一个例子:

在这里插入图片描述

这个例子中相较于上一个例子只是多了一个WHERE子句来过滤数据,先是把所有prod_price>=10的先过滤掉在进行分组,这样分组的结果就会变少。

SELECT 子句顺序

下表是SELECT一些子句的用法与顺序。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值