web-dev-qa-db-fra.com

Ordre d'exécution des requêtes / clauses MySQL

Quel est l'ordre prédéfini dans lequel les clauses sont exécutées dans MySQL? Est-ce que certaines décisions ont été prises au moment de l'exécution et cette commande est-elle correcte?

  • FROM clause
  • WHERE clause
  • GROUP BY clause
  • HAVING clause
  • SELECT clause
  • ORDER BY clause
33
ericsicons

L'exécution réelle des instructions MySQL est un peu délicate. Cependant, la norme spécifie l'ordre d'interprétation des éléments dans la requête. C'est essentiellement dans l'ordre que vous spécifiez, bien que je pense que HAVING et GROUP BY pourrait venir après SELECT:

  • FROM clause
  • WHERE clause
  • SELECT clause
  • GROUP BY clause
  • HAVING clause
  • ORDER BY clause

Ceci est important pour comprendre comment les requêtes sont analysées. Vous ne pouvez pas utiliser un alias de colonne défini dans un SELECT dans la clause WHERE, par exemple, car le WHERE est analysé avant le SELECT. En revanche, un tel alias peut être dans le ORDER BY clause.

Quant à l'exécution réelle, c'est vraiment à l'optimiseur. Par exemple:

. . .
GROUP BY a, b, c
ORDER BY NULL

et

. . .
GROUP BY a, b, c
ORDER BY a, b, c

les deux ont pour effet de ORDER BY pas du tout exécuté - et donc pas exécuté après le GROUP BY (dans le premier cas, l'effet est de supprimer le tri du GROUP BY et dans le second, l'effet est de ne rien faire de plus que le GROUP BY le fait déjà).

51
Gordon Linoff