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