Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询/子句执行顺序_Mysql_Execution_Operator Precedence - Fatal编程技术网

MySQL查询/子句执行顺序

MySQL查询/子句执行顺序,mysql,execution,operator-precedence,Mysql,Execution,Operator Precedence,在MySQL中执行子句的预定义顺序是什么?其中一些是在运行时决定的,这个顺序正确吗 FROM子句 WHERE子句 分组依据子句 有从句 SELECT子句 按条款订货 MySQL语句的实际执行有点棘手。但是,该标准确实规定了查询中元素的解释顺序。这基本上是按照您指定的顺序进行的,尽管我认为HAVING和groupby可以在SELECT之后出现: FROM子句 WHERE子句 SELECT子句 分组依据子句 有从句 按条款订货 这对于理解如何解析查询很重要。例如,不能使用WHERE子句中SELECT

在MySQL中执行子句的预定义顺序是什么?其中一些是在运行时决定的,这个顺序正确吗

FROM子句 WHERE子句 分组依据子句 有从句 SELECT子句 按条款订货
MySQL语句的实际执行有点棘手。但是,该标准确实规定了查询中元素的解释顺序。这基本上是按照您指定的顺序进行的,尽管我认为HAVING和groupby可以在SELECT之后出现:

FROM子句 WHERE子句 SELECT子句 分组依据子句 有从句 按条款订货 这对于理解如何解析查询很重要。例如,不能使用WHERE子句中SELECT中定义的列别名,因为WHERE是在SELECT之前解析的。另一方面,这样的别名可以位于ORDERBY子句中

至于实际执行,这实际上是留给优化器的。例如:

. . .
GROUP BY a, b, c
ORDER BY NULL


两者都具有完全不执行的顺序的效果,因此在GROUP BY之后不执行。在第一种情况下,效果是从GROUP BY中删除排序,而在第二种情况下,效果是GROUP BY已经执行了排序

我认为执行顺序如下:

(7)     SELECT 
(8)     DISTINCT <select_list>
(1)     FROM <left_table>
(3)     <join_type> JOIN <right_table>
(2)     ON <join_condition>
(4)     WHERE <where_condition>
(5)     GROUP BY <group_by_list>
(6)     HAVING <having_condition>
(9)     ORDER BY <order_by_condition>
(10)    LIMIT <limit_number>[, <offset_number>]
这就是如何大致了解mysql如何执行select查询的方法

下面是上面mysql查询的输出,希望您能够了解SELECT查询的mysql执行情况:-

从JOIN1 JOIN2 WHERE ON2 ON1 ORDERBY GROUPBY选择WHERE ON2 ON1 ORDERBY GROUPBY SELECT HAVING


select和group by在某种程度上相互重叠,尤其是在使用聚合函数时。您无法对这些问题进行严格的排序。此问题似乎与主题无关,因为它似乎缺乏研究。我找不到详细讨论此主题的其他任何地方。别名可以在GROUP BY中使用,因此我猜它是在选择后解析的。选择名称为n,按n从测试组中计数名称works@ericsicons . . . 非常感谢。我错过了。你确定是第一个吗?我认为第一个地方是什么,考虑一下:从表中选择*。我认为如果WHERE子句执行得比从WHERE子句执行得快,@Shafizadeh。查询的解释从FROM子句开始。执行路径由优化器确定。请给出标准状态的确切页面以及解释顺序?我下载了一份SQL:2003的草稿,但没有找到关于这个顺序的任何东西。你为什么这么认为?你的消息来源是什么?这不是执行的顺序。这是书面命令…与执行命令无关。我认为SELECT应该是第5个
(7)     SELECT 
(8)     DISTINCT <select_list>
(1)     FROM <left_table>
(3)     <join_type> JOIN <right_table>
(2)     ON <join_condition>
(4)     WHERE <where_condition>
(5)     GROUP BY <group_by_list>
(6)     HAVING <having_condition>
(9)     ORDER BY <order_by_condition>
(10)    LIMIT <limit_number>[, <offset_number>]
DROP TABLE if exists new_table;

CREATE TABLE `new_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`testdecimal` decimal(6,2) DEFAULT NULL,
PRIMARY KEY (`id`));

INSERT INTO `new_table` (`testdecimal`) VALUES ('1234.45');
INSERT INTO `new_table` (`testdecimal`) VALUES ('1234.45');

set @mysqlorder := '';

select @mysqlorder := CONCAT(@mysqlorder," SELECT ") from new_table,(select @mysqlorder := CONCAT(@mysqlorder," FROM ")) tt
JOIN (select @mysqlorder := CONCAT(@mysqlorder," JOIN1 ")) t on ((select @mysqlorder := CONCAT(@mysqlorder," ON1 ")) or rand() < 1)
JOIN (select @mysqlorder := CONCAT(@mysqlorder," JOIN2 ")) t2 on ((select @mysqlorder := CONCAT(@mysqlorder," ON2 ")) or rand() < 1)
where ((select @mysqlorder := CONCAT(@mysqlorder," WHERE ")) or IF(new_table.testdecimal = 1234.45,true,false))
group by (select @mysqlorder := CONCAT(@mysqlorder," GROUPBY ")),id
having (select @mysqlorder := CONCAT(@mysqlorder," HAVING "))
order by (select @mysqlorder := CONCAT(@mysqlorder," ORDERBY "));

select @mysqlorder;