GROUP BY,WHERE,HAVING之间的区别和用法

本文详细解析了SQL查询中WHERE与HAVING子句的区别及应用。强调了聚合函数如SUM、COUNT等在数据处理中的作用,并通过实例说明了如何利用GROUP BY与HAVING子句对分组数据进行筛选。
having子句与where有相似之处但也有区别,都是设定条件的语句。
在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。
简单说来:
where子句:
select sum(num) as rmb from order where id>10//只有先查询出id大于10的记录才能进行聚合语句

having子句:
select reportsto as manager, count(*) as reports from employees group by reportsto having count(*) > 4
以northwind库为例.having条件表达示为聚合语句。肯定的说having子句查询过程执行优先级别低于聚合语句。
再换句说话说把上面的having换成where则会出错。统计分组数据时用到聚合语句。
对分组数据再次判断时要用having。如果不用这些关系就不存在使用having。直接使用where就行了。
having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。

聚合函数,这是必需先讲的一种特殊的函数:
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
SELECT SUM(population) FROM tablename这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有国家的总人口数。通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。
当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值.
也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值.
HAVING子句可以让我们筛选成组后的各组数据.HAVING子句在聚合后对组记录进行筛选而WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前看下面这几个例子吧:

一、显示每个地区的总人口数和总面积.
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。

二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,HAVING子句可以让我们筛选成组后的各组数据
### SQL 中 GROUP BYWHERE HAVING区别用法 在 SQL 查询中,`GROUP BY`、`WHERE` `HAVING` 是三个重要的子句,用于对数据进行筛选分组操作。以下是它们的区别及具体用法: #### 1. **WHERE 子句** `WHERE` 子句用于在查询过程中筛选符合条件的行。它作用于原始数据表中的每一行,在分组之前执行筛选操作。因此,`WHERE` 子句不能直接与聚合函数一起使用[^3]。 示例代码: ```sql SELECT column1, COUNT(column2) AS count_column2 FROM table_name WHERE column1 > 100 GROUP BY column1; ``` 在这个例子中,`WHERE column1 > 100` 在分组前筛选出所有满足条件的行[^1]。 #### 2. **GROUP BY 子句** `GROUP BY` 子句用于将具有相同值的行分组在一起。通常与聚合函数(如 `COUNT`、`SUM`、`AVG` 等)结合使用,生成每个分组的汇总信息。分组操作发生在 `WHERE` 子句之后[^2]。 示例代码: ```sql SELECT column1, COUNT(column2) AS count_column2 FROM table_name GROUP BY column1; ``` 此查询将按 `column1` 的值对结果进行分组,并计算每组中 `column2` 的数量[^2]。 #### 3. **HAVING 子句** `HAVING` 子句用于在分组后对分组结果进行进一步筛选。与 `WHERE` 不同,`HAVING` 子句可以与聚合函数一起使用,因为它是在分组完成后对汇总数据进行过滤[^4]。 示例代码: ```sql SELECT region, SUM(population) AS total_population, SUM(area) AS total_area FROM bbc GROUP BY region HAVING SUM(population) > 1000000; ``` 在此查询中,`HAVING SUM(population) > 1000000` 仅保留那些总人口数超过 1,000,000 的地区。 #### 执行顺序 在一个包含 `WHERE`、`GROUP BY` `HAVING` 的查询中,SQL 的执行顺序如下: 1. `FROM` `JOIN`:确定数据源。 2. `WHERE`:筛选符合条件的行。 3. `GROUP BY`:将数据分组。 4. 聚合函数计算:对每组数据应用聚合函数。 5. `HAVING`:筛选符合聚合条件的分组结果。 6. `SELECT`:选择最终输出的列[^3]。 #### 总结 - `WHERE` 用于在分组前筛选行,不能与聚合函数一起使用。 - `GROUP BY` 用于将数据分组,通常与聚合函数结合使用。 - `HAVING` 用于在分组后筛选分组结果,可以与聚合函数一起使用。 ### 示例综合代码 以下是一个综合示例,展示如何同时使用 `WHERE`、`GROUP BY` `HAVING`: ```sql SELECT department, COUNT(*) AS employee_count FROM employees WHERE salary > 5000 GROUP BY department HAVING COUNT(*) > 10; ``` 此查询将筛选出薪资大于 5000 的员工,按部门分组,并仅显示员工数超过 10 的部门。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值