mysql中的where having与case when同时使用的时候

HAVING子句是在分组后对分组结果进行过滤,而WHERE子句是在分组前对数据进行过滤。因此,如果你使用HAVING子句,那么你的查询结果将包含所有的行,然后再根据条件过滤掉不符合条件的行;如果你使用WHERE子句,那么你的查询结果将只包含符合条件的行。能举例说明吗

HAVING子句和WHERE子句都是用来过滤数据的,但是它们的作用范围不同。

WHERE子句在分组前进行过滤,HAVING子句在分组后进行过滤。WHERE子句在聚合函数计算之前过滤行,而HAVING子句则在聚合函数计算之后过滤行。

举个例子

假设你有一个订单表,其中包含订单号、客户ID、订单日期和订单总金额等字段。如果你想查找所有客户的平均订单金额大于1000元的客户ID,则可以使用以下查询:

SELECT CustomerID, AVG(OrderTotal) AS AverageOrderTotal
FROM Orders
GROUP BY CustomerID
HAVING AVG(OrderTotal) > 1000;

这个查询首先按客户ID对数据进行分组,然后计算每个客户的平均订单金额。最后,HAVING子句过滤掉所有平均订单金额小于或等于1000元的客户。

如果你使用WHERE子句来执行相同的查询,则会得到错误的结果。因为WHERE子句在聚合函数计算之前过滤行,所以它会过滤掉所有订单总金额小于或等于1000元的行,这样就无法正确计算每个客户的平均订单金额了。

举例

WHERE子句可以在CASE WHEN语句中使用,以过滤符合条件的行。例如,假设你有一个订单表,其中包含订单号、客户ID、订单日期和订单总金额等字段。如果你想查找所有订单总金额大于1000元的订单,并将所有小于1000元的订单标记为“小额订单”,则可以使用以下查询:

SELECT OrderID, OrderTotal,
  CASE
    WHEN OrderTotal > 1000 THEN '大额订单'
    ELSE '小额订单'
  END AS OrderSize
FROM Orders
WHERE OrderTotal > 0;

这个查询首先使用WHERE子句过滤掉所有订单总金额小于或等于0元的行,然后使用CASE WHEN语句根据每个订单的总金额将其标记为“大额订单”或“小额订单”。

注意,WHERE子句在CASE WHEN语句之前执行,因此它可以过滤掉不符合条件的行。如果你想在CASE WHEN语句之后过滤数据,则需要使用HAVING子句。

总结

SQL语句的执行顺序是从左到右,但是在使用WHERE、HAVING和CASE WHEN子句时,它们的执行顺序会有所不同。WHERE子句在查询之前过滤行,HAVING子句在GROUP BY之后过滤行,而CASE WHEN子句在SELECT之后执行。

具体来说,SQL语句的执行顺序如下:

  1. FROM
  2. JOIN
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. SELECT
  7. DISTINCT
  8. ORDER BY

因此,在使用WHERE、HAVING和CASE WHEN子句时,应该根据需要调整它们的位置以确保正确的结果。例如,在使用CASE WHEN时,应该将它放在SELECT之后,以便可以使用计算列进行过滤。

源: 与必应的对话, 2023/3/23(1) sql语句 where 后条件执行先后顺序 - 王哲66369 - 博客园. https://www.cnblogs.com/wangzhe66369/p/13725171.html 访问时间 2023/3/23.
(2) SQL语句 where,group by,having,order by执行顺序__Chris的博客-CSDN博客. https://blog.csdn.net/rj532029887/article/details/39260977 访问时间 2023/3/23.
(3) where,group by,having,order by执行顺序和编写顺序. https://blog.csdn.net/The_Best_Hacker/article/details/92784204 访问时间 2023/3/23.
(4) mysql 中 where 、 group by 、having、order by 的执行顺序. https://blog.csdn.net/sxlzs_/article/details/79396979 访问时间 2023/3/23.
(5) SQL执行顺序与SQL中的where与having区别_静默安然的博客-CSDN博客_where和over哪个先sql. https://blog.csdn.net/zhao2chen3/article/details/115892262 访问时间 2023/3/23.
(6) sql笔记1:sql执行优先级和casewhen用法、sql执行顺序_case when 优先级_Neko、的博客-CSDN博客. https://blog.csdn.net/Dracarys_/article/details/112627721 访问时间 2023/3/23.

1111

在创建临时表之后,使用WHERE和HAVING的执行顺序是不同的。WHERE子句在查询之前过滤行,而HAVING子句在GROUP BY之后过滤行。因此,在使用临时表时,应该根据需要调整WHERE和HAVING的位置以确保正确的结果。

例如,如果您想要对生成的临时表进行筛选,则应该将WHERE子句放在GROUP BY之前。如果您想要对分组后的结果进行筛选,则应该将HAVING子句放在GROUP BY之后。

源: 与必应的对话, 2023/3/24(1) SQL执行顺序与SQL中的where与having区别_静默安然的博客-CSDN博客_where和over哪个先sql. https://blog.csdn.net/zhao2chen3/article/details/115892262 访问时间 2023/3/24.
(2) SQL的执行顺序以及ON、WHERE、HAVING的区别_sql on 后面的执行_SYBY的博客-CSDN博客. https://blog.csdn.net/SYBYy6/article/details/123823286 访问时间 2023/3/24.
(3) SQL关键字执行顺序&MySQL的HAVING_米饭噗噗的博客-CSDN博客. https://blog.csdn.net/weixin_40662072/article/details/114324706 访问时间 2023/3/24.

在SQL中,SELECT语句是最后执行的。因此,如果您使用了子查询,则子查询将首先执行,然后是WHERE子句和HAVING子句。接下来,GROUP BY子句将按组对行进行分组。最后,SELECT语句将选择要返回的列并计算聚合函数(如果有)。

源: 与必应的对话, 2023/3/24(1) MySQL中case when 嵌套的使用方法_case when 嵌套case when_wolf_kk的博客-CSDN博客. https://blog.csdn.net/qq_41560865/article/details/114267597 访问时间 2023/3/24.
(2) select嵌套/子查询,AS用法_select嵌套select语句_陌途i的博客-CSDN博客. https://blog.csdn.net/u013158317/article/details/100997948 访问时间 2023/3/24.
(3) 【MySQL】十八、where,from,select后面嵌套子查询. https://blog.csdn.net/weixin_43519707/article/details/113854616 访问时间 2023/3/24.

临时表是在查询之前生成的,因此WHERE和HAVING的执行顺序应该是相同的。如果您只使用了WHERE或HAVING,则结果应该是相同的。但是,如果您使用了GROUP BY,则HAVING子句将在GROUP BY之后过滤行。如果您没有使用GROUP BY,则HAVING和WHERE的执行顺序应该是相同的。

请注意,如果您使用了聚合函数(例如SUM,AVG等),则必须使用GROUP BY子句。否则,您将无法获得正确的结果。

源: 与必应的对话, 2023/3/24(1) ON、WHERE、HAVING的区别_bruceyang2009lzu的博客-CSDN博客. https://blog.csdn.net/bruceyang2009lzu/article/details/38846357 访问时间 2023/3/24.
(2) 临时表 - SQL Server | Microsoft Learn. https://learn.microsoft.com/zh-cn/sql/relational-databases/tables/temporal-tables?view=sql-server-ver16 访问时间 2023/3/24.
(3) sql having 多条件_打开SQL复杂查询的钥匙:正确理解where、having和on的区别. https://blog.csdn.net/weixin_42172972/article/details/113319668 访问时间 2023/3/24.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耳东哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值