Sql简介 专题
专题目录
您的位置:database > Sql简介专题 > SQL Having子句
SQL Having子句
作者:--    发布时间:2019-11-20

本教程将向您介绍sql having子句,该子句用于为group by子句汇总的组指定条件。

1. sql having子句简介

在上一个教程中,我们学习了如何使用group by子句将行汇总到分组中,并将聚合函数(如min,max,sum,count,avg)应用于每个分组。

要指定分组的条件,请使用having子句。

having子句通常与select语句中的group by子句一起使用。 如果使用带group by子句的having子句,having子句的行为类似于where子句

以下是having子句的语法:

select
    column1,
    column2,
    aggregate_function (column3)
from
    table1
group by
    column1,
    column2
having
    group_condition;

请注意,having子句紧跟在group by子句之后出现。

having与where
在通过group by子句将行汇总到分组之前,where子句将条件应用于各个行。 但是,having子句在将行分组到组之后将条件应用于组。

因此,需要注意的是,在group by子句之前应用where子句之后应用having子句。

2. sql having子句示例

我们将使用示例数据库中的employeesdepartments表进行演示。

要获取经理及其下属员工数量,请使用group by子句按管理员对员工进行分组,并使用count函数计算下属员工数量。

以下查询实现了上面要求:

select 
    manager_id,
    first_name,
    last_name,
    count(employee_id) direct_reports
from
    employees
where
    manager_id is not null
group by manager_id;

执行上面查询语句,得到以下结果:

要查找至少包含五个下属员工的经理,请在上面的查询中添加having子句,如下所示:

select 
    manager_id,
    first_name,
    last_name,
    count(employee_id) direct_reports
from
    employees
where
    manager_id is not null
group by manager_id
having direct_reports >= 5;

执行上面查询语句,得到以下结果:

+------------+------------+-----------+----------------+
| manager_id | first_name | last_name | direct_reports |
+------------+------------+-----------+----------------+
|        100 | neena      | wong      |             14 |
|        101 | nancy      | chen      |              5 |
|        108 | daniel     | chen      |              5 |
|        114 | alexander  | su        |              5 |
+------------+------------+-----------+----------------+
4 rows in set

2.1. sql having与sum函数示例

以下语句计算公司为每个部门支付的工资总和,并仅选择工资总和在2000030000之间的部门。

select 
    department_id, sum(salary)
from
    employees
group by department_id
having sum(salary) between 20000 and 30000
order by sum(salary);

执行上面查询语句,得到以下结果 -

+---------------+-------------+
| department_id | sum(salary) |
+---------------+-------------+
|            11 | 20300.00    |
|             3 | 24900.00    |
|             6 | 28800.00    |
+---------------+-------------+
3 rows in set

2.2. sql having与min函数示例

要查找具有最低工资大于10000的员工的部门,请使用以下查询:

select
    e.department_id,
    department_name,
    min(salary)
from
    employees e
inner join departments d on d.department_id = e.department_id
group by
    e.department_id
having
    min(salary) >= 10000
order by
    min(salary);

执行上面查询语句,得到以下结果 -

+---------------+-----------------+-------------+
| department_id | department_name | min(salary) |
+---------------+-----------------+-------------+
|             7 | 公共关系        | 10000       |
|             9 | 行政人员        | 17000       |
+---------------+-----------------+-------------+
2 rows in set

以上查询的工作原理。

  • 首先,使用group by子句按部门对员工进行分组。
  • 其次,使用min函数查找每个分组最低工资。
  • 第三,将条件应用于having子句。

2.3. sql having子句带有avg函数的示例
要查找员工平均薪水在50007000之间的部门,请使用avg函数如下查询语句:

select
    e.department_id,
    department_name,
    round(avg(salary), 2)
from
    employees e
inner join departments d on d.department_id = e.department_id
group by
    e.department_id
having
    avg(salary) between 5000
and 7000
order by
    avg(salary);

执行上面示例代码,得到以下结果:

+---------------+-----------------+-----------------------+
| department_id | department_name | round(avg(salary), 2) |
+---------------+-----------------+-----------------------+
|             6 | it              | 5760                  |
|             5 | 运输            | 5885.71               |
|             4 | 人力资源        | 6500                  |
+---------------+-----------------+-----------------------+
3 rows in set

在本教程中,您学习了如何使用sqlhaving子句将条件应用于分组。


网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册