where与 group by 与 having

本文详细解析了SQL语句中GROUP BY与HAVING子句的使用规则,强调GROUP BY应在WHERE之后、ORDER BY之前使用,而HAVING则位于ORDER BY之后。文章还解释了除聚集函数外,SELECT中的所有列都应在GROUP BY中出现,否则查询结果可能出错。通过实例展示了如何正确使用GROUP BY和HAVING,并提供了通过LEFT JOIN获取分组后字段的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前. HAVING语句必须在ORDER BY子句之后。(where先执行,再groupby分组;groupby先分组,having再执行。)

 

2. 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子

句中给出。count()为聚集函数,vend_id在后面groupby中有,所以select后面有。

select vend_id, count(*) , sales  from products group by vend_id;

这个语句,其中sales字段,在group by中没有,所以查询的结果,sales的值是错误的!!!(切记)

 

如果想用分组后的,sales的字段,可以采用left join的方式,相当于两个表匹配的方式,查询:(原始表B)

select vend_id, sales from B left join (select vend_id, count(*) nums, min(sales) sales   from products group by vend_id) as A on B.vend_id = A.vend_id WHERE.......

 

 

3. 语句顺序

摘自:MYSQL必知必会

### SQL 中 GROUP BYWHEREHAVING 的区别及用法 在 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 的部门。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值