1. 概述
分组数据是SQL中非常重要的计算功能之一。通过将数据分组,我们可以在每个组内执行聚合函数操作,例如求和、平均值、最大/最小值等。在Oracle中,GROUP BY子句是用于分组数据的关键字。
2. GROUP BY语法
GROUP BY子句作用于SELECT语句的结果集,按指定的列对结果进行分组。它的基本语法如下:
SELECT column1, column2, ...
FROM table_name
WHERE condition
GROUP BY column1, column2, ...
ORDER BY column_name;
其中,column1, column2, ... 是要进行分组的列名,condition是WHERE子句中筛选条件的逻辑表达式,ORDER BY子句指定结果排序的列名和排序方向(ASC为升序,DESC为降序)。
3. GROUP BY示例
我们以以下示例表格为例,通过GROUP BY语句演示如何按City列对数据进行分组:
Name | City | Salary |
---|---|---|
Tom | Beijing | 5000 |
Jerry | Shanghai | 6000 |
Alice | Beijing | 7000 |
Bob | Shanghai | 5500 |
3.1 按City列分组
以下是按City列对数据进行分组的SQL语句:
SELECT City, SUM(Salary)
FROM Employee
GROUP BY City;
查询结果如下:
City | SUM(Salary) |
---|---|
Beijing | 12000 |
Shanghai | 11500 |
以上SQL语句通过SUM函数对Salary列进行求和,得到每个City的Salary总和,并对结果进行分组。
3.2 按多个列分组
以下是按City和Name列对数据进行分组的SQL语句:
SELECT City, Name, SUM(Salary)
FROM Employee
GROUP BY City, Name;
查询结果如下:
City | Name | SUM(Salary) |
---|---|---|
Beijing | Alice | 7000 |
Beijing | Tom | 5000 |
Shanghai | Bob | 5500 |
Shanghai | Jerry | 6000 |
以上SQL语句在GROUP BY子句中指定了两个列名,分别对City和Name列进行分组,并使用SUM函数对Salary列进行求和。
4. HAVING语法
HAVING子句是用于对分组后的结果进行筛选的关键字,它可以在GROUP BY子句之后使用。
与WHERE子句类似,HAVING子句也是逻辑表达式,代表要筛选的条件。它基本的语法如下:
SELECT column1, column2, ...
FROM table_name
WHERE condition
GROUP BY column1, column2, ...
HAVING condition
ORDER BY column_name;
其中,HAVING子句包含分组函数(如SUM、COUNT、AVG、MAX、MIN等)和逻辑运算符(如AND、OR、NOT等),用于对分组后的结果进行逻辑筛选。与WHERE子句不同的是,HAVING子句作用于分组后的结果。
5. HAVING示例
以下是使用HAVING子句筛选结果的示例:
5.1 过滤City的平均工资大于5500的结果
SELECT City, AVG(Salary)
FROM Employee
GROUP BY City
HAVING AVG(Salary)>5500;
查询结果如下:
City | AVG(Salary) |
---|---|
Beijing | 6000 |
Shanghai | 5750 |
以上SQL语句使用AVG函数计算每个City的平均工资,然后对结果进行分组,并筛选出平均工资大于5500的结果。
5.2 过滤City的总工资大于10000的结果
SELECT City, SUM(Salary)
FROM Employee
GROUP BY City
HAVING SUM(Salary)>10000;
查询结果如下:
City | SUM(Salary) |
---|---|
Beijing | 12000 |
以上SQL语句使用SUM函数计算每个City的工资总和,然后对结果进行分组,并筛选出总工资大于10000的结果。
6. 结论
通过分组数据和HAVING筛选,我们可以获得更加细化的结果,以满足不同的分析需求。然而,需要注意的是,在分组数据过程中,我们需要仔细选择分组列和聚合函数,避免产生意外的结果。