数据库
SQL中的GROUP BY子句
1. 基本用法
GROUP BY 子句是SQL中用于对结果集进行分组的关键字。它通常与聚合函数(如SUM() 、AVG() 、MAX() 、MIN() 、COUNT() 等)一起使用,以便对每个分组进行统计计算。
基本语法如下:
SELECT column1, column2, AGGREGATE_FUNCTION(column3)
FROM table_name
WHERE condition
GROUP BY column1, column2;
在这个语法中,column1 和column2 是你希望按它们进行分组的列,而AGGREGATE_FUNCTION(column3) 是你希望对分组后的数据应用的聚合函数。
2. 作用
GROUP BY 子句的主要作用是:
- 数据分组:它允许你根据一个或多个列的值将结果集中的行分成多个组。
- 聚合计算:结合聚合函数,它允许你对每个分组中的数据进行统计计算,如求和、求平均、找最大值、找最小值或计数等。
3. 示例
假设你有一个名为sales 的表,其中包含以下列:salesperson (销售人员)、region (地区)和amount (销售额)。你想计算每个销售人员在不同地区的总销售额。
你可以使用以下SQL语句:
SELECT salesperson, region, SUM(amount) AS total_sales
FROM sales
GROUP BY salesperson, region;
这个查询将返回每个销售人员在不同地区的总销售额。结果集中的每一行都代表一个销售人员-地区组合的总销售额。
4. 注意事项
- 在使用
GROUP BY 子句时,SELECT列表中的非聚合列必须包含在GROUP BY 子句中。
- 如果
GROUP BY 子句中包含多个列,那么结果集将按照这些列的组合进行分组。
- 对于包含NULL值的列,
GROUP BY 会将其视为相同的值进行分组(即所有NULL值都会被分到同一个组中)。但是,在使用聚合函数时,NULL值通常会被忽略(除非使用的是COUNT() 函数)。
对分组后的数据再进行过滤
HAVING子句是SQL中用于对分组后的数据进行过滤的关键字。它基于分组后的结果集进行条件筛选,而不是原始数据。因此,HAVING子句通常与GROUP BY子句一起使用。
select deptno, avg(sal) as "平均工资"
from emp
group by deptno
having avg(sal) >2000

连接查询:将两个表或两个以上的表以一定的连接条件连接起来,从中检索满足条件的数据

select top 3from emp "E"join dept "D"on "E".deptno = "D".deptnojoin salgrade "S"on "E".sal between "S".losal and "S".hisalwhere "D".dname not like "%A%"order by "E".sal desc
习题1:输出每个员工的姓名 部门编号 薪水 和薪水登记
select "E".ename, "E".deptno, "E".sal, "S".gradefrom emp "E"join salgrate "S"on "E".sal between "S".lowsal and "S".hisal
习题2:查找每个部门的编号,该部门所有员工的平均工资,平均工资的等级
select "T".deptno, "T".avg_sal, "S".gradefrom(select deptno, avg(sal) as "avg_sal"from empgroup by deptno) "T"join salgrade "S"on "T".avg_sal between "S".losal and "S".hisal-- 等价于
select "T".deptno, "T".avg_sal, "S".gradefrom salgrade "S"join (select deptno, avg(sal) as "avg_sal"from empgroup by deptno) "T"on "T".avg_sal between "S".losal and "S".hisal-- 等价于
select "T".deptno, "T".avg_sal, "S".gradefrom salgrade "S",(select deptno, avg(sal) as "avg_sal"from empgroup by deptno) "T"where "T".avg_sal between "S".losal and "S".hisal
|