我有一张桌子:
CREATE TABLE data
(
value integer,
name varchar(100)
)
在我的表格中,可能存在重复的值,name
而值的不同value
。现在,我想DISTINCT
name
,有avg()
value
从表data
。
我能够得到DISTINCT
的价值name
,但无法得到avg()
的有value
秒。
现在通过以下查询,我得到avg()
了所有数据:
select floor(avg(value)) from data
我知道这是不正确的,但是我是SQL的新手。我想要这个select floor(avg(value))
作为的distinct
值name
。
数据 :
insert into data values(10, 'mnciitbhu')
insert into data values(20, 'mnciitbhu')
insert into data values(40, 'mafiya69')
insert into data values(20, 'mafiya69')
insert into data values(0, 'mafiya69')
输出 :
mnciitbhu 15
mafiya69 20
添加此信息是因为其他答案虽然准确,但没有详细说明。
您要在此处使用SQL的grouping
和aggregation
功能。
grouping
您的结果将按特定字段划分,将结果集分为多个独立的部分,您可以使用这些aggregate
函数进行操作,以获取每组的平均值,总和,计数等。
有关聚合函数的完整列表以及其他有关的其他信息group by
,您可以阅读12.16.1 GROUP BY(聚合)函数。
在您的实例中,由于您需要每个名称的平均值,因此您需要group by name
。这将给出以下查询:
select name, avg(value)
from `data`
group by name; -- this is the important line
此查询将为value
表中的每组名称计算的平均值,每组返回一行。
使用时group by
,一个非常重要的考虑因素是:select中包含的所有字段必须包含在group by
子句中,或用于聚合函数中。如果您引用的字段不在此范围之内,则可能会导致不希望的不确定结果。
MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以使用此功能来避免不必要的列排序和分组,从而获得更好的性能。但是,这主要在每个组的每个未聚合列中未在GROUP BY中命名的所有值都相同时才有用。服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。
该段的重要性不可夸大。容易误解它是如何工作的,很容易得出似乎能得到所需结果的查询,但有时会给出不正确/不需要的数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句