COUNT() 函数有两种使用方式。
😁使用 COUNT(*) 对表中行的数目进行计数,不管表列中包含的是空值( NULL )还是非空值。
😁使用 COUNT(column) 对特定列中具有值的行进行计数,忽略
NULL 值。
count() //计数函数
MAX() MIN()
聚集函数使用 DISTINCT 参数 distinct
注意 如果指定列名,则 DISTINCT 只能用于 COUNT() 。 DISTINCT不能用于 COUNT(*),因此不允许使用COUNT(DISTINCT),否则会产生错误 。类似地, DISTINCT 必须使用列名,不能用于计算或表达式。
可以用多个聚集函数进行计算 ;
创建分组
SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;
上面的 SELECT 语句指定了两个列, vend_id 包含产品供应商的ID,num_prods 为计算字段(用 COUNT(*) 函数建立)。 GROUP BY 子句指示MySQL按 vend_id 排序并分组数据。这导致对每个 vend_id 而不是整个表计算 num_prods 一次。从输出中可以看到,供应商 1001 有 3 个产品,供应商1002 有 2 个产品,供应商 1003 有 7 个产品,而供应商 1005 有 2 个产品。
GROUP BY 子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
如果在 GROUP BY 子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算
(所以不能从个别的列取回数据)。
GROUP BY 子句中列出的每个列都必须是检索列或有效的表达式
(但不能是聚集函数)。如果在 SELECT 中使用表达式,则必须在
GROUP BY 子句中指定相同的表达式。不能使用别名。
除聚集计算语句外, SELECT 语句中的每个列都必须在 GROUP BY 子句中给出。
如果分组列中具有 NULL 值,则 NULL 将作为一个分组返回。如果列中有多行 NULL 值,它们将分为一组。
GROUP BY 子句必须出现在 WHERE 子句之后, ORDER BY 子句之前。
使用 ROLLUP 使用 WITH ROLLUP 关键字,可以得到每个分组以
及每个分组汇总级别(针对每个分组)的值,WITH ROLLUP
HAVING 支持所有 WHERE 操作符 在第6章和第7章中,我们学习
了 WHERE 子句的条件(包括通配符条件和带多个操作符的子
句)。所学过的有关 WHERE 的所有这些技术和选项都适用于
HAVING 。它们的句法是相同的,只是关键字有差别。
SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >=2;
HAVING 和 WHERE 的差别 这里有另一种理解方法, WHERE 在数据分组前进行过滤, HAVING 在数据分组后进行过滤。这是一个重要的区别, WHERE 排除的行不包括在分组中。这可能会改变计算值,从而影响 HAVING 子句中基于这些值过滤掉的分组。
SELECT vend_id ,COUNT(*) AS num_prods
FROM products
WHERE prod_price>=10
GROUP BY vend_id
HAVING COUNT(*) >=2;