Postgresql9.3官方文档:http://www.postgres.cn/docs/9.3/sql-select.html#SQL-GROUPBY
SELECT查询在通过了WHERE过滤器之后,生成的输出表可以继续用GROUP BY 子句进行分组,然后用HAVING子句删除一些分组行。
SELECTselect_ListFROM...[WHERE...]GROUPBYgrouPing_column_reference[,grouPing_column_reference]...HAVINGcondition
GROUP BY 子句 用于把那些在表中所列出的列上共享相同值的行聚集在一起。 这些列的列出顺序并没有什么关系。 效果是把每组共享相同值的行缩减为一个组行,它代表该组里的所有行。 这样就可以删除输出里的重复和/或计算应用于这些组的聚集。 比如:
highgo=#createtabletests1(IDintprimarykey,namevarchar,numint);highgo=#insertintotests1values(1,'yy',3),(2,'ws',2),(3,6);highgo=#select*fromtests1;ID|name|num----+------+-----1|yy|32|ws|23|yy|6(3行记录)highgo=#selectnamefromtests1groupbyname;name------wsyy(2行记录)
通常,如果一个表被分了组,那么没有在分组中引用的字段都不能引用,除了在聚集表达式中以外。 一个带聚集表达式的例子是:
highgo=#selectname,sum(num)fromtests1groupbyname;name|sum------+-----ws|2yy|9(2行记录)
这里的 sum 是一个聚集函数,它在整个组上计算一个数值。 有关可用的聚集函数的更多信息可以在 Section 9.15 中找到。
注意: 没有聚集表达式的分组实际上计算了一个字段中独立数值的集合。 我们也可以用 disTINCT 子句实现。
Postgresql9.3中文文档:http://www.postgres.cn/docs/9.3/functions-aggregate.html
函数 | 参数类型 | 返回类型 | 描述 |
---|---|---|---|
avg(Expression) | smallint,int,bigint,real,double precision,numeric,or interval | 对于任何整数类型输入,结果都是numeric类型。 对于任何浮点输入,结果都是double precision类型。 否则和输入数据类型相同。 | 所有输入值的均值(算术平均) |
bit_and(Expression) | smallint,or bit | 和参数数据类型相同 | 所有非 NulL 输入值的按位与(AND),如果全部输入值皆为 NulL ,那么结果也为 NulL 。 |
bit_or(Expression) | smallint,or bit | 和参数数据类型相同 | 所有非 NulL 输入值的按位或(OR),如果全部输入值皆为 NulL ,那么结果也为 NulL 。 |
bool_and(Expression) | bool | bool | 如果所有输入值都是真,则为真,否则为假。 |
bool_or(Expression) | bool | bool | 如果至少有一个输入值为真,则为真,否则为假。 |
count(*) | bigint | 输入行数 | |
count(Expression) | 任意 | bigint | 计算所有输入行中满足Expression不为 NulL 的行数。 |
every(Expression) | bool | bool | 等效于bool_and |
Json_agg(record) | record | Json | 聚合记录作为JsON对象数组 |
max(Expression) | 任意数组、数值、字符串、日期/时间类型 | 和参数数据类型相同 | 有输入行中Expression的最大值 |
min(Expression) | 任意数组、数值、字符串、日期/时间类型 | 和参数数据类型相同 | 所有输入行中Expression的最小值 |
string_agg(Expression,delimiter) | (text,text) or (bytea,bytea) | 和参数数据类型相同 | 输入值连接成为一个字符串,用分隔符分开 |
sum(Expression) | smallint,or interval | 对于smallint或int输入,输出类型为bigint。 对于bigint输入,输出类型为numeric,对于浮点数输入, 输出类型为double precision。否则和输入数据类型相同。 | 所有输入行的Expression总和。 |
如果一个表已经用GROUP BY子句分了组,然后你又只对其中的某些组感兴趣, 那么就可以用HAVING子句,它很象WHERE子句,用于删除一个分了组的表中的一些组。 语法是:
SELECTselect_ListFROM...[WHERE...]GROUPBY...HAVINGboolean_Expression
在 HAVING 子句中的表达式可以引用分组的表达式和未分组的表达式(后者必须涉及一个聚集函数)。
highgo=#selectname,sum(num)fromtests1groupbynamehavingsum(num)>5;name|sum------+-----yy|9(1行记录)
HAVING去除了一些不满足条件的组行。它与WHERE 不同:WHERE在使用GROUP BY之前过滤出单独的行, 而HAVING过滤由GROUP BY创建的行。 在condition 里引用的每个字段都必须无歧义地引用一个分组的行,除非引用出现在一个聚合函数里。
HAVING的出现把查询变成一个分组的查询,即使没有GROUP BY 子句也这样。这一点和那些包含聚合函数但没有GROUP BY子句的查询里发生的事情是一样的。 所有选取的行都被认为会形成一个单一的组,而SELECT 列表和HAVING子句只能从聚合函数里面引用表的字段。 这样的查询在HAVING条件为真的时候将发出一个行,如果为非真,则返回零行。
参考博客:http://lvmy.iteye.com/blog/793428
总结以上是内存溢出为你收集整理的PostgreSQL之SELECT...GROUP BY...HAVING全部内容,希望文章能够帮你解决PostgreSQL之SELECT...GROUP BY...HAVING所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)