数据库中的聚合函数

本文介绍SQL中常用的聚合函数,如COUNT、SUM等,并通过具体案例展示如何应用这些函数进行数据统计与分析。包括计算获奖总数、按类别分组计数等实际操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用的聚合函数
1 count 2 sum 3 avg 4 max 5 min
使用规范时 默认的是all
distinct 指定所有的唯一非空值行
count (行的数目)
select count ( 列或者*) from 表
sum (总和)
select sum(计数规范)from

分组 (group by)
select 列a , 聚合函数 from 表 where 过滤条件 group by 列a (以列a来分组)

过滤聚合函数(having)
select 列a , 聚合函数 from 表 where 过滤条件 group by 列a having 聚合函数过滤条件

要注意的是 SQL语句的执行顺序
(5)select 列a , 聚合函数 (1) from 表 (2) where 过滤条件 (3) group by 列a (4) having 聚合函数过滤条件 (6) order by

课后练习
select * from nobel
– 1获奖总人数
select count (distinct winner) from nobel
– 2 诺贝尔 物理奖的获奖总次数
select count(subject)from nobel where subject=’Physics’
– 3 显示每个奖项的获奖总次数
select subject,count(subject)from nobel group by subject
– 4显示每个奖项第一次获得的年份
select min(yr) 年份,subject 奖项 from nobel group by subject
– 5 显示每个奖项在2000年来获得的人数
select subject 奖项,yr 年份 from nobel where yr=2000 group by subject ,yr
– 6 显示每个奖项不同获奖者的人数
select subject 奖项,count (distinct winner)from nobel group by subject
– 7 显示每个奖项 有多少年获奖
select subject 奖项,count (distinct yr)from nobel group by subject
– 8 显示当年有三个Physic的年份
select subject 奖项,yr 年份 from nobel where subject=’Physics’ group by yr, subject having count(winner)=3
– 9 得奖大于1的winner
select winner 获奖者 from nobel group by winner having count(subject)>1
–10 得到多个奖项的winner
select winner 获奖者 from nobel group by winner having count(distinct subject)>1
–11

<think>好的,我现在需要解决用户关于H2数据库聚合函数与GROUP BY的兼容性和用法的问题。首先,我需要回忆H2数据库的相关知识,特别是聚合函数和GROUP BY子句的使用情况。 用户提到的引用内容中有关于聚合操作和GROUP BY的说明,比如引用[1]提到分组时可以通过排序或哈希来处理,以及索引扫描的条件。引用[3]和[4]给出了SQL示例,包括HAVING子句和条件查询。这些内容可能对回答有帮助。 首先,我需要确认H2数据库是否遵循标准SQL的聚合函数和GROUP BY规则。标准SQL中,SELECT列表中的聚合列必须出现在GROUP BY子句中,否则会报错。但某些数据库如MySQL在宽松模式下允许非聚合列不在GROUP BY中,这可能引起兼容性问题。H2是否也有类似的情况呢? 根据我的知识,H2数据库默认遵循SQL标准,这意味着如果SELECT中的列没有在GROUP BY中出现且未使用聚合函数,会报错。但需要验证这一点是否正确,可能需要查阅H2的官方文档。例如,在H2中执行类似SELECT deptno, name, SUM(sal) FROM emp GROUP BY deptno这样的查询,如果name不在GROUP BY中,应该会报错,而MySQL在非严格模式下可能允许。 接下来,用户需要用法示例。我应该提供基本的GROUP BY示例,包括单列分组、多列分组,以及结合HAVING子句的使用。同时,结合引用[3]中的例子,展示如何筛选聚合结果。 另外,用户提到的兼容性问题可能涉及不同数据库之间的差异。比如,H2是否支持WITH ROLLUP这样的扩展功能?例如,MySQL支持WITH ROLLUP来生成小计行,而H2是否兼容这一点?需要确认H2的版本是否支持,根据文档,H2确实支持ROLLUP和CUBE,但可能需要特定的语法或设置。 此外,索引优化方面,引用[1]提到如果GROUP BY的列是索引的前缀,可以使用索引扫描优化查询。在H2中是否适用?需要说明H2在处理GROUP BY时的优化策略,比如是否自动利用索引来加速分组操作,或者需要手动创建合适的索引。 可能还需要提到H2特有的功能或限制,例如对某些聚合函数的支持情况,或者与其他数据库如MySQL的不同之处。例如,H2是否支持GROUPING SETS,或者其他高级分组功能? 最后,用户可能需要示例代码来更好地理解。例如,创建表、插入数据,然后演示不同GROUP BY查询,包括错误的情况和正确的用法,以及使用HAVING进行过滤。同时,指出在兼容性方面需要注意的地方,比如在迁移其他数据库的查询到H2时需要检查GROUP BY的列是否完整。 总结回答的结构:先说明H2对SQL标准的遵循情况,再讲GROUP BY的基本用法和示例,然后讨论兼容性问题,特别是与其他数据库的区别,接着给出优化建议,最后提供示例代码。同时,确保引用中的相关内容被合理引用,如索引优化部分引用[1],HAVING示例引用[3]等。</think>关于H2数据库聚合函数与GROUP BY用法及兼容性,以下从语法规范、兼容性差异、优化建议和示例四方面进行说明: --- ### 一、语法规范与基本用法 H2数据库严格遵循**SQL标准**对聚合函数和GROUP BY的要求: 1. **非聚合字段必须包含在GROUP BY** SELECT列表中的聚合字段必须在GROUP BY子句中出现,否则报错`Column "COLUMN_NAME" must be in GROUP BY clause`[^1] ```sql -- 错误示例(name未在GROUP BY中) SELECT deptno, name, SUM(salary) FROM employees GROUP BY deptno; -- 正确写法 SELECT deptno, MAX(name), SUM(salary) FROM employees GROUP BY deptno; ``` 2. **HAVING子句过滤分组结果** 与WHERE作用于单条记录不同,HAVING用于过滤聚合结果[^3] ```sql SELECT deptno, AVG(salary) FROM employees GROUP BY deptno HAVING AVG(salary) > 5000; ``` --- ### 二、兼容性差异 #### 1. 对比MySQL宽松模式 MySQL在非严格模式下允许SELECT列表包含非聚合字段(隐式随机取值),而H2始终严格校验: ```sql /* MySQL可能允许执行,H2报错 */ SELECT department, employee_name, COUNT(*) FROM projects GROUP BY department; ``` #### 2. 扩展功能支持 H2支持**WITH ROLLUP**和**CUBE**实现多级聚合: ```sql -- 生成小计行(兼容MySQL语法) SELECT deptno, job, SUM(salary) FROM employees GROUP BY ROLLUP(deptno, job); ``` --- ### 三、性能优化建议 1. **索引优化** 若GROUP BY字段是索引前缀,H2可通过索引顺序扫描加速分组操作[^1] ```sql CREATE INDEX idx_dept_job ON employees(deptno, job); -- 以下查询可利用索引优化 SELECT deptno, job, COUNT(*) FROM employees GROUP BY deptno, job; ``` 2. **内存配置** 大数据集分组时可通过`SET MAX_MEMORY_ROWS`调整内存分配避免溢出。 --- ### 四、完整示例 ```sql -- 建表 CREATE TABLE sales ( id INT PRIMARY KEY, region VARCHAR(50), product VARCHAR(50), amount DECIMAL(10,2) ); -- 基础分组 SELECT region, SUM(amount) AS total_sales FROM sales GROUP BY region; -- 多列分组+HAVING SELECT region, product, AVG(amount) FROM sales WHERE product <> 'Book' GROUP BY region, product HAVING AVG(amount) > 100; -- WITH ROLLUP SELECT region, product, COUNT(*) FROM sales GROUP BY ROLLUP(region, product); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值