eri*_*ons 35 mysql execution operator-precedence
在MySQL中执行子句的预定义顺序是什么?有些是在运行时决定的,这个顺序是否正确?
FROM clauseWHERE clause GROUP BY clauseHAVING clause SELECT clause ORDER BY clauseGor*_*off 53
MySQL语句的实际执行有点棘手.但是,该标准确实指定了查询中元素的解释顺序.这基本上是你指定的顺序,虽然我认为HAVING并且GROUP BY可以追随SELECT:
FROM 条款WHERE 条款SELECT 条款GROUP BY 条款HAVING 条款ORDER BY 条款这对于了解如何解析查询非常重要.例如,您不能使用子句中的a SELECT中定义的列别名WHERE,因为WHERE它在之前被解析SELECT.另一方面,这样的别名可以在该ORDER BY条款中.
至于实际执行,这实际上由优化器决定.例如:
. . .
GROUP BY a, b, c
ORDER BY NULL
Run Code Online (Sandbox Code Playgroud)
和
. . .
GROUP BY a, b, c
ORDER BY a, b, c
Run Code Online (Sandbox Code Playgroud)
两者都具有ORDER BY未执行的效果- 因此在执行之后不执行GROUP BY(在第一种情况下,效果是从GROUP BY第二种情况中删除排序,在第二种情况下,效果是除了GROUP BY已经执行的操作之外的任何事情).
这是您如何大致了解 mysql 如何执行选择查询的方法
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;
Run Code Online (Sandbox Code Playgroud)
这是上面 mysql 查询的输出,希望您能弄清楚SELECT查询的 mysql 执行:-
从 JOIN1 JOIN2 WHERE ON2 ON1 ORDERBY GROUPBY SELECT WHERE ON2 ON1 ORDERBY GROUPBY SELECT HAVING HAVING