非聚合查询和聚合查询的概念及差别
1. 非聚合查询
非聚合查询(Non-Aggregate Query)是指不使用聚合函数的查询。这类查询通常用于从表中检索具体的行和列数据,返回的结果是表中的原始数据。
示例
假设有一个名为 employees
的表,包含以下列:id
、name
、department
和 salary
。
SELECT id, name, department, salary
FROM employees;
这个查询会返回 employees
表中的所有行和指定的列。
特点
返回原始数据:结果是表中的实际行数据。
不涉及数据汇总:不会对数据进行任何汇总或计算。
可以使用
WHERE
子句过滤数据SELECT id, name, department, salary FROM employees WHERE department = 'Sales';
2. 聚合查询
聚合查询(Aggregate Query)是指使用聚合函数的查询。聚合函数用于对一组数据进行计算,返回单个值。常见的聚合函数包括 COUNT
、SUM
、AVG
、MIN
和 MAX
。
示例
假设我们想要统计每个部门的员工数量:
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. 聚合查询与非聚合查询的差别
特点 | 非聚合查询 | 聚合查询 |
---|---|---|
返回数据类型 | 返回表中的原始行数据 | 返回汇总后的单个值 |
是否使用聚合函数 | 不使用聚合函数 | 使用聚合函数(如 COUNT 、SUM 、AVG 等) |
是否需要 GROUP BY |
不需要 | 如果查询中包含非聚合列,则需要 GROUP BY |
数据量 | 返回多行数据 | 返回较少的行(通常是汇总后的数据) |
用途 | 用于检索具体数据 | 用于数据汇总和统计 |
非分组聚合和分组聚合的概念和差别
在 SQL 中,分组聚合(Grouped Aggregation)和不分组聚合(Ungrouped Aggregation)是聚合查询的两种不同形式。它们的主要区别在于是否使用 GROUP BY
子句对数据进行分组。以下是对它们的概念和差别的详细解释。
1. 分组聚合(Grouped Aggregation)
分组聚合是指在执行聚合操作时,将数据分成多个组,每个组对应一个聚合结果。这通常通过 GROUP BY
子句实现。
概念
GROUP BY
子句:用于将数据按指定列分组。聚合函数:对每个分组的数据进行计算,返回每个分组的汇总值。
示例
假设有一个名为 employees
的表,包含以下列:id
、name
、department
和 salary
。
SELECT department, COUNT(*) AS employee_count, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
这个查询会按 department
列对数据进行分组,并计算每个部门的员工数量和平均工资。
结果
假设表数据如下:
id | name | department | salary |
---|---|---|---|
1 | Alice | Sales | 5000 |
2 | Bob | Marketing | 6000 |
3 | Charlie | Sales | 5500 |
4 | David | IT | 7000 |
5 | Eve | Marketing | 6500 |
查询结果:
department | employee_count | avg_salary |
---|---|---|
Sales | 2 | 5250 |
Marketing | 2 | 6250 |
IT | 1 | 7000 |
2. 不分组聚合(Ungrouped Aggregation)
不分组聚合是指对整个表的数据进行聚合操作,不进行分组。这种查询返回的是整个表的汇总值。
概念
聚合函数:对整个表的数据进行计算,返回单个汇总值。
不使用
GROUP BY
子句:直接对整个表的数据进行聚合。
示例
假设有一个名为 employees
的表,包含以下列:id
、name
、department
和 salary
。
SELECT COUNT(*) AS total_employees, AVG(salary) AS avg_salary
FROM employees;
这个查询会计算整个表的员工总数和平均工资。
结果
假设表数据如下:
id | name | department | salary |
---|---|---|---|
1 | Alice | Sales | 5000 |
2 | Bob | Marketing | 6000 |
3 | Charlie | Sales | 5500 |
4 | David | IT | 7000 |
5 | Eve | Marketing | 6500 |
查询结果:
total_employees | avg_salary |
---|---|
5 | 6000 |
3. 分组聚合与不分组聚合的差别
特点 | 分组聚合(Grouped Aggregation) | 不分组聚合(Ungrouped Aggregation) |
---|---|---|
是否使用 GROUP BY |
是 | 否 |
返回结果 | 每个分组的汇总值 | 整个表的汇总值 |
结果行数 | 与分组数相同 | 通常为一行 |
用途 | 对数据进行分组汇总,适用于多维度分析 | 对整个表的数据进行汇总,适用于全局统计 |
示例 | 按部门统计员工数量和平均工资 | 统计整个公司的员工总数和平均工资 |
4. 示例对比
假设我们有以下 employees
表:
id | name | department | salary |
---|---|---|---|
1 | Alice | Sales | 5000 |
2 | Bob | Marketing | 6000 |
3 | Charlie | Sales | 5500 |
4 | David | IT | 7000 |
5 | Eve | Marketing | 6500 |
分组聚合
SELECT department, COUNT(*) AS employee_count, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
结果:
department | employee_count | avg_salary |
---|---|---|
Sales | 2 | 5250 |
Marketing | 2 | 6250 |
IT | 1 | 7000 |
不分组聚合
SELECT COUNT(*) AS total_employees, AVG(salary) AS avg_salary
FROM employees;
结果:
total_employees | avg_salary |
---|---|
5 | 6000 |
总结
分组聚合:通过
GROUP BY
子句对数据进行分组,返回每个分组的汇总值,适用于多维度分析。不分组聚合:对整个表的数据进行聚合,返回整个表的汇总值,适用于全局统计。
图示差别
常见使用错误点
1.group by中使用了字段别名
2.where条件设置不对
3.selct和group by中的字段未一一映射
通过group去去重,将同一个名字或者同一个时间的内容聚合成一条数据去去重 ,可以类比成筛选(个人理解,如果有错误请评论区指正)
回顾
示例