Порядок выполнения запроса / предложения MySQL
каков предопределенный порядок, в котором выполняются предложения в MySQL? Некоторые из них решаются во время выполнения, и этот порядок правильный?
FROM clause
-
WHERE clause
GROUP BY clause
-
HAVING clause
-
SELECT clause
ORDER BY clause
3 ответов
фактическое выполнение операторов 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 query
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 выберите запрос :-
ИЗ JOIN1 JOIN2, ГДЕ ON2 ON1 ORDERBY GROUPBY ВЫБЕРИТЕ, ГДЕ ON2 ON1 ORDERBY GROUPBY ВЫБЕРИТЕ ИМЕЯ
Я думаю, что порядок выполнения такой:
(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>]