聚合函数 和 group by

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚合函数 和 group by相关的知识,希望对你有一定的参考价值。

select bumen,ip,name,sex //部门 序号 名字 性别
from shiyan
group by bumen
结果过不去呀
消息 8120,级别 16,状态 1,第 1 行
选择列表中的列 'shiyan.ip ' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

具体什么原因
还有groupby有什么要求在使用时 ??
请指教

一、
聚合函数: sql语言中一种特殊的函数:聚合函数,SUM, COUNT, MAX, MIN, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
SELECT SUM(population) FROM COUNTRY
这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有国家的总人口数。
通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值,也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值。
HAVING子句可以筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前。而 HAVING子句在聚合后对组记录进行筛选。

二、例子:
一)显示每个地区的总人口数和总面积: SELECT region, SUM(population), SUM(area)
FROM COUNTRY
GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。

二) 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。
SELECT region, SUM(population), SUM(area)
FROM COUNTRY
GROUP BY region
HAVING SUM(area)>1000000
在这里,不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,HAVING子句可以筛选成组后的各组数据。

三) 查询每个部门的每种职位的雇员数。
select deptno,job,count(*) from emp group by deptno,job。

三、
在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。
在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数
select max(sal),job emp group by job;
(注意max(sal),job的job并非一定要出现,但有意义)
查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。
select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;
当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
参考技术A 估计你还没弄懂group by是干什么用的
第一,是分项统计用
第二,可以当做查重用

你估计是想用第二种
象楼上那么写就是部门 序号 名字 性别 这四个字段读不重复的时候列出来,而你那么写,数据库会不识别

而第一种用法则是统计用,譬如要统计每个部门有多少个人
select bumen,count(*) from shiyan group by bumen

结果就是
部门1 3
部门2 5

这样的结果本回答被提问者采纳
参考技术B select
a.id,a.name,a.sex,a.class,b.num
from
table
a,
(select
id,count(*)
as
num
from
table
where
name
like
'%a%'
group
by
id)
b
where
a.id=b.id
order
by
a.id
desc.
聚合函数对一组值执行计算并返回单一的值。聚合函数忽略空值。聚合函数经常与
select
语句的
group
by
子句一同使用。
参考技术C select bumen,ip,name,sex //部门 序号 名字 性别
from shiyan
group by bumenip,name,sex

把查询的列全部放到group by中。

GROUP BY 和聚合函数的参数的适当术语,例如 SUM()

【中文标题】GROUP BY 和聚合函数的参数的适当术语,例如 SUM()【英文标题】:A proper term for arguments of GROUP BY and aggregate functions, like SUM() 【发布时间】:2019-04-19 17:46:30 【问题描述】:

我在任何地方都找不到答案,GROUP BY 子句中列出的列的术语是什么?相反,应用聚合函数的列的名称是什么?

【问题讨论】:

在 group by 你可以有键(列)或聚合函数,所以这意味着 group by 表达式意味着它可以涉及两者 仅供参考,似乎也没有更具体的通用术语relational algebra。所以,它们是“列”:-) 文字很重要。为此 +1。 ::= GROUP BY [ ] 【参考方案1】:

我将它们称为“按键分组”或聚合键。

我发现不同数据库中的文档并不一致,因此可能会有一些灵活性。 “按元素分组”或“按表达式分组”都明确地传达了这个想法。

聚合函数的参数没有特殊的名称。这些可以是任何表达式,包括“按键分组”。

【讨论】:

以上是关于聚合函数 和 group by的主要内容,如果未能解决你的问题,请参考以下文章

SQL中只要用到聚合函数就一定要用到group by 吗?

为啥 CROSS APPLY 与列和聚合函数需要 Group by

可以这样去理解group by和聚合函数

浅析MySQL使用 GROUP BY 分组聚合与细分聚合

sql 聚合函数和group by 联合使用

GROUP BY 和聚合函数的参数的适当术语,例如 SUM()