where group by having语句详解(必须掌握的sql语句重点)(详细)
首先我们思考这几个问题
- 在编写sql语句的时候,他们的作用都是一样的,后面接判断条件。where和having到底怎么区别?
- group by 语句怎么用?他有什么作用?
- where后面可以使用聚合函数吗?
- 聚合函数可以在哪使用?
这里先给出答案(结论):
-
having只能对group by的结果进行操作,必须接在group by的后面,而where不能接在group by的后面。
-
where执行的过程是:根据条件,从from的表中取出一条一条的元组(一条数据)组成一个元组集合。
where子句可以独立完成
-
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。
-
聚集函数也叫列函数,它们都是基于整列数据进行计算的,聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!
-
where子句还处于“确定”结果集的过程中,因而不能使用聚集函数。
注:(元组:就是一行数据)
要想了解这些结论,我们来看看sql语句执行的原理:
- FROM 子句返回初始元组集和。
- WHERE 子句排除不满足搜索条件的行。返回一个元组集和。
- GROUP BY 子句将选定的行收集到 GROUP BY 子句中各个唯一值的组中。
- HAVING 子句排除不满足搜索条件的行。后面可以接聚合函数
- ORDER BY 对结果集进行排序。
- SELECT 查找你要搜索的字段。
我们要注意:group by和聚合函数都只能对where查询出来的结果集进行操作。
举例说明:
--选择数学语文总分大于190的学生,按学号排序 SELECT sno,name,SUM(grade) from sc where cno in ('数学','语文') group by sno having SUM(grade)>300 order by sno
这个句子的执行过程是这样的
那么我们不能在where子句中使用这些聚合函数,为什么呢?
聚集函数也叫列函数,它们都是基于整列数据进行计算的,而where子句则是对数据行进行过滤的(这里过滤是在一个记录里边过滤的,基于"行"),where 会根据后面的条件进行结果集的确定,而聚合函数是对结果集进行操作,它两组合在一起是矛盾的。更简单地说,因为聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!(要在步骤2结束后才能对where确定的结果集进行操作)
where子句还处于“确定”结果集的过程中,因而不能使用聚集函数。
注意:我们给出的例子有错误的地方:
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。
这是一个group by语句的一个原则。自己写语句的时候一定要注意!!!
例子正确的写法:
--选择数学语文总分大于190的学生,按学号排序 SELECT sno,name,SUM(grade) from sc where cno in ('数学','语文') group by sno,name --(这里一定包含全部select 语句后不是聚合函数的属性) having SUM(grade)>300 order by sno
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)