欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-23 14:56:02
与聚合函数和Group by 子句有关的常见错误常见错误1:在select子句中书写了多余的列 。在使用count这样的聚合函数时,select子句中的元素有严格的限制。实际上,在使用聚合函数时,select 子句中只能存在以下三种元素①常数②聚合函数③group by 子句中指定的列明(也就是聚合键)例:常数就是像数字123,或者字符串‘测试’这样写在sql语句中的固定值,将常数直接写在select子句中没有任何问题。此外还可以书写聚合函数或者聚合键,这些在之前的示例代码中都已经出现过了。...

与聚合函数和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;

group by与聚合函数结合时常见的错误
如果我们想要取出包含2行数据的组该怎么办呢?满足要求的是“办公用品”和“衣服”
想要指定选择条件时就要用到where子句,初学者通常会想到使用到下列的代码

这行代码是错误的示范

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

执行该结果
group by与聚合函数结合时常见的错误

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

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

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

本文地址:https://blog.csdn.net/koding7879/article/details/108985341

相关标签: sql mysql