当前位置: 首页 > 知识库问答 >
问题:

程序员 - SQL是先运行select还是先运行having子句?

颜志业
2024-05-16

SQL语句中到底是先select执行后having还是先having执行再select执行呢?如下图所示,这是表数据:

然后这是代码及运行结果:

网上的答案是先执行having后执行select,但是上面第二幅图不是先在select中指定了“sum(num) as all_num”后,才能运行“having all_num > 50”吗,不然怎么会运行成功呢?我的疑问是如果是先having再select的话,你哪里来的all_num给having执行呢?不是应该先select查询出结果才有all_num,再运行having子句吗?

希望有人能解答我的疑惑

共有1个答案

糜俊彦
2024-05-16

答案

在SQL查询中,SELECTHAVING子句的执行顺序并不是按照字面上的顺序来执行的。实际上,SELECTHAVING子句的逻辑执行顺序是:

  1. FROMJOIN(确定数据来源和如何联接它们)
  2. WHERE(对从FROMJOIN得到的记录进行过滤)
  3. GROUP BY(对过滤后的记录进行分组)
  4. 聚合函数(如SUM())在GROUP BY之后计算
  5. HAVING(对分组后的聚合结果进行过滤)
  6. SELECT(选择需要的列,包括聚合函数的结果)

所以,虽然SELECT子句在SQL语句中出现在HAVING子句之前,但在逻辑执行顺序上,聚合函数(如SUM(num) as all_num)的计算是在HAVING子句过滤之前完成的。

在你提供的例子中,SUM(num) as all_num这个聚合计算是在HAVING all_num > 50之前完成的。换句话说,SQL先计算所有组的num字段之和,然后给这个结果起个别名all_num,接着使用这个all_num的结果去过滤那些和大于50的组。

因此,尽管SELECTHAVING在SQL语句中的位置看起来像是先SELECTHAVING,实际上聚合函数(在SELECT中定义)的计算和HAVING过滤是在一个逻辑阶段完成的,这个逻辑阶段在SELECT列选择之后。这意味着,在逻辑上,SQL会先计算聚合结果,然后再使用HAVING子句来过滤这些聚合结果。

希望这个解释能够解答你的疑惑。

 类似资料:
  • 问题内容: 在Java中,多维数组是以列优先还是行优先的顺序存储的? 问题答案: Java没有多维数组。它具有数组的数组。例如 …是(当然是)的数组。 因此,Java既不是列优先顺序也不是行优先顺序(但请参见下面的有关如何读取的注意事项),因为给定数组的条目存储在连续的内存块中,而这些条目所指向的从属数组是对象的引用。完全独立的,无关的内存块。这也意味着Java的数组数组固有地呈 锯齿状 :处的条

  • 问题内容: 考虑以下命令行 哪些设置适用于JVM最小内存(可选):128m或256m? 问题答案: 取决于JVM,可能取决于版本……甚至可能当时您的办公桌上有多少回形针。它甚至可能不起作用。不要那样做 如果由于某种原因无法控制它,则以与运行jar相同的方式进行编译和运行。但是要警告,依靠选项的顺序是一个非常糟糕的主意。

  • 本文向大家介绍浅谈onTouch先执行,还是onClick执行(详解),包括了浅谈onTouch先执行,还是onClick执行(详解)的使用技巧和注意事项,需要的朋友参考一下 有一个Button 按钮,要想为该按钮设置onClick事件和OnTouch事件 此时,我们现在分析一下,是onTouch先执行,还是onClick执行,接下来我从FrameWork 源码去探寻一下整个事件的执行流程和原理:

  • 问题内容: 在Oracle SQL Developer中输入SQL语句时,我注意到我有两个选择。我可以选择“运行语句”或“运行脚本”。尽管命名为“ Execute query”和“ Execute as script”,但在SQL Maestro中似乎也可以使用类似的选择。 两者之间到底有什么区别? 问题答案: 将在可排序的表格中为您提供所有结果的列表。它还将仅在光标(或突出显示)下运行该语句。运

  • 以下是在远程主机上安装PIP/BOTO的任务,这些任务在运行route53模块时不会再出现错误:

  • 考虑一个MapReduce程序的WordCount问题。 让我们考虑一下映射器的输出如下:Hello 1 World 1 Hello 1 Hadoop 1 Hello 1Hadoop1 它去了分区器(我们将2指定为缩减器的no,)现在mapout在2个部分part1中获取分区: Hello 1 Hello 1 Hello 1 Hello 1 Part 2:世界1 Hadoop 1 Hadoop 1