2010-10-22 8 views
3

Y a-t-il un endroit définitif pour trouver l'ordre des opérations pour les instructions mySQL? L'ordre ci-dessous est-il correct?MySQL Ordre des opérations?

clause FROM clause WHERE clause GROUP BY clause AYANT clause SELECT de clause ORDER BY

Si tel est le cas, je peux utiliser un terme défini dans le SELECT clase (sélectionnez prenom comme "f_name") dans la clause group by?

Merci!

+1

Vous pouvez utiliser un alias dans la clause 'having' dans MySQL contrairement à SQL Server. Je ne sais pas si cela signifie que l'ordre logique des opérations est différent. –

Répondre

2

Je suppose que vous êtes intéressé par SELECT, selon la MySQL documentation la syntaxe est la suivante

SELECT 
[ALL | DISTINCT | DISTINCTROW ] 
    [HIGH_PRIORITY] 
    [STRAIGHT_JOIN] 
    [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 
    [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] 
select_expr [, select_expr ...] 
[FROM table_references 
[WHERE where_condition] 
[GROUP BY {col_name | expr | position} 
    [ASC | DESC], ... [WITH ROLLUP]] 
[HAVING where_condition] 
[ORDER BY {col_name | expr | position} 
    [ASC | DESC], ...] 
[LIMIT {[offset,] row_count | row_count OFFSET offset}] 
[PROCEDURE procedure_name(argument_list)] 
[INTO OUTFILE 'file_name' export_options 
    | INTO DUMPFILE 'file_name' 
    | INTO var_name [, var_name]] 
[FOR UPDATE | LOCK IN SHARE MODE]] 

Oui, vous pouvez utiliser des colonnes définies avec AS dans la clause GROUP BY.

+1

Je ne suis pas si sûr à ce sujet, mais s'il le fait vraiment, le plan de requête est complètement à la hauteur de l'optimiseur. –

+0

Je pense que le problème ici est de pouvoir sélectionner autant d'enregistrements que possible tant que les ID utilisateur sont uniques. – dudewad

+0

Ceci est réellement utile pour moi. J'étais confus à propos de ORDER BY et GROUP BY ordre lors de l'écriture d'une requête. Je vous remercie. –

0

Je pense que Order By vient avant Select (vous pouvez trier sur une colonne que vous n'avez pas sélectionnée), mais Group By et Are dead dead c'est sûr. Le regroupement nécessite la connaissance de l'ensemble des résultats, et vous ne pouvez regrouper que des colonnes non agrégées dans la liste Sélectionner (et vous devez les regrouper sur TOUS). Une fois que le jeu de résultats est groupé, Avoir est appliqué comme un ensemble de conditions à l'ensemble de résultats groupé.

Donc, je pense que la plupart des moteurs, y compris MySQL, processus comme suit:

  • Définir la source de domaine (clause FROM incluant JOIN)
  • Filtre (OU)
  • Trier (ORDER BY)
  • projet (SELECT)
  • Groupe (GROUP BY)
  • Filtre à nouveau (AVOIR)
+1

Vous pouvez comparer votre liste avec [celle-ci pour SQL Server] (http://tsql.solidq.com/books/insidetsql2008/Logical%20Query%20Processing%20Poster.pdf). Celui-ci a 'ORDER BY' comme l'avant-dernière étape. (Avec 'TOP' /' LIMIT' étant après cela) je vois votre point sur la commande par une colonne que vous n'avez pas sélectionnée mais par contre vous pouvez également commander par un alias de colonne défini dans la partie 'SELECT' ou une colonne calculée en la liste 'SELECT'. Je suppose que cette belle catégorisation logique se décompose un peu ici. –

+1

La commande dans cette réponse est incorrecte. La référence de Martin pour SQL Server est plus raisonnable, bien qu'elle ne soit pas strictement correcte pour MySQL. –

+2

Ce que @MartinSmith et @GordonLinoff ont dit. Cette réponse est incorrecte. L'ordre de traitement logique est FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY'. En MySQL, le 'HAVING' peut être considéré comme traité après' SELECT' (donc les alias définis dans SELECT peuvent être utilisés dans la clause HAVING, dans MySQL). –

Questions connexes