PostgreSQL之SELECT...GROUP BY...HAVING
1.SELECT...GROUP BY的使用PostgreSQL9.3官方文档:http://www.postgres.cn/docs/9.3/sql-select.html#SQL-GROUPBY SELECT查询在通过了WHERE过滤器之后,生成的输出表可以继续用GROUP BY 子句进行分组,然后用HAVING子句删除一些分组行。 SELECTselect_list FROM... [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|3 2|ws|2 3|yy|6 (3行记录) highgo=#selectnamefromtests1groupbyname; name ------ ws yy (2行记录) 通常,如果一个表被分了组,那么没有在分组中引用的字段都不能引用,除了在聚集表达式中以外。 一个带聚集表达式的例子是: highgo=#selectname,sum(num)fromtests1groupbyname; name|sum ------+----- ws|2 yy|9 (2行记录) 这里的 sum 是一个聚集函数,它在整个组上计算一个数值。 有关可用的聚集函数的更多信息可以在 Section 9.15 中找到。 2.常用的聚合函数PostgreSQL9.3中文文档:http://www.postgres.cn/docs/9.3/functions-aggregate.html
3.HAVING子句的使用 如果一个表已经用GROUP BY子句分了组,然后你又只对其中的某些组感兴趣, 那么就可以用HAVING子句,它很象WHERE子句,用于删除一个分了组的表中的一些组。 语法是: SELECTselect_listFROM...[WHERE...]GROUPBY...HAVINGboolean_expression 在 HAVING 子句中的表达式可以引用分组的表达式和未分组的表达式(后者必须涉及一个聚集函数)。 highgo=#selectname,sum(num)fromtests1groupbynamehavingsum(num)>5; name|sum ------+----- yy|9 (1行记录) 4.HAVING子句与WHERE子句的区别 HAVING去除了一些不满足条件的组行。它与WHERE 不同:WHERE在使用GROUP BY之前过滤出单独的行, 而HAVING过滤由GROUP BY创建的行。 在condition 里引用的每个字段都必须无歧义地引用一个分组的行,除非引用出现在一个聚合函数里。 HAVING的出现把查询变成一个分组的查询,即使没有GROUP BY 子句也这样。这一点和那些包含聚合函数但没有GROUP BY子句的查询里发生的事情是一样的。 所有选取的行都被认为会形成一个单一的组,而SELECT 列表和HAVING子句只能从聚合函数里面引用表的字段。 这样的查询在HAVING条件为真的时候将发出一个行,如果为非真,则返回零行。 参考博客:http://lvmy.iteye.com/blog/793428 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |