Quel est le but de Order By 1 dans l'instruction SQL SELECT?

155

Je lis un vieux code au travail et j'ai remarqué qu'il y a plusieurs vues avec une order by 1clause. Qu'est-ce que cela accomplit?

Exemple:

Create view v_payment_summary AS
SELECT A.PAYMENT_DATE,
       (SELECT SUM(paymentamount)
          FROM payment B
         WHERE PAYMENT_DATE = B.PAYMENT_DATE
           and SOME CONDITION) AS SUM_X,
       (SELECT SUM(paymentamount)
          FROM payment B
         WHERE PAYMENT_DATE = B.PAYMENT_DATE
           and SOME OTHER CONDITION) AS SUM_Y    
FROM payment A    
ORDER BY 1;
écho
la source
5
FYI: Il est généralement considéré comme une mauvaise pratique d'avoir un ORDER BY dans les vues, à moins que vous ne puissiez garantir que la vue ne sera jamais utilisée que pour la présentation. C'est un gaspillage car le ORDER BY se produira 2x si vous utilisez la vue dans une autre requête avec un ORDER BY.
OMG Ponies
3
@OMG Ponies: il est considéré comme illégal d'avoir en général un ORDER BYdans un VIEW. Le SQL standard ne le permet pas. SQL Server l'interdit depuis 2005. Pour les implémentations SQL qui le permettent, le comportement est largement non documenté et contre-intuitif. En d'autres termes, à éviter définitivement.
jour du
@onedaywhen: Vous prêchez à la chorale, mais MySQL autorise ORDER BY dans les vues , tout comme Oracle IME. SQL Server autorise un ORDER BY si TOPest présent, et SSMS aime ajouter TOP 100 PERCENT.
OMG Ponies
@OMG Ponies @ "MySQL autorise ORDER BY dans les vues" - MySQL autorise une CHECKcontrainte dans a CREATE TABLEmais il ne l'honorera pas réellement - il n'est jamais vérifié! La question est la suivante: est-ce que ces produits SQL respectent toujours les ORDER BYvues in, par exemple lorsqu'ils sont utilisés dans une requête qui comporte également un ORDER BYtrié deux fois? Documentent-ils même le comportement ou devez-vous regarder les plans d'exécution pour le résoudre? Je pense que nous connaissons les réponses;)
quand
FYI Je viens de découvrir une autre utilisation pour ORDER BY 1... en utilisant une astuce d'application croisée où vous voulez un alias vide. Malheureusement, le code, par exemple, est trop gros pour un commentaire, je l'ai donc posté en tant que réponse ci-dessous FYI.
AndrewD

Réponses:

209

Ce:

ORDER BY 1

... est appelé "Ordinal" - le nombre représente la colonne en fonction du nombre de colonnes défini dans la clause SELECT. Dans la requête que vous avez fournie, cela signifie:

ORDER BY A.PAYMENT_DATE

Ce n'est pas une pratique recommandée, car:

  1. Ce n'est pas évident / explicite
  2. Si l'ordre des colonnes change, la requête est toujours valide, vous risquez donc de classer par quelque chose que vous n'aviez pas prévu
Poneys OMG
la source
1
Ma question demandant s'il y avait un avantage à utiliser Ordinals: stackoverflow.com/questions/2253040/…
OMG Ponies
Cela n'a que l' sqlétiquette. En SQL standard, seuls les noms de corrélation de colonne sont autorisés dans la OREDER BYclause car, en théorie, les noms de corrélation de table sont hors de portée, c'est-à-dire qu'ils devraient l'être ORDER BY PAYMENT_DATE;. Bien entendu, toutes les implémentations SQL ne sont pas conformes aux standards.
jour du
Testé et fonctionnant sous SQL Server;WITH cte AS( SELECT 1 AS Col1, 'z' AS Col2 UNION SELECT 2 AS Col1, 'y' AS Col2 UNION SELECT 3 AS Col1, 'x' AS Col2 ) SELECT Col2, Col1 FROM cte ORDER BY 1
Ivanzinho
@OMG Ponies, vous avez mentionné que ce n'est pas une pratique recommandée, alors quel sera le prochain meilleur remplaçant? demander cuz je suis curieux .. merci!
dian jin le
40

Ceci est utile lorsque vous utilisez des opérateurs basés sur des ensembles, par exemple union

select cola
  from tablea
union
select colb
  from tableb
order by 1;
daven11
la source
4
Aha, ça a du sens. C'est la première bonne raison que j'ai vue jusqu'à présent.
écho
4
@Lazer Je ne le crois pas, pour effectuer une union, il fait probablement un tri en interne, mais c'est une question d'implémentation par opposition à une question de sortie logique et dans l'esprit de SQL, il n'est pas nécessaire de sortir les lignes dans l'ordre. Et si vous souhaitez trier par ordre décroissant? Ensuite, vous revenez au problème d'origine.
daven11
3
encore ... je préfère utiliserorder by tablea.cola
Shahar Shokrani
1
@ShaharShokrani qui ne fonctionnerait pas. mais vous pouvez dire, je préfère sélectionner cola comme x à partir de l'union du tableau, sélectionner colb comme x dans l'ordre de la tableb par x;
Ozgur Ozturk
select * from (select cola col from tablea union select colb col from tableb) trié par col
hareluya86
8

cela signifie simplement trier la vue ou la table par 1ère colonne du résultat de la requête.

kshitij
la source
7

Je crois en Oracle, cela signifie ordre par colonne n ° 1

Christoph
la source
7

Cela triera vos résultats selon la première colonne renvoyée. Dans l'exemple, il triera par date_paiement.

CTKeane
la source
4

Comme mentionné dans les autres réponses ORDER BY 1ordonnées par la première colonne.

Je suis tombé sur un autre exemple où vous pourriez l'utiliser. Nous avons certaines requêtes qui doivent être ordonnées, sélectionnez la même colonne. Vous obtiendrez une erreur SQL si vous passez commande Nameci-dessous.

SELECT Name, Name FROM Segment ORDER BY 1
nicV
la source
pourquoi ferais-tu ça? pourquoi ne pas les aliaser. [commentaire trop tard cependant]
abdul qayyum
1
@abdulqayyum c'est juste une autre façon de faire les choses vraiment. L'exemple ci-dessus est très simplifié. Parfois, la colonne «Nom» est en fait des colonnes différentes de différentes tables que vous insérez dans une autre table. L'ajout de plusieurs alias peut rendre la lecture plus difficile. Un autre exemple où il est utilisé est lors de la sélection de nombreux calculs différents et que vous souhaitez ordonner par un - sans avoir besoin d'alias. (Bien qu'ici, je préfère personnellement un alias pour dire quel est le calcul)
nicV
-1

Regarde aussi:

http://www.techonthenet.com/sql/order_by.php

Pour une description de la commande par. J'ai appris quelque chose! :)

J'ai également utilisé cela dans le passé lorsque je voulais ajouter un nombre indéterminé de filtres à une instruction SQL. Sloppy je sais, mais cela a fonctionné. : P

kdmurray
la source
-1

Un exemple ici tiré d'un exemple de base de données de serveur WAMP de test: -

mysql> select * from user_privileges;

| GRANTEE            | TABLE_CATALOG | PRIVILEGE_TYPE          | IS_GRANTABLE |
   +--------------------+---------------+-------------------------+--------------+
| 'root'@'localhost' | def           | SELECT                  | YES          |
| 'root'@'localhost' | def           | INSERT                  | YES          |
| 'root'@'localhost' | def           | UPDATE                  | YES          |
| 'root'@'localhost' | def           | DELETE                  | YES          |
| 'root'@'localhost' | def           | CREATE                  | YES          |
| 'root'@'localhost' | def           | DROP                    | YES          |
| 'root'@'localhost' | def           | RELOAD                  | YES          |
| 'root'@'localhost' | def           | SHUTDOWN                | YES          |
| 'root'@'localhost' | def           | PROCESS                 | YES          |
| 'root'@'localhost' | def           | FILE                    | YES          |
| 'root'@'localhost' | def           | REFERENCES              | YES          |
| 'root'@'localhost' | def           | INDEX                   | YES          |
| 'root'@'localhost' | def           | ALTER                   | YES          |
| 'root'@'localhost' | def           | SHOW DATABASES          | YES          |
| 'root'@'localhost' | def           | SUPER                   | YES          |
| 'root'@'localhost' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'localhost' | def           | LOCK TABLES             | YES          |
| 'root'@'localhost' | def           | EXECUTE                 | YES          |
| 'root'@'localhost' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'localhost' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'localhost' | def           | CREATE VIEW             | YES          |
| 'root'@'localhost' | def           | SHOW VIEW               | YES          |
| 'root'@'localhost' | def           | CREATE ROUTINE          | YES          |
| 'root'@'localhost' | def           | ALTER ROUTINE           | YES          |
| 'root'@'localhost' | def           | CREATE USER             | YES          |
| 'root'@'localhost' | def           | EVENT                   | YES          |
| 'root'@'localhost' | def           | TRIGGER                 | YES          |
| 'root'@'localhost' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'127.0.0.1' | def           | SELECT                  | YES          |
| 'root'@'127.0.0.1' | def           | INSERT                  | YES          |
| 'root'@'127.0.0.1' | def           | UPDATE                  | YES          |
| 'root'@'127.0.0.1' | def           | DELETE                  | YES          |
| 'root'@'127.0.0.1' | def           | CREATE                  | YES          |
| 'root'@'127.0.0.1' | def           | DROP                    | YES          |
| 'root'@'127.0.0.1' | def           | RELOAD                  | YES          |
| 'root'@'127.0.0.1' | def           | SHUTDOWN                | YES          |
| 'root'@'127.0.0.1' | def           | PROCESS                 | YES          |
| 'root'@'127.0.0.1' | def           | FILE                    | YES          |
| 'root'@'127.0.0.1' | def           | REFERENCES              | YES          |
| 'root'@'127.0.0.1' | def           | INDEX                   | YES          |
| 'root'@'127.0.0.1' | def           | ALTER                   | YES          |
| 'root'@'127.0.0.1' | def           | SHOW DATABASES          | YES          |
| 'root'@'127.0.0.1' | def           | SUPER                   | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'127.0.0.1' | def           | LOCK TABLES             | YES          |
| 'root'@'127.0.0.1' | def           | EXECUTE                 | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'127.0.0.1' | def           | CREATE VIEW             | YES          |
| 'root'@'127.0.0.1' | def           | SHOW VIEW               | YES          |
| 'root'@'127.0.0.1' | def           | CREATE ROUTINE          | YES          |
| 'root'@'127.0.0.1' | def           | ALTER ROUTINE           | YES          |
| 'root'@'127.0.0.1' | def           | CREATE USER             | YES          |
| 'root'@'127.0.0.1' | def           | EVENT                   | YES          |
| 'root'@'127.0.0.1' | def           | TRIGGER                 | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'::1'       | def           | SELECT                  | YES          |
| 'root'@'::1'       | def           | INSERT                  | YES          |
| 'root'@'::1'       | def           | UPDATE                  | YES          |
| 'root'@'::1'       | def           | DELETE                  | YES          |
| 'root'@'::1'       | def           | CREATE                  | YES          |
| 'root'@'::1'       | def           | DROP                    | YES          |
| 'root'@'::1'       | def           | RELOAD                  | YES          |
| 'root'@'::1'       | def           | SHUTDOWN                | YES          |
| 'root'@'::1'       | def           | PROCESS                 | YES          |
| 'root'@'::1'       | def           | FILE                    | YES          |
| 'root'@'::1'       | def           | REFERENCES              | YES          |
| 'root'@'::1'       | def           | INDEX                   | YES          |
| 'root'@'::1'       | def           | ALTER                   | YES          |
| 'root'@'::1'       | def           | SHOW DATABASES          | YES          |
| 'root'@'::1'       | def           | SUPER                   | YES          |
| 'root'@'::1'       | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'::1'       | def           | LOCK TABLES             | YES          |
| 'root'@'::1'       | def           | EXECUTE                 | YES          |
| 'root'@'::1'       | def           | REPLICATION SLAVE       | YES          |
| 'root'@'::1'       | def           | REPLICATION CLIENT      | YES          |
| 'root'@'::1'       | def           | CREATE VIEW             | YES          |
| 'root'@'::1'       | def           | SHOW VIEW               | YES          |
| 'root'@'::1'       | def           | CREATE ROUTINE          | YES          |
| 'root'@'::1'       | def           | ALTER ROUTINE           | YES          |
| 'root'@'::1'       | def           | CREATE USER             | YES          |
| 'root'@'::1'       | def           | EVENT                   | YES          |
| 'root'@'::1'       | def           | TRIGGER                 | YES          |
| 'root'@'::1'       | def           | CREATE TABLESPACE       | YES          |
| ''@'localhost'     | def           | USAGE                   | NO           |
+--------------------+---------------+-------------------------+--------------+
85 rows in set (0.00 sec)

Et quand il est donné supplémentaire order by PRIVILEGE_TYPEou peut être donné order by 3. Notez que la 3e colonne ( PRIVILEGE_TYPE) est triée par ordre alphabétique.

mysql> select * from user_privileges order by PRIVILEGE_TYPE;
+--------------------+---------------+-------------------------+--------------+
| GRANTEE            | TABLE_CATALOG | PRIVILEGE_TYPE          | IS_GRANTABLE |
+--------------------+---------------+-------------------------+--------------+
| 'root'@'127.0.0.1' | def           | ALTER                   | YES          |
| 'root'@'::1'       | def           | ALTER                   | YES          |
| 'root'@'localhost' | def           | ALTER                   | YES          |
| 'root'@'::1'       | def           | ALTER ROUTINE           | YES          |
| 'root'@'localhost' | def           | ALTER ROUTINE           | YES          |
| 'root'@'127.0.0.1' | def           | ALTER ROUTINE           | YES          |
| 'root'@'127.0.0.1' | def           | CREATE                  | YES          |
| 'root'@'::1'       | def           | CREATE                  | YES          |
| 'root'@'localhost' | def           | CREATE                  | YES          |
| 'root'@'::1'       | def           | CREATE ROUTINE          | YES          |
| 'root'@'localhost' | def           | CREATE ROUTINE          | YES          |
| 'root'@'127.0.0.1' | def           | CREATE ROUTINE          | YES          |
| 'root'@'::1'       | def           | CREATE TABLESPACE       | YES          |
| 'root'@'localhost' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'::1'       | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'localhost' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'localhost' | def           | CREATE USER             | YES          |
| 'root'@'127.0.0.1' | def           | CREATE USER             | YES          |
| 'root'@'::1'       | def           | CREATE USER             | YES          |
| 'root'@'localhost' | def           | CREATE VIEW             | YES          |
| 'root'@'127.0.0.1' | def           | CREATE VIEW             | YES          |
| 'root'@'::1'       | def           | CREATE VIEW             | YES          |
| 'root'@'127.0.0.1' | def           | DELETE                  | YES          |
| 'root'@'::1'       | def           | DELETE                  | YES          |
| 'root'@'localhost' | def           | DELETE                  | YES          |
| 'root'@'::1'       | def           | DROP                    | YES          |
| 'root'@'localhost' | def           | DROP                    | YES          |
| 'root'@'127.0.0.1' | def           | DROP                    | YES          |
| 'root'@'127.0.0.1' | def           | EVENT                   | YES          |
| 'root'@'::1'       | def           | EVENT                   | YES          |
| 'root'@'localhost' | def           | EVENT                   | YES          |
| 'root'@'127.0.0.1' | def           | EXECUTE                 | YES          |
| 'root'@'::1'       | def           | EXECUTE                 | YES          |
| 'root'@'localhost' | def           | EXECUTE                 | YES          |
| 'root'@'127.0.0.1' | def           | FILE                    | YES          |
| 'root'@'::1'       | def           | FILE                    | YES          |
| 'root'@'localhost' | def           | FILE                    | YES          |
| 'root'@'localhost' | def           | INDEX                   | YES          |
| 'root'@'127.0.0.1' | def           | INDEX                   | YES          |
| 'root'@'::1'       | def           | INDEX                   | YES          |
| 'root'@'::1'       | def           | INSERT                  | YES          |
| 'root'@'localhost' | def           | INSERT                  | YES          |
| 'root'@'127.0.0.1' | def           | INSERT                  | YES          |
| 'root'@'127.0.0.1' | def           | LOCK TABLES             | YES          |
| 'root'@'::1'       | def           | LOCK TABLES             | YES          |
| 'root'@'localhost' | def           | LOCK TABLES             | YES          |
| 'root'@'127.0.0.1' | def           | PROCESS                 | YES          |
| 'root'@'::1'       | def           | PROCESS                 | YES          |
| 'root'@'localhost' | def           | PROCESS                 | YES          |
| 'root'@'::1'       | def           | REFERENCES              | YES          |
| 'root'@'localhost' | def           | REFERENCES              | YES          |
| 'root'@'127.0.0.1' | def           | REFERENCES              | YES          |
| 'root'@'::1'       | def           | RELOAD                  | YES          |
| 'root'@'localhost' | def           | RELOAD                  | YES          |
| 'root'@'127.0.0.1' | def           | RELOAD                  | YES          |
| 'root'@'::1'       | def           | REPLICATION CLIENT      | YES          |
| 'root'@'localhost' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'::1'       | def           | REPLICATION SLAVE       | YES          |
| 'root'@'localhost' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'127.0.0.1' | def           | SELECT                  | YES          |
| 'root'@'::1'       | def           | SELECT                  | YES          |
| 'root'@'localhost' | def           | SELECT                  | YES          |
| 'root'@'127.0.0.1' | def           | SHOW DATABASES          |  YES          |
| 'root'@'::1'       | def           | SHOW DATABASES          | YES          |
| 'root'@'localhost' | def           | SHOW DATABASES          | YES          |
| 'root'@'127.0.0.1' | def           | SHOW VIEW               | YES          |
| 'root'@'::1'       | def           | SHOW VIEW               | YES          |
| 'root'@'localhost' | def           | SHOW VIEW               | YES          |
| 'root'@'localhost' | def           | SHUTDOWN                | YES          |
| 'root'@'127.0.0.1' | def           | SHUTDOWN                | YES          |
| 'root'@'::1'       | def           | SHUTDOWN                | YES          |
| 'root'@'::1'       | def           | SUPER                   | YES          |
| 'root'@'localhost' | def           | SUPER                   | YES          |
| 'root'@'127.0.0.1' | def           | SUPER                   | YES          |
| 'root'@'127.0.0.1' | def           | TRIGGER                 | YES          |
| 'root'@'::1'       | def           | TRIGGER                 | YES          |
| 'root'@'localhost' | def           | TRIGGER                 | YES          |
| 'root'@'::1'       | def           | UPDATE                  | YES          |
| 'root'@'localhost' | def           | UPDATE                  | YES          |
| 'root'@'127.0.0.1' | def           | UPDATE                  | YES          |
| ''@'localhost'     | def           | USAGE                   | NO           |     +--------------------+---------------+-------------------------+--------------+
85 rows in set (0.00 sec)

DEFINITIVEMENT, une longue réponse et beaucoup de défilement. J'ai également eu du mal à transmettre la sortie des requêtes à un fichier texte. Voici comment faire cela sans utiliser la into outfilechose ennuyeuse-

tee E: /sqllogfile.txt;

Et lorsque vous avez terminé, arrêtez la journalisation-

tee off;

J'espère que cela ajoute plus de clarté.

Kriss
la source