group by与聚合函数结合时常见的错误

与聚合函数和Group by 子句有关的常见错误

常见错误1:在select子句中书写了多余的列 。
在使用count这样的聚合函数时,select子句中的元素有严格的限制。实际上,在使用聚合函数时,select 子句中只能存在以下三种元素
①常数
②聚合函数
③group by 子句中指定的列明(也就是聚合键)
例:
常数就是像数字123,或者字符串‘测试’这样写在sql语句中的固定值,将常数直接写在select子句中没有任何问题。此外还可以书写聚合函数或者聚合键,这些在之前的示例代码中都已经出现过了。
这里经常会出现的错误就是吧聚合键之外的列名书写在select子句中。
比如:select product_name,purchase_price,count(*) from product group by purchase_price;
运行结果会出错,这里出错的原因就是在用group by子句中并没有select子句中的 select product_name 列即列名 product_name 并没有包含在group by子句中 因此该列名也不能写在select子句中。
不支持这种语法的原因,大家仔细想一想就明白了。通过某个聚合键将表进行分组之后,一行就代表一组。例如,使用进货单价将表进行分组之后,一行就代表了一个进货单价,问题就出在这里,聚合键和商品名并不一定是一对一的
例如,进货单价是2800日元的商品有‘运动T恤’和‘菜刀’两种,但是用groop by 子句 进货单价分组 2800日元这一行应该对应那种商品名称呢?
所以像这样与聚合键相对应的丶同时存在多个值的列出现在select 子句中的情况,是错误的。
常见错误2:在group by子句中写了列的别名 。
这个也是一个非常常见的错误。select子句中的项目可以通过 AS 关键字来指定列名。但是,在group by 子句中是不能使用别名的。例:select product_type as pt ,count(*) from product group by pt
上述语句发生错误的原因之前已经介绍过了,是sql语句在数据库中执行时的执行顺序造成的。

例:fromwheregroup byhavingselect 这样的执行顺序

所以在执行group by 子句时 select 子句中AS的别名 数据库还不知道。
常见错误3:在where子句中使用聚合函数
这也是一个经常出现的错误。我们先来看一下之前提到的按照商品种类(product_type列)对表进行分组,计算每种商品数据行数的例子1

select product_type,count(*) from product group by product_type;

商品种类分组图片
如果我们想要取出包含2行数据的组该怎么办呢?满足要求的是“办公用品”和“衣服”
想要指定选择条件时就要用到where子句,初学者通常会想到使用到下列的代码

这行代码是错误的示范

select product_type,count(*) from product where count(*)=2 group by product_type;

执行该结果
在这里插入图片描述

实际上,只有select子句和Having子句(以及下面的ORDER BY 子句)中能够使用count等聚合函数。并且,Having子句可以很快的实现这个效果
例:``

select product_type,count(*) from product group by product_type Having count(*)=2;

也就是说 只有select子句和having子句以及order by 子句中能够使用聚合函数

你可能感兴趣的:(sql,mysql)