`
jackroomage
  • 浏览: 1217932 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

having和where子句的区别

阅读更多

 1.作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组(group)。

eg:SELECT city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);

2.WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。 因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数。 (严格说来,你可以写不使用聚集的 HAVING 子句, 但这样做只是白费劲。同样的条件可以更有效地用于 WHERE 阶段。)

在前面的例子里,我们可以在 WHERE 里应用城市名称限制,因为它不需要聚集。 这样比在 HAVING 里增加限制更加高效,因为我们避免了为那些未通过 WHERE 检查的行进行分组和聚集计算。
以下示例使用的数据库是MySQL 5。
数据表:student
表结构:
Field Name DataType Len
id                int           20
name           varchar    25
major           varchar    25
score           int           20
sex              varchar    20

表数据:
编号/姓名/专业/学分/性别
id   name major     score sex
1    jak    Chinese    40    f
2    rain    Math        89    m
3    leo    Phy          78    f
4    jak    Math         76    f
5    rain    Chinese   56    m
6    leo    Math         97    f
7    jak    Phy          45    f
8    jak    Draw         87    f
9    leo    Chinese    45    f

现在我们要得到一个视图:
要求查询性别为男生,并且列出每个学生的总成绩:
SQL:
select s.*,sum(s.score) from student s where sex='f' group by s.name

Result:
id   name major     score sex
sum(s.score)
1    jak    Chinese    40    f       248
3    leo    Phy         78     f       220

可以看到总共查到有两组,两组的学生分别是jak和leo,每一组都是同一个学生,这样我们就可以使用
聚合函数了。
只有使用了group by语句,才能使用如:count()、sum()之类的聚合函数。

下面我们再对上面的结果做进一步的筛选,只显示总分数大于230的学生:
SQL:
select s.*,sum(s.score) from student s where sex='f' group by s.name having sum(s.score)>230

Result:
id   name major     score       sex   sum(s.score)
1    jak    Chinese    40          f       248

可见having于where的功能差不多。

结论:
1.WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
2.GROUP BY 子句用来分组 WHERE 子句的输出。
3.HAVING 子句用来从分组的结果中筛选行。

分享到:
评论

相关推荐

    T-SQL中where子句与having子句的对比分析.pdf

    在 SELECT 语句中,WHERE 子句和 HAVING 子句都是用来对数据进行筛选的,但是它们之间存在着一些区别和联系。 首先,让我们看一下 SELECT 语句的基本格式: SELECT 表达式 列表 FROM 基本表或视图名称 WHERE 查询...

    SQL中where子句与having子句的区别小结

    总结来说,`WHERE`子句和`HAVING`子句在SQL查询中的主要区别在于: 1. `WHERE`作用于数据分组前,适用于单行数据的筛选。 2. `HAVING`作用于数据分组后,适用于对分组后的数据进行筛选。 3. `WHERE`不支持聚合函数,...

    where和having区别

    #### WHERE子句 `WHERE`子句主要用于在执行聚合操作之前过滤行。它是在执行任何分组或计算之前筛选出满足条件的数据行。换句话说,`WHERE`子句是在数据行级别进行过滤。 **特点:** 1. **作用于单个行**:`WHERE`...

    详析SQL语言的WHERE子句与HAVING子句.pdf

    WHERE子句和HAVING子句的主要区别在于它们处理数据的时机和方式。WHERE在数据被分组前进行过滤,而HAVING则在数据分组后对聚合结果进行过滤。WHERE适用于单行记录级别的筛选,而HAVING则适用于多行数据的汇总筛选。 ...

    sql中where和having 区别

    总结一下,`WHERE`和`HAVING`子句的主要区别在于: 1. `WHERE`子句在聚合函数之前应用,用于筛选单行数据; 2. `HAVING`子句在`GROUP BY`之后应用,用于筛选聚合后的数据组; 3. `WHERE`不能与聚合函数一起直接使用...

    oracle中where 子句和having子句中的区别介绍

    在Oracle数据库中,`WHERE`子句和`HAVING`子句都是用于限制查询结果的条件,但它们在SQL查询中的使用场景和功能有所差异。 首先,`WHERE`子句主要用于在`FROM`子句中指定的表或联接后的结果集上筛选行。它在查询...

    where和having的区别

    ### Oracle SQL 中 WHERE 和 HAVING 的区别 在数据库查询语言SQL中,`WHERE`和`HAVING`子句都是用于过滤数据的关键字,但它们的应用场景和语法结构有着明显的不同。下面将详细介绍这两个关键字的区别。 #### 1. ...

    精确分析MySQL数据库中优化WHERE子句

    精确分析MySQL数据库中优化WHERE子句 在 MySQL 数据库中,WHERE 子句的优化是非常重要的,因为它可以极大地提高查询的效率。本文将详细分析 MySQL 数据库中优化 WHERE 子句的方法和技巧。 删除不必要的括号 在 ...

    精通HAVING子句:分组后条件过滤的SQL应用

    与WHERE子句在分组前对数据进行过滤不同,HAVING子句在分组后对分组的结果进行过滤。本文将详细介绍如何使用HAVING子句进行分组后的条件过滤,并探讨其在实际数据库开发中的应用。 在SQL中,GROUP BY子句用于将结果...

    SQL中Having与Where的区别

    `HAVING`子句的出现是为了弥补`WHERE`在处理聚合函数时的不足,它使得我们能够在分析和汇总数据时进行更复杂的过滤。同时,`HAVING`同样支持逻辑运算符和比较操作,可以与其他聚合函数一起使用,构建更复杂的查询...

    sql/having用法

    这点与 WHERE 子句不同,WHERE 子句可以对单个记录进行筛选。 其次,HAVING 子句条件中只能涉及常量、聚组函数或 GROUP BY 子句中的列。这意味着,HAVING 子句不能用于对其他列进行筛选,否则将会出现错误。 最后...

    SQL_HAVING_使用详解

    #### 二、HAVING 子句与 WHERE 子句的区别 - **WHERE 子句**:用于在数据分组之前对数据进行过滤,它只能包含非聚合表达式。 - **GROUP BY 子句**:用于根据一个或多个列将结果集分组。 - **HAVING 子句**:用于在...

    having语句的用法

    同时,你可以在同一个查询中同时使用`WHERE`和`HAVING`子句,`WHERE`先执行,`HAVING`后执行。 在查询设计器中,你可以直观地创建和编辑`WHERE`和`HAVING`子句。通常,当你在网格窗格中为列指定搜索条件时,系统会...

    精细化数据筛选:HAVING子句在SQL中的威力

    `HAVING` 子句与 `WHERE` 子句的区别 - `WHERE` 子句:在数据分组之前对原始数据进行过滤。 - `HAVING` 子句:在数据分组之后对分组结果进行过滤。 ##### 4. 示例:使用 `HAVING` 子句过滤分组数据 假设有一个名...

    条件子句在SQL查询中的应用.pdf

    WHERE子句和HAVING子句的主要区别在于它们的应用时机和数据类型。WHERE子句在数据分组之前进行过滤,用于处理行级别的数据,而HAVING子句则在数据分组之后进行过滤,适用于处理聚合后的结果集,也就是组级别的数据。...

    数据库笔试题之查询语句where,group by,having,order by执行与编写顺序详解

    数据库查询语句执行顺序与编写顺序...WHERE子句用于过滤数据,GROUP BY子句用于分组数据,HAVING子句用于筛选分组后的数据,ORDER BY子句用于排序数据。索引可以提高查询速度,但需要根据实际情况选择是否使用索引。

    数据库SQL中having和where的用法区别

    在SQL查询中,`WHERE`和`HAVING`都是用于过滤数据,但它们的作用范围和时机有所不同。`WHERE`子句主要用于在数据聚合之前筛选行,而`HAVING`子句则在数据聚合之后用于进一步筛选由`GROUP BY`生成的组。 1. **WHERE...

    SQL 中having 和where的区别分析

    在SQL查询中,`WHERE`和`HAVING`子句都是用来过滤数据的,但它们在功能和使用场景上有着显著的区别。理解这两者之间的差异对于编写高效的SQL语句至关重要。 首先,`WHERE`子句主要用于在数据进行任何处理(如分组、...

    基于TP框架SQL之where与having区别

    - **WHERE子句**: - 作用:在对查询结果进行分组(GROUP BY)前,根据指定条件筛选记录,即在分组之前过滤数据。 - 特点:条件中不能包含聚合函数,因为此时数据尚未经过分组,聚合函数无法计算出有意义的结果。 ...

Global site tag (gtag.js) - Google Analytics