Каков предопределенный порядок выполнения предложений в MySQL? Некоторые из них были решены во время выполнения, и этот порядок правильный?
-
FROM clause
-
WHERE clause
-
GROUP BY clause
-
HAVING clause
-
SELECT clause
-
ORDER BY clause
Каков предопределенный порядок выполнения предложений в MySQL? Некоторые из них были решены во время выполнения, и этот порядок правильный?
FROM clause
WHERE clause
GROUP BY clause
HAVING clause
SELECT clause
ORDER BY clause
Фактическое выполнение операторов MySQL немного сложно. Однако в стандарте указывается порядок интерпретации элементов в запросе. Это в основном в том порядке, в котором вы указываете, хотя я думаю, что HAVING
и GROUP BY
могут появиться после SELECT
:
FROM
WHERE
SELECT
GROUP BY
HAVING
ORDER BY
Это важно для понимания того, как обрабатываются запросы. Вы не можете использовать псевдоним столбца, определенный в SELECT
в предложении WHERE
, например, потому что WHERE
анализируется перед SELECT
. С другой стороны, такой псевдоним может быть в ORDER BY
.
Что касается фактического выполнения, это действительно остается за оптимизатором. Например:
. . .
GROUP BY a, b, c
ORDER BY NULL
и
. . .
GROUP BY a, b, c
ORDER BY a, b, c
оба эффекта ORDER BY
вообще не выполняются - и поэтому не выполняются после GROUP BY
(в первом случае эффект заключается в удалении сортировки из GROUP BY
, а во втором - эффект должен делать не что иное, как GROUP BY
уже делает).
Вот как вы можете получить общее представление о том, как mysql выполняет запрос select
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;
И вот результат из вышеперечисленного запроса mysql, надеюсь, что вы можете выяснить выполнение mysql запроса SELECT: -
FROM JOIN1 JOIN2 WHERE ON2 ON1 ORDERBY GROUPBY SELECT WHERE ON2 ON1 ORDERBY GROUPBY SELECT, ИМЕЮЩИЙ
Я думаю, что порядок выполнения выглядит следующим образом:
(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>]