当前位置: 首页 > news >正文

SQL学习笔记-聚合查询

非聚合查询和聚合查询的概念及差别

1. 非聚合查询

非聚合查询(Non-Aggregate Query)是指不使用聚合函数的查询。这类查询通常用于从表中检索具体的行和列数据,返回的结果是表中的原始数据。

示例

假设有一个名为 employees 的表,包含以下列:idnamedepartmentsalary

SELECT id, name, department, salary
FROM employees;

这个查询会返回 employees 表中的所有行和指定的列。

特点
  • 返回原始数据:结果是表中的实际行数据。

  • 不涉及数据汇总:不会对数据进行任何汇总或计算。

  • 可以使用 WHERE 子句过滤数据

    SELECT id, name, department, salary
    FROM employees
    WHERE department = 'Sales';

2. 聚合查询

聚合查询(Aggregate Query)是指使用聚合函数的查询。聚合函数用于对一组数据进行计算,返回单个值。常见的聚合函数包括 COUNTSUMAVGMINMAX

示例

假设我们想要统计每个部门的员工数量:

SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;

这个查询会返回每个部门的名称和该部门的员工数量。

特点
  • 返回汇总数据:结果是对一组数据进行计算后的汇总值。

  • 必须使用 GROUP BY 子句:如果查询中包含非聚合列,则需要使用 GROUP BY 子句对这些列进行分组。

  • 可以使用 HAVING 子句过滤分组

    SELECT department, COUNT(*) AS employee_count
    FROM employees
    GROUP BY department
    HAVING COUNT(*) > 5;

3. 聚合查询与非聚合查询的差别

特点非聚合查询聚合查询
返回数据类型返回表中的原始行数据返回汇总后的单个值
是否使用聚合函数不使用聚合函数使用聚合函数(如 COUNTSUMAVG 等)
是否需要 GROUP BY不需要如果查询中包含非聚合列,则需要 GROUP BY
数据量返回多行数据返回较少的行(通常是汇总后的数据)
用途用于检索具体数据用于数据汇总和统计

非分组聚合和分组聚合的概念和差别

在 SQL 中,分组聚合(Grouped Aggregation)和不分组聚合(Ungrouped Aggregation)是聚合查询的两种不同形式。它们的主要区别在于是否使用 GROUP BY 子句对数据进行分组。以下是对它们的概念和差别的详细解释。

1. 分组聚合(Grouped Aggregation)

分组聚合是指在执行聚合操作时,将数据分成多个组,每个组对应一个聚合结果。这通常通过 GROUP BY 子句实现。

概念
  • GROUP BY 子句:用于将数据按指定列分组。

  • 聚合函数:对每个分组的数据进行计算,返回每个分组的汇总值。

示例

假设有一个名为 employees 的表,包含以下列:idnamedepartmentsalary

SELECT department, COUNT(*) AS employee_count, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;

这个查询会按 department 列对数据进行分组,并计算每个部门的员工数量和平均工资。

结果

假设表数据如下:

idnamedepartmentsalary
1AliceSales5000
2BobMarketing6000
3CharlieSales5500
4DavidIT7000
5EveMarketing6500

查询结果:

departmentemployee_countavg_salary
Sales25250
Marketing26250
IT17000

2. 不分组聚合(Ungrouped Aggregation)

不分组聚合是指对整个表的数据进行聚合操作,不进行分组。这种查询返回的是整个表的汇总值。

概念
  • 聚合函数:对整个表的数据进行计算,返回单个汇总值。

  • 不使用 GROUP BY 子句:直接对整个表的数据进行聚合。

示例

假设有一个名为 employees 的表,包含以下列:idnamedepartmentsalary

SELECT COUNT(*) AS total_employees, AVG(salary) AS avg_salary
FROM employees;

这个查询会计算整个表的员工总数和平均工资。

结果

假设表数据如下:

idnamedepartmentsalary
1AliceSales5000
2BobMarketing6000
3CharlieSales5500
4DavidIT7000
5EveMarketing6500

查询结果:

total_employeesavg_salary
56000

3. 分组聚合与不分组聚合的差别

特点分组聚合(Grouped Aggregation)不分组聚合(Ungrouped Aggregation)
是否使用 GROUP BY
返回结果每个分组的汇总值整个表的汇总值
结果行数与分组数相同通常为一行
用途对数据进行分组汇总,适用于多维度分析对整个表的数据进行汇总,适用于全局统计
示例按部门统计员工数量和平均工资统计整个公司的员工总数和平均工资

4. 示例对比

假设我们有以下 employees 表:

idnamedepartmentsalary
1AliceSales5000
2BobMarketing6000
3CharlieSales5500
4DavidIT7000
5EveMarketing6500
分组聚合
SELECT department, COUNT(*) AS employee_count, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;

结果:

departmentemployee_countavg_salary
Sales25250
Marketing26250
IT17000
不分组聚合
SELECT COUNT(*) AS total_employees, AVG(salary) AS avg_salary
FROM employees;

结果:

total_employeesavg_salary
56000

总结

  • 分组聚合:通过 GROUP BY 子句对数据进行分组,返回每个分组的汇总值,适用于多维度分析。

  • 不分组聚合:对整个表的数据进行聚合,返回整个表的汇总值,适用于全局统计。

图示差别

 常见使用错误点

1.group by中使用了字段别名

2.where条件设置不对

3.selct和group by中的字段未一一映射

通过group去去重,将同一个名字或者同一个时间的内容聚合成一条数据去去重 ,可以类比成筛选(个人理解,如果有错误请评论区指正)

回顾 

示例 

相关文章:

  • 16:00开始面试,16:08就出来了,问的问题有点变态。。。
  • 大数据学习栈记——MongoDB编程
  • 【Web三十一】K8S的常用命令
  • 设计模式-模板模式
  • Node.js 模块包的管理和使用是
  • Qt:解决MSVC编译器下qDebug输出中文乱码的问题
  • 中英文提示词对AI IDE编程能力影响有多大?
  • 三层交换机SVI功能(交换机虚拟接口)实现各个实训室电脑网络可互通,原本是独立局域网
  • MATLAB仿真多相滤波抽取与插值的频谱变化(可视化混叠和镜像)
  • TypeScript 进阶指南 - 使用泛型与keyof约束参数
  • spark简介和核心编程
  • spark-sql核心
  • 试一下阿里云新出的mcp服务
  • 鸿蒙动画与交互设计:ArkUI 3D变换与手势事件详解
  • 【字节跳动AI论文】Seaweed-7B:视频生成基础模型的高成本效益培训
  • 栈与队列习题分享(精写)
  • chrome无法访问此网站怎么回事 分享5种解决方法
  • 模拟集成电路设计与仿真 : PLL
  • CentOS DVD完整版与Minimal版的区别
  • 筛选条件在on和where中的区别(基于hivesql)
  • 夜读丨取稿费的乐趣
  • 区域国别学视域下的东亚文化交涉
  • 总没胃口,一吃就饱……别羡慕,也可能是生病了
  • 今起公开发售,宁德时代将于5月20日在港股上市
  • 来伊份深夜回应“粽子中吃出疑似创可贴”:拿到实物后会查明原因
  • 著名学者黄修己去世,享年90岁