通常,聚合函数会对NULL以外的对象进行汇总。但是只有COUNT函数例外,使用 COUNT(*)可以查出包含 NULL 在内的全部数据的行数。
SELECT
count(*)
FROM
product;
-- 返回8
SELECT
count(purchase_price)
FROM
product;
-- 返回6
SELECT
COUNT(*),
COUNT(col_1)
FROM
NullTbl;
-- 返回3,0
这里很独特的是COUNT(*)返回所有行数,COUNT(col_1)的时候,返回的是不包含NULL的行的数量。
GROUP BY
SELECT
product_type,
count(*)
FROM
product
GROUP BY
product_type;
SELECT
purchase_price,
-- 这个也会返回NULL的个数
count(*)
FROM
product
GROUP BY
purchase_price;
与聚合函数和GROUP BY子句有关的常见错误
常见错误1 ——在 SELECT 子句中书写了多余的列
使用聚合函数时,SELECT 子句中只能存在以下三种元素。
- 常数
- 聚合函数
- GROUP BY子句中指定的列名(也就是聚合键)
常见错误2 ——在GROUP BY子句中写了列的别名
SELECT product_type AS pt, COUNT(*) FROM Product
GROUP BY pt;
上述语句发生错误的原因之前已经介绍过了,是 SQL 语句在 DBMS 内部的执行顺序造成的——SELECT子句在GROUP BY子句之后执行。 在执行GROUP BY子句时,SELECT子句中定义的别名,DBMS还并不知道。
常见错误3 —— GROUP BY子句的结果能排序吗
GROUP BY 子句结果的显示是无序的。
常见错误4 ——在 WHERE 子句中使用聚合函数
SELECT product_type, COUNT(*) FROM Product
WHERE COUNT(*) = 2 GROUP BY product_type;
实际上,只有 SELECT 子句和 HAVING 子句(以及之后将要学到的 ORDER BY子句)中能够使用COUNT等聚合函数。并且,HAVING子 句可以非常方便地实现上述要求。