学习内容
- 描述性统计函数,包括平均值,最大/小值,行数,总和
- 使用 GROUP BY子句和HAVING子句 对数据进行分组操作
描述性统计数函数
除了上面提到的聚合函数外,MySQL还提供了以下其他一些常用的聚合函数:
– STDDEV:计算给定列的标准偏差。
– VARIANCE:计算给定列的方差。
– GROUP_CONCAT:将每个分组中的值连接成一个字符串。
– FIRST 和 LAST:返回分组中第一个或最后一个值。
– BIT_AND 和 BIT_OR:对给定列中的所有值执行按位AND或OR操作。
- AVG()
# NULL值 AVG()函数忽略列值为NULL的行
# 下面的例子使用AVG()返回products表中所有产品的平均价格下面的例子使用AVG()返回products表中所有产品的平均价格
SELECT AVG(prod_price) AS avg_price FROM products;
# AVG()也可以用来确定特定列或行的平均值
SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id = 1003;
- COUNT()
函数进行 行计数。 可利用COUNT()确定表中行的数目或符合特定条件的行的数目
使用COUNT(*)对表中行的数目进行计数, 不管表列中包含的是空值( NULL)还是非空值
使用COUNT(column)对特定列中具有值的行进行计数,忽略 NULL值
SELECT COUNT(*) AS num_price FROM products;
SELECT COUNT(prod_price) AS num_price FROM products;
- MAX()
MAX()返回指定列中的最大值, MAX()要求指定列名
虽然MAX()一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。
在用于文本数据时,如果数据按相应的列排序,则MAX()返回最后一行。
SELECT MAX(prod_price) AS max_price FROM products;
- MIN()
MIN()的功能正好与MAX()功能相反,它返回指定列的最小值。
与MAX()一样, MIN()要求指定列名
SELECT MIN(prod_price) AS min_price FROM products;
- SUM()
SUM()用来返回指定列值的和(总计)
SELECT SUM(prod_price) AS sum_price FROM products;
- DISTINCT
下面的例子使用AVG()函数返回特定供应商提供的产品的平均价格。
它与上面的SELECT语句相同,但使用了DISTINCT参数,因此平均值只考虑各个不同的价格
SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003;
- 统计数函数的组合
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS min_price,
MAX(prod_price) AS max_price,
AVG(prod_price) AS avg_price
FROM products WHERE vend_id = 1003;
- group by函数
下面这个SQL查询语句的作用是按照vend_id字段对products表进行分组,然后对每个分组中的记录进行计数。具体来说,它会返回一个结果集合,其中包含了每个vend_id值及其对应的产品数量(num_items)
SELECT vend_id,COUNT(*) AS num_items FROM products GROUP BY vend_id;
- GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制
- 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。
- GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
- 除聚集计算语句外, SELECT语句中的每个列都必须在GROUP BY子句中给出。
- 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组
- GROUP BY子句必须出现在WHERE子句之后, ORDER BY子句之前。
-
HAVING 过滤分组
HAVING非常类似于WHERE。事实上,目前为止所 学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是 WHERE过滤行,而HAVING过滤分组。GROUP BY子句必须出现在WHERE子句之后, ORDER BY子句之前
HAVING 出现在了 GROUP BY 之后
WHERE在数据分组前进行过滤, HAVING在数据分组后进行过滤
WHERE排除的行不包括在分组中。这可能会改变计 算值,从而影响HAVING子句中基于这些值过滤掉的分组
SELECT cust_id,COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;
SELECT cust_id,COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >= 2
ORDER BY order_num;