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子句吗?
希望有人能解答我的疑惑
在SQL查询中,SELECT
和HAVING
子句的执行顺序并不是按照字面上的顺序来执行的。实际上,SELECT
和HAVING
子句的逻辑执行顺序是:
FROM
和 JOIN
(确定数据来源和如何联接它们)WHERE
(对从FROM
和JOIN
得到的记录进行过滤)GROUP BY
(对过滤后的记录进行分组)SUM()
)在GROUP BY
之后计算HAVING
(对分组后的聚合结果进行过滤)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的组。
因此,尽管SELECT
和HAVING
在SQL语句中的位置看起来像是先SELECT
后HAVING
,实际上聚合函数(在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