sql
一、group子句
以下是一个包含 GROUP BY
子句的示例,并以 Markdown 表格形式展示数据:
员工信息表
员工编号 | 部门编号 | 工资 |
---|---|---|
1 | 10 | 8000 |
2 | 10 | 9000 |
3 | 20 | 7000 |
4 | 20 | 6000 |
5 | 30 | 10000 |
以下是使用 GROUP BY
子句计算每个部门的平均工资的 SQL 语句和结果:
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;
部门编号 | 平均工资 |
---|---|
10 | 8500 |
20 | 6500 |
30 | 10000 |
Group本质上是按新主键生成一个新的表格
1、通常情况下,GROUP BY 后面的列名并非表格的主键。以员工信息表为例,每行代表一个员工,而多个员工可能隶属于同一个部门。在这种情况下,部门department_id列就可能存在多个相同的值。
2、当执行 GROUP BY 操作后,生成的新表格的主键将变为 GROUP BY 后面指定的列名 1、列名 2 等。
此外,在 SELECT 语句中,除了 GROUP BY 后面指定的列名外,其他列名必须以聚合函数的形式出现。常见的聚合函数包括 AVG(平均值)、SUM(总和)、COUNT(计数)、MIN(最小值)和 MAX(最大值)等。
比如salary只能以avg的形式出现
聚合函数和GROUP本质是纵向压缩,会减少结果集
二、条件函数和窗口函数
1.条件函数
、条件函数
- CASE WHEN 函数
SELECT student_id, score,
CASE WHEN score >= 90 THEN 'A'
WHEN score >= 80 AND score < 90 THEN 'B'
WHEN score >= 70 AND score < 80 THEN 'C'
WHEN score >= 60 AND score < 70 THEN 'D'
ELSE 'F'
END AS grade
FROM students;
条件函数会根据条件生成一个新列,这个新列根据已有列产生,本质上横向扩展
2.窗口函数
窗口函数的本质仍然是生成一个新列,横向扩展
常用于数据分组之后,组内排序
例:使用窗口函数为每个员工在其部门内按工资降序排名:
SELECT employee_id, department_id, salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
FROM employees;
总结
理解横向扩展和纵向扩展