SQL语句中GROUP BY 使用方法及注意点

首先总结如下:

  • 使用GROUP BY子句可以像切蛋糕那样将表分割。通过使用聚合函数对GROUP BY子句,可以根据二维表中某个(些)列将表分割后在进行汇总。
  • 聚合函数中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来。
  • 使用聚合函数和GROUP BY子句时,需要注意以下4点。
    ① 只能写在SELECT子句之中
    GROUP BY子句中不能使用SELECT子句中列的别名
    GROUP BY子句中的聚合结果是无序的
    WHERE子句中不能使用聚合函数

例如,构建一个数据表如图所示:
SQL语句中GROUP BY 使用方法及注意点_第1张图片
可以对该表使用分组查询。

SELECT	product_type, COUNT(*)
	FROM	product
	GROUP BY product_type
	
-- 这里的 NULL 可理解为 “不确定”
SELECT	purchase_price, COUNT(*)
	FROM	product
	GROUP BY purchase_price;
	
/* 
	子句的书写顺序:SELECT -> FROM -> WHERE -> GROUP BY
	SQL语句执行顺序:FROM -> WHERE -> GROUP BY -> SELECT
	即书写顺序和执行顺序并不相同
*/
SELECT	purchase_price, COUNT(*)
	FROM	product
	WHERE	product_type = '衣服'
	GROUP BY purchase_price;

SELECT	product_type, COUNT(*)
	FROM	product
	GROUP BY product_type;

虽然分组查询由于使用方便经常被使用,但是书写SQL时很容易出错。

  • 常见错误①——在SELECT子句中书写了多余的列
    在使用COUNT这样的聚合函数时,SELECT子句只能存在以下三种元素。

    • 常数
    • 聚合函数
    • GROUP BY子句中指定的列名(也就是聚合键)

    这里经常出现的错误就是把聚合键之外的列名书写在SELECT子句之中。通过某个聚合键将表进行分组之后,结果中的一行数据就代表一组。例如,使用进货单价将表进行分组之后,一行就代表了一个进货单价。问题就出在这里,聚合键和商品名并不一定是一对一的。

  • 常见错误②——在GROUP BY子句中写了列的别名
    GROUP BY子句中使用列的别名会引发错误,其原因就是SQL语句在DBMS内部的执行顺序造成的:SELECT子句在GROUP BY子句之后执行。

  • 常见错误③——GROUP BY子句的结果能排序吗
    GROUP BY子句的显示结果是无序的。

  • 常见错误④——在WHERE子句中使用聚合函数
    不能在WHERE子句中使用聚合,实际上,只有SELECT子句HAVING子句及ORDER BY子句中能够使用COUNT等聚合函数。

你可能感兴趣的:(数据库,sql)