MySQL GROUP BY和聚合函数 |
您所在的位置:网站首页 › 分组聚合函数有哪些 › MySQL GROUP BY和聚合函数 |
聚合函数
使用sql的过程中有可能用到统计汇总的情况下就要使用聚合函数,常用的有5种。 count():计算表中的记录数(行数) sum() : 计算表中数值列中数据的合计值 avg() : 计算表中数值列中数据的平均值 max() : 求出表中任意列中数据的最大值 min() : 求出表中任意列中数据的最小值 示例数据库 数据库 1.count 计算行数计算全部行数: 计算全部行数直接使用count(*)函数就可以 SELECT COUNT(*) FROM product;执行结果: COUNT(*) -------- 8 1.1 不计算NULL汇总行数如果count()的括号内指定列名就是不计算NULL值进行汇总 SELECT COUNT(purchase_price) FROM Product;执行结果: COUNT(*) -------- 6COUNT函数的结果根据参数的不同而不同。COUNT(*)会得到包含NULL的数据 行数,而COUNT()会得到NULL之外的数据行数。 2. 对表进行分组对数据进行分组统计的时候需要用到 GROUP BY 进行分组,GROUP BY 子句就像切蛋糕那样将表进行了分组。在GROUPBY 子句中指定的列称为聚合键或者分组列。由于能够决定表的切分方式,所以是非常重要的列。 GROUP BY 语法规则 SELECT , , , …… FROM GROUP BY , , , ……;例如:分别统计每个类别的的商品有多少条数据 SELECT product_type, COUNT(*) FROM product GROUP BY product_type执行结果: product_type | count -------------|------ 衣服 | 2 办公用品 | 2 厨房用具 | 4GROUP BY 函数表示对相同的数据进行一个分组的汇总,本例中因为重复的有三种情况,所以查询的结果有三行。 每一种类别有不同或者相同的数据,所以要进行一个按组别的显示数据 image.png子句的书写顺序(暂定) SELECT → 2. FROM → 3. WHERE → 4. GROUP BY 2.1 聚合键中包含NULL的情况如果被分组的列包含null值分组会怎么显示呢? 例如:分别统计每个金额有多少条数据? SELECT purchase_price, COUNT(*) FROM product GROUP BY purchase_price执行结果: purchase_price | count ----------------+------- | 2 -- 有两项都为空值 320 | 1 500 | 1 5000 | 1 2800 | 2 790 | 1说明有null值的情况下,显示为空 2.2 有WHERE的情况进行GROUP BY分组使用GROUP BY 的句子中也可以使用WHERE SELECT , , , …… FROM WHERE GROUP BY , , , ……;像这样使用WHERE 子句进行汇总处理时,会先根据WHERE 子句指定的条件进行过滤,然后再进行汇总处理 SELECT purchase_price, COUNT(*) FROM Product WHERE product_type = '衣服' GROUP BY purchase_price;执行结果: purchase_price | count ---------------+------ 500 | 1 2800 | 1同时使用GROUP BY 和 WHERE 的情况下句子的执行顺序为: FROM → WHERE → GROUP BY → SELECT 3 聚合函数与GROUP BY 常见错误 3.1 常见错误 使用聚合函数时 SELECT 中书写多余列在使用COUNT 这样的聚合函数时,SELECT 子句中的元素有严格的限制。实际上,使用聚合函数时,SELECT 子句中只能存在以下三种元素。 常数 聚合函数 GROUP BY 中指定的列(也指聚合键) 常数就是指常量值,数字或者字符串等。聚合函数就是count、sum之类的。最容易出问题的是写上了聚合键以外的列名。MySQL除外,写上其它列名也可以执行 示例:根据进货金额分组商品 SELECT product_name, purchase_price, COUNT(*) FROM Product GROUP BY purchase_price; image.png原因是进货单价为2800的商品有两个,数据库不知道应该取哪一个好。 3.2 在GROUP BY子句中写了列的别名这也是一个非常常见的错误。SELECT 子句中的项目可以通过AS 关键字来指定别名。但是,在GROUP BY 子句中是不能使用别名的。 示例:GROUP BY子句中错误使用别名 SELECT product_type AS pt, COUNT(*) FROM Product GROUP BY pt;这个句子出错的原因是因为SQL执行顺序的原因。之前有介绍过DBMS是先执行 GROUP BY 再执行 SELECT 句子所以在 SELECT 中设置的别名不生效 需要注意的是,虽然这样的写法在PostgreSQL和MySQL都不会发生执行错误,但是这并不是通常的使用方法 3.3 在WHERE子句中使用聚合函数最后要介绍的是初学者非常容易犯的一个错误。我们还是先来看一下之前提到的按照商品种类(product_type 列)对表进行分组,计算每种商品数据行数的例子吧。 示例:按照商品种类进行汇总 SELECT product_type, COUNT(*) FROM product GROUP BY product_type执行结果: product_type | count -------------|------ 衣服 | 2 办公用品 | 2 厨房用具 | 4如果有个问题,在分类好的数据中查找汇总数为2的种类,该怎么写SQL语句呢? 初学者容易犯的错误就是在 WHERE 中直接添加聚合函数。 示例:WHERE中直接使用聚合函数 SELECT product_type, COUNT(*) FROM Product WHERE COUNT(*) = 2 -- 错误 GROUP BY product_type;执行结果: ERROR: 不能在WHERE子句中使用聚合 行 3: WHERE COUNT(*) = 2实际上,只有SELECT 子句和HAVING 子句(以及之后将要学到的ORDER BY 子句)中能够使用COUNT 等聚合函数。并且,HAVING 子句可以非常方便地实现上述要求。 只有SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |