Порядок выполнения запроса / предложения 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>]