mysql 考虑执行顺序的SQL中GROUP BY背后的机制

blmhpbnm  于 2023-02-11  发布在  Mysql
关注(0)|答案(1)|浏览(134)

考虑到"SQL执行顺序",GROUP BY语句如何处理SELECT语句中CASE WHEN操作生成的列?
示例查询:

SELECT  
    CASE
        WHEN COM_SALES_PRC > 1000000 THEN "good job"
    END AS Performance,
    COUNT(CUST_SEQ_NO) AS NumberofEmployees
    
FROM PREP_MONTHLY_STAT
GROUP BY Performance

虽然上面的查询运行时没有错误,但下面的查询给了我一个错误。这是有意义的,因为WHERE语句不知道SELECT语句中要给出的别名。

SELECT  
    CASE
        WHEN COM_SALES_PRC > 1000000 THEN "good job"
    END AS Performance,
    COUNT(CUST_SEQ_NO) AS NumberofEmployees
    
FROM PREP_MONTHLY_STAT
WHERE Performance IS NOT NULL
    • SQL执行顺序**:

https://www.sisense.com/blog/sql-query-order-of-operations/
1.自
1.地点
1.分组依据
1.有
1.选择
1.排序人
1.限值
我是个写疑问的新手,如果答案能尽可能详细,我将不胜感激。谢谢。

fd3cxomn

fd3cxomn1#

首先,要知道COUNT(...)的存在意味着GROUP BY的存在,如果没有显式的GROUP BY,那么整个表就是一个“组”,COUNTSUM等是“聚合”。
WHERE不能引用SELECT中的表达式。HAVINGORDER BY只能在GROUP BY聚合它们之后引用 * 聚合 *。
可以将WHERE Performance IS NOT NULL更改为HAVING Performance IS NOT NULL
(我不喜欢将SELECT设为5。)
使用COUNT的一些问题,以及更多示例:

  • COUNT(x)检查x是否为NOT NULL。在您的情况下有必要这样做吗?如果没有,则简单地说COUNT(*)
  • 你可能得到的是员工总数。如果你只想得到“好工作”的员工,那么
SELECT  
      COUNT(*) AS GoodJobEmployees
  FROM PREP_MONTHLY_STAT
  WHERE COM_SALES_PRC > 1000000
  • 如果你想同时得到总数和“好工作”数:
SELECT  
      SUM(COM_SALES_PRC > 1000000) AS GoodJobEmployees,
      COUNT(*) AS TotalEmployees
  FROM PREP_MONTHLY_STAT

如果你真实的的目标更复杂,让我们来看看。

相关问题