`

Postgresql中的分组函数(group by 和 having)

阅读更多
在通过了WHERE过滤器之后,生成的输出表可以继续用GROUP BY 子句进行分组,然后用HAVING子句删除一些分组行。
SELECT select_list
 FROM ...
 [WHERE ...]
 GROUP BY grouping_column_reference [, grouping_column_reference]...


GROUP BY 子句 用于把那些在表中所列出的列上共享相同值的行聚集在一起。 这些列的列出顺序并没有什么关系。 效果是把每组共享相同值的行缩减为一个组行,它代表该组里的所有行。 这样就可以删除输出里的重复和/或计算应用于这些组的聚集。 比如:
=> SELECT * FROM test1;
 x | y
---+---
 a | 3
 c | 2
 b | 5
 a | 1
(4 rows)

=> SELECT x FROM test1 GROUP BY x;
 x
---
 a
 b
 c
(3 rows)


在第二个查询里,我们不能写成 SELECT * FROM test1 GROUP BY x, 因为字段 y 里没有哪个值可以和每个组相关联起来。 被分组的字段可以在选择列表中引用是因为它们每个组都有单一的数值。

通常,如果一个表被分了组,那么没有在分组中引用的字段都不能引用,除了在聚集表达式中以外。 一个带聚集表达式的例子是:
=> SELECT x, sum(y) FROM test1 GROUP BY x;
 x | sum
---+-----
 a |   4
 b |   5
 c |   2
(3 rows)


这里的 sum 是一个聚集函数,它在整个组上计算一个数值。 有关可用的聚集函数的更多信息可以在 Section 9.15 中找到。

    提示: 没有聚集表达式的分组实际上计算了一个字段中独立数值的集合。 我们也可以用 DISTINCT 子句实现(参阅Section 7.3.3)。

这里是另外一个例子:它计算每种产品的总销售额。(而不是所有产品的总销售额)。
SELECT pid, p.name, (sum(s.units) * p.price) AS sales
  FROM products p LEFT JOIN sales s USING ( pid )
  GROUP BY pid, p.name, p.price;


在这个例子里,字段pid, p.name,和p.price必须在GROUP BY子句里, 因为它们都在查询选择列表里被引用到。 (根据产品表具体的设置的不同,名字和价格可能和产品 ID 完全无关,因此理论上额外的分组可能是不必的, 但是这些尚未实现。) 字段s.units不必在GROUP BY列表里,因为它只是在一个聚集表达式(sum(...)) 里使用,它代表一组产品的销售额。对于每种产品,这个查询都返回一个该产品的所有销售额的总和。

在严格的 SQL 里,GROUP BY只能对源表的列进行分组,但 PostgreSQL 把这个扩展为也允许GROUP BY那些在选择列表中的字段。也允许对值表达式进行分组,而不仅是简单的字段.

如果一个表已经用GROUP BY子句分了组,然后你又只对其中的某些组感兴趣, 那么就可以用HAVING子句,它很象WHERE子句,用于删除一个分了组的表中的一些组。 语法是:
SELECT select_list FROM ... [WHERE ...] GROUP BY ... HAVING boolean_expression


在 HAVING 子句中的表达式可以引用分组的表达式和未分组的表达式(后者必须涉及一个聚集函数)。
例子:
=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING sum(y) > 3;
 x | sum
---+-----
 a |   4
 b |   5
(2 rows)

=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING x < 'c';
 x | sum
---+-----
 a |   4
 b |   5
(2 rows)


然后是一个更现实的例子:
SELECT product_id, p.name, (sum(s.units) * (p.price - p.cost)) AS profit
    FROM products p LEFT JOIN sales s USING (product_id)
    WHERE s.date > CURRENT_DATE - INTERVAL '4 weeks'
    GROUP BY product_id, p.name, p.price, p.cost
    HAVING sum(p.price * s.units) > 5000;


在上面的例子里,WHERE子句用于那些非分组的字段选择数据行。 (表达式只是对那些最近四周发生的销售为真)。 而HAVING子句选择那些单价超过 5000 的组的行。 请注意聚集函数不需要在查询中的所有地方都一样。
分享到:
评论
1 楼 tongzelong 2016-12-10  
[b][i]
[flash=200,200][url][img][list]
[*]
引用
[/list][/img][/url][/flash]
[/i][/b]

相关推荐

    Sequelize中用group by进行分组聚合查询

    在SQL中,分组查询是通过`GROUP BY`子句来实现的,它可以将数据按照一个或多个列的值进行分组,通常结合聚合函数一起使用,以便对每个分组执行计算。 1. SQL中的分组查询 在SQL中,使用`GROUP BY`语句进行分组操作...

    DB2到GreenPlum/PostgreSQL的转换指南

    ORDER BY、GROUP BY和HAVING子句用于对查询结果进行排序和分组。DB2与GreenPlum/PostgreSQL在这方面的实现基本相同,但在某些细节上可能存在差异。 ##### 2.9.1 ORDER BY ORDER BY子句用于按指定的列对结果集进行...

    关于sql的group by的分析

    在SQL查询中,`GROUP BY`子句是一个非常重要的部分,它用于对数据进行分组,以便我们可以对每个组执行聚合函数(如SUM、COUNT、AVG、MAX、MIN等)。`GROUP BY`通常与聚合函数一起使用,帮助我们从大量数据中提取有用...

    PostgreSQL HAVING 子句

    在SQL查询中,`HAVING`子句是用于在聚合函数和`GROUP BY`子句之后筛选结果集的关键部分,特别是在处理分组数据时。在PostgreSQL中,`HAVING`子句的功能与`WHERE`子句类似,但两者的应用场景有所不同。`WHERE`子句...

    postgresql-9.5.5.tar.gz

    可以通过WHERE子句进行条件筛选,GROUP BY和HAVING用于分组和过滤,ORDER BY用于排序,JOIN操作用于连接多个表。 4. **数据库事务**:了解如何使用BEGIN、COMMIT和ROLLBACK语句来管理事务,确保数据的一致性和完整性...

    postgresql官方手册的中文版

    此外,还有JOIN操作用于合并多个表的数据,以及GROUP BY和HAVING子句用于数据分组和过滤。 2. 数据类型: PostgreSQL支持多种数据类型,如整数类型(INT, SMALLINT, BIGINT)、浮点数(REAL, FLOAT)、字符串...

    postgresql

    连接操作可以结合使用 `WHERE`, `GROUP BY`, `HAVING` 子句进行更复杂的筛选和分组,以满足不同查询需求。 综上所述,PostgreSQL 的查询机制涵盖了从简单到复杂的各种数据检索场景,通过 `SELECT` 语句配合各种连接...

    SQL中窗口函数的使用

    在SQL语句的执行顺序中,它位于`FROM/JOIN`、`WHERE`、`GROUP BY`、`聚合函数`、`HAVING`之后,`SELECT`、`DISTINCT`、`UNION`等操作之前。 5. **PARTITION BY** 使用`PARTITION BY`可以将数据分割成不同的分区,...

    关于postgresql、Python100道题

    - 查询语句:SELECT,用于从表中检索数据,支持JOIN、WHERE、GROUP BY、HAVING、ORDER BY等子句。 - DML操作:INSERT用于插入数据,UPDATE用于更新数据,DELETE用于删除数据。 - DDL操作:CREATE TABLE用于创建表...

    PostgreSQL 8.3 数据库文档(含SQL教程及参考手册)

    2. **查询语句**:`SELECT`用于从表中检索数据,可以通过`WHERE`子句指定筛选条件,`ORDER BY`进行排序,`GROUP BY`进行分组,以及`HAVING`过滤分组结果。 3. **DML操作**:`INSERT`用于插入新记录,`UPDATE`更新已...

    查询使用Group by子句从多个表中获取数据

    在这个例子中,`INNER JOIN`将`Departments`和`Employees`表连接在一起,`GROUP BY`则按照`DepartmentName`进行分组。`COUNT(Employees.EmployeeID)`计算每个部门的员工数量。 在PostgreSQL中,`GROUP BY`支持更...

    分组聚合查询SQL语句练习.docx

    GROUP BY语句用于将数据行根据一个或多个列进行分组,以便对每个组执行聚合函数(如COUNT, SUM, AVG, MAX, MIN)。例如,如果你有一个销售表,你可以按照产品类别分组并计算每类产品的总销售额。 ```sql SELECT ...

    PostgreSQL 语法

    - `GROUP BY` 用于对结果进行分组,通常与聚合函数(如 `COUNT`, `SUM`, `AVG` 等)一起使用。 - `HAVING` 用于在 `GROUP BY` 后过滤数据,它类似 `WHERE`,但作用于分组后的结果。 - `ORDER BY` 用于对结果进行排序...

    PostgreSQL语法、连接

    HAVING子句与GROUP BY一起使用,用于筛选分组后的结果,基本语法如下: ```sql SELECT column1, column2, ..., aggregate_function(columnN) FROM table_name GROUP BY column1, column2, ... HAVING condition; ``...

    SQL高级实例-模糊查询-分组随机查询-转换

    `GROUP BY`语句允许我们根据一个或多个列对数据进行分组,然后使用聚合函数如`COUNT`、`SUM`、`AVG`、`MIN`和`MAX`来计算每组的总和、平均值等信息。例如,`SELECT department, COUNT(*) FROM employees GROUP BY ...

    PostgreSQL:SQL资源

    - 基本查询:SELECT语句用于检索数据,WHERE子句用于过滤结果,GROUP BY和HAVING用于分组和条件过滤。 2. **PostgreSQL的SQL扩展** - 范式理论:了解第一至第五范式,并在设计数据库时考虑这些原则。 - JSON支持...

    MLDN魔乐科技_Oracle课堂4

    它的基本格式由关键字、表名、列名、条件和操作符组成,通常包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY等子句。 1. **SELECT** 子句:这是SQL中最常用的子句,用于从数据库中选择数据。你可以指定一列或...

    SQL 参考手册中文版

    6. **聚合函数**:COUNT、SUM、AVG、MIN和MAX等用于对一组值进行计算的函数,以及GROUP BY和HAVING在聚合查询中的应用。 7. **排序与分页**:ORDER BY用于排序结果,LIMIT和OFFSET用于实现分页,这对大数据量的查询...

    SQL语言查询的艺术

    3. **分组查询**:使用GROUP BY子句对数据进行分组,结合HAVING子句对分组后的结果进行过滤。 4. **联结操作**:通过JOIN语句可以将来自两个或多个表中的行组合起来。常见的联结类型包括INNER JOIN、LEFT JOIN、...

    sql_step_by_step_learning.rar_Word by Word

    此外,GROUP BY和HAVING子句可用于对数据进行分组和筛选,而聚合函数如COUNT、SUM、AVG、MAX和MIN则可计算一组值的统计信息。 SQL还支持子查询,这是一种在查询中嵌套另一个查询的能力,可以用来处理更复杂的数据...

Global site tag (gtag.js) - Google Analytics