首页 > 数据库 >SQL 中的 WHERE 与 HAVING 子句:深入理解与最佳实践

SQL 中的 WHERE 与 HAVING 子句:深入理解与最佳实践

时间:2024-11-13 13:30:38浏览次数:1  
标签:聚合 SQL 过滤 分组 子句 WHERE HAVING

SQL 中的 WHERE 与 HAVING 子句:深入理解与最佳实践

在 SQL 查询中,WHEREHAVING 子句是用于过滤查询结果的两个关键子句。尽管它们看起来相似,但它们的使用场景和作用有所不同。本文将深入探讨 WHEREHAVING 子句的区别,并通过具体示例说明其应用场景和最佳实践。

1. 表结构与数据

假设我们有一个名为 tb_car 的表,包含以下数据:

CREATE TABLE IF NOT EXISTS tb_car (
  id    INT,
  color CHAR(2),
  price FLOAT
);

INSERT INTO tb_car(id, color, price)
VALUES (1, '黄色', 16),
       (2, '黄色', 16),
       (3, '蓝色', 5),
       (4, '红色', 60),
       (5, '白色', 8),
       (6, '红色', 60);

2. WHERE 子句

WHERE 子句用于在分组和聚合之前过滤数据行。它适用于在数据行级别进行过滤,不能使用聚合函数(如 SUMAVG 等)。

语法
SELECT column1, column2, ...
FROM table_name
WHERE condition;
示例

我们希望查询价格大于 10 的车辆:

SELECT * 
FROM tb_car 
WHERE price > 10;

结果:

id color price
1 黄色 16
2 黄色 16
4 红色 60
6 红色 60

3. HAVING 子句

HAVING 子句用于在分组和聚合之后过滤分组结果。它适用于在分组和聚合之后进行过滤,可以使用聚合函数。

语法
SELECT column1, column2, ...
FROM table_name
GROUP BY column1, column2, ...
HAVING condition;
示例

我们希望查询每种颜色车辆的总价大于 30 的车辆颜色和总价:

SELECT color, SUM(price) 
FROM tb_car 
GROUP BY color 
HAVING SUM(price) > 30;

结果:

color SUM(price)
黄色 32
红色 120

4. WHERE 与 HAVING 的区别

  • 执行顺序

    • WHERE 子句在分组和聚合之前执行,用于过滤数据行。
    • HAVING 子句在分组和聚合之后执行,用于过滤分组结果。
  • 使用场景

    • WHERE 子句适用于在数据行级别进行过滤,不能使用聚合函数。
    • HAVING 子句适用于在分组和聚合之后进行过滤,可以使用聚合函数。

5. 常见错误与最佳实践

常见错误

WHERE 子句中使用聚合函数是常见的错误。例如:

SELECT color, SUM(price) 
FROM tb_car 
WHERE SUM(price) > 30 
GROUP BY color;

这个查询语句是错误的,因为 WHERE 子句中不能使用聚合函数。SQL 解析器会报错,提示 WHERE 子句中不能使用聚合函数。

最佳实践
  1. 明确需求:在编写查询语句时,首先明确需求是在数据行级别进行过滤还是在分组和聚合之后进行过滤。

  2. 正确使用子句

    • 如果需要在数据行级别进行过滤,使用 WHERE 子句。
    • 如果需要在分组和聚合之后进行过滤,使用 HAVING 子句。
  3. 性能优化

    • 尽量在 WHERE 子句中进行过滤,减少数据量,提高查询性能。
    • HAVING 子句中使用聚合函数时,确保分组和聚合的逻辑正确。

6. 总结

  • WHERE 子句:用于在分组和聚合之前过滤数据行,不能使用聚合函数。
  • HAVING 子句:用于在分组和聚合之后过滤分组结果,可以使用聚合函数。

通过理解 WHEREHAVING 子句的区别,你可以更好地编写 SQL 查询,确保查询语句的正确性和高效性。建议在实际应用中,根据具体需求选择合适的子句,并参考具体 DBMS 的官方文档以获取更准确的信息。

7. 参考资料

通过本文的介绍,希望你对 SQL 中的 WHEREHAVING 子句有了更深入的理解,能够在实际开发中更加灵活地应用这些知识。

标签:聚合,SQL,过滤,分组,子句,WHERE,HAVING
From: https://www.cnblogs.com/itcq1024/p/18543713

相关文章

  • 免费送源码:Java+python+django+MySQL 小区疫情订菜系统 计算机毕业设计原创定制
    摘 要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于小区疫情订菜系统当然也不能排除在外,随着网络技术的不断成熟,带动了小区疫情订菜系统,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活性。这种......
  • SQL NULL 值处理:深入理解与最佳实践
    SQLNULL值处理:深入理解与最佳实践在SQL数据库中,NULL是一个特殊的标记,用于表示“未知”或“不存在”的值。它与空字符串('')和零(0)有本质区别,具有独特的运算规则和处理机制。本文将深入探讨NULL值的处理规则,并通过具体示例说明其影响,最后提供最佳实践建议。1.NULL值基础概......
  • 数据库运维实操优质文章文档分享(含Oracle、MySQL等) | 2024年10月刊
    本文为大家整理了墨天轮数据社区2024年10月发布的优质技术文章/文档,主题涵盖Oracle、MySQL、PostgreSQL等主流数据库系统以及国产数据库的技术实操,从基础的安装配置到复杂的故障排查,再到性能优化的实用技巧及常用脚本等,分享给大家:Oracle优质技术文章概念梳理&安装配置OracleR......
  • [GXYCTF2019]BabySQli 1
    [GXYCTF2019]BabySQli1打开实例发现是个登录页,查看源代码未发现有效信息,admin登录,显示密码错误,发现参数name和pw查看源代码发现base编码解密发现是base32+base64混合编码,并发现解密后的SQL语句,判断注入点为usernameselect*fromuserwhereusername='$name'尝试万......
  • MySQL 中的 DELETE、TRUNCATE 和 DROP:深入理解与应用
    MySQL中的DELETE、TRUNCATE和DROP:深入理解与应用在MySQL数据库管理中,DELETE、TRUNCATE和DROP是三个常用的命令,用于删除表中的数据或表本身。尽管它们的目的相似,但它们的执行原理和效果却大不相同。本文将深入探讨这三个命令的区别、执行原理以及适用场景。1.DELETE:逐......
  • [免费]SpringBoot+Vue3校园宿舍管理系统(优质版)【论文+源码+SQL脚本】
    大家好,我是java1234_小锋老师,看到一个不错的SpringBoot+Vue3校园宿舍管理系统(优质版),分享下哈。项目视频演示【免费】SpringBoot+Vue3校园宿舍管理系统(优质版)Java毕业设计_哔哩哔哩_bilibili项目介绍随着信息技术的不断发展,现代化的校园管理需求日益增多,尤其在校园宿......
  • Sql优化技巧总结(面试必刷!!!)
    摘要    近段时间,面试官关于Sql优化的提问已经越来越多了,Sql优化可以说是已经成为了面试必备技能之一。本文从Sql语句、硬件设备以及Java程序三个方面详细的讲解关于Sql优化的技巧。目录摘要一、Sql语句优化1、避免使用Select*总结2、使用(创建)索引2.1、不能......
  • 解决高版本laravel/framework中SQLServer2008分页报错问题
    前提:laravel自6.0后就明确了支持的SQLServer版本最低为2017,而SQLServer是在2012版本后,引入的offset语法来实现分页,在此之前只能使用ROW_NUMBER()函数来完成分页。问题:生产环境的SQLServer由于历史原因,仍旧使用的2008版本,自然是不支持offset语法的,而新建项目使用的laravel版本......
  • 启动mysql报错“服务没有响应控制功能”
    启动mysql服务器报错,如图: 解决方案:1、查看path环境变量配置正确2、查看初始化配置文件正确[mysqld]#设置3306端口port=3306#设置mysql的安装目录basedir=D:\\mysql-8.0.40-winx64#设置mysql数据库的数据的存放目录datadir=D:\\mysql-8.0.40-winx64\\data#允......
  • Freesql、SqlSugar测试有感
    突然心血来潮测试了一下Freesql和SqlSugar的批量插入和批量更新性能,一搜测评一大堆,但是没找到自己想要的结果,自己动手测试一下基本的批量插入和批量更新性能。废话不多说直接贴代码1usingFreeSql;2usingFreeSql.DataAnnotations;3usingSqlSugar;45namesp......