Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

    • MySQL 为什么一定要有一个主键
    • MySQL 中的 RR 隔离级别,到底有没有解决幻读问题
    • MySQL 的行级锁到底锁的是什么东西?
    • 存储 MD5 值应该用 VARCHAR 还是用 CHAR?
    • 数据库的三范式是什么?
    • 说说 InnoDB 与 MyISAM 的区别
    • drop、truncate、delete 的区别
    • 聊一聊数据库事务机制
    • 聊一聊 MySQL 中的关联查询
    • 事务隔离级别有哪些?MySQL 的默认隔离级别是什么
    • 分库分表之后,id 主键如何处理?
    • 说说在 MySQL 中一条查询 SQL 是如何执行的?
    • 讲解下 DDL、DML、DCL
    • 存储过程和触发器的作用
    • MySQL 如何行转列和列转行
    • 如何查看 SQL 的执行计划
    • union 和 unionAll 的区别
    • having 和 where 的区别
      • 常见的索引原则
      • MySQL 中的 IN 和 EXISTS 子句有什么区别?
      • MySQL 如何处理 NULL 值,对性能有什么影响?
      • 如何在 MySQL 中处理和避免全表扫描?
      • MySQL 中的表空间是什么,它的作用是什么?
      • 在 MySQL 中,如何优化 ORDER BY 查询?
    • Java 8 + 特性类

    • 其他技术类

    • 常见面试题
    • MySQL 类
    刘博
    2025-12-29
    目录

    having 和 where 的区别

    having和where均用于 “过滤数据”,核心区别在于 “过滤时机” 和 “作用对象”,具体对比如下:

    # 1. 核心区别

    对比维度 where having
    过滤时机 分组前过滤(过滤行数据) 分组后过滤(过滤分组结果)
    作用对象 行数据(如WHERE age > 20过滤年龄大于 20 的行) 分组结果(如HAVING COUNT(*) > 2过滤包含 2 行以上的分组)
    支持的表达式 只能使用表字段、常量、函数(不能使用聚合函数,如 COUNT、SUM) 可使用表字段、常量、函数、聚合函数
    适用场景 单表过滤、多表关联过滤(分组前的数据过滤) 分组后的结果过滤(如 GROUP BY 后的统计过滤)

    # 2. 语法示例与结果对比

    # 测试数据:
    CREATE TABLE user (id INT, name VARCHAR(20), age INT, dept VARCHAR(20));
    INSERT INTO user VALUES
    (1, '张三', 25, '技术部'), (2, '李四', 30, '技术部'),
    (3, '王五', 28, '销售部'), (4, '赵六', 22, '销售部'),
    (5, '孙七', 35, '技术部');
    
    1
    2
    3
    4
    5
    # (1)where 示例(分组前过滤)

    需求:查询技术部年龄大于 25 的用户。

    SELECT * FROM user WHERE dept = '技术部' AND age > 25;
    
    1
    # 结果(过滤出技术部且年龄 > 25 的行):
    id name age dept
    2 李四 30 技术部
    5 孙七 35 技术部
    # (2)having 示例(分组后过滤)

    需求:查询员工人数大于 2 的部门及其人数。

    SELECT dept, COUNT(*) AS user_count FROM user
    GROUP BY dept -- 按部门分组
    HAVING COUNT(*) > 2; -- 过滤人数大于2的分组
    
    1
    2
    3
    # 结果(过滤出人数 > 2 的分组):
    dept user_count
    技术部 3

    # 3. 关键注意事项

    • having 不能单独使用:having 必须与 GROUP BY 配合使用(MySQL 允许不写 GROUP BY,但不推荐,此时 having 等价于 where);
    • 聚合函数的使用:where 中不能使用聚合函数(如WHERE COUNT(*) > 2是错误的),having 中可以;
    • 性能优化:过滤数据时,优先使用 where(分组前过滤,减少分组的数据量),再用 having 过滤分组结果(如WHERE dept = '技术部' GROUP BY dept HAVING COUNT(*) > 2,先过滤技术部,再分组统计)。

    上次更新: 12/30/2025
    union 和 unionAll 的区别
    常见的索引原则

    ← union 和 unionAll 的区别 常见的索引原则→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式