Was ist der Zweck von Order By 1 in der SQL-Select-Anweisung?

154

Ich lese gerade alten Code bei der Arbeit durch und habe festgestellt, dass es mehrere Ansichten mit einer order by 1Klausel gibt. Was bringt das?

Beispiel:

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;
Echo
quelle
5
Zu Ihrer Information: Es wird allgemein als schlechte Praxis angesehen, eine ORDER BY in Ansichten zu haben, es sei denn, Sie können garantieren, dass die Ansicht immer nur für Präsentationen verwendet wird. Dies ist eine Verschwendung, da ORDER BY zweimal auftritt, wenn Sie die Ansicht in einer anderen Abfrage mit ORDER BY verwenden.
OMG Ponys
3
@OMG Ponys: Es wird allgemein als illegal angesehen, eine ORDER BYin einem zu haben VIEW. Standard SQL erlaubt es nicht. SQL Server hat es seit 2005 verboten. Bei SQL-Implementierungen, die dies zulassen, ist das Verhalten weitgehend undokumentiert und kontraintuitiv. Mit anderen Worten, auf jeden Fall zu vermeiden.
Tag, wenn der
@onedaywhen: Sie predigen vor dem Chor, aber MySQL erlaubt ORDER BY in Ansichten , ebenso wie Oracle IME. SQL Server erlaubt ORDER BY, wenn TOPvorhanden, und SSMS fügt gerne hinzu TOP 100 PERCENT.
OMG Ponys
@OMG Ponies @ "MySQL erlaubt ORDER BY in Ansichten" - MySQL erlaubt eine CHECKEinschränkung in a, CREATE TABLEaber es berücksichtigt sie nicht wirklich - es wird nie wirklich überprüft! Die Frage ist, haben diese SQL - Produkte immer ehren die ORDER BYin Aussicht zB wenn in einer Abfrage verwendet , dass auch eine ORDER BYnicht zweimal sortiert werden? Dokumentieren sie überhaupt das Verhalten oder müssen Sie die Ausführungspläne überprüfen, um es auszuarbeiten? Ich denke, wir kennen die Antworten;)
8:23 Uhr
Zu Ihrer Information: Ich habe gerade eine andere Verwendung für ORDER BY 1... mithilfe eines Cross-Apply-Tricks entdeckt, bei dem Sie einen leeren Alias ​​wünschen. Leider ist der Code zB zu groß für einen Kommentar, daher habe ich ihn als Antwort unter FYI gepostet.
AndrewD

Antworten:

208

Dies:

ORDER BY 1

... wird als "Ordnungszahl" bezeichnet - die Zahl steht für die Spalte basierend auf der Anzahl der in der SELECT-Klausel definierten Spalten. In der von Ihnen angegebenen Abfrage bedeutet dies:

ORDER BY A.PAYMENT_DATE

Es ist keine empfohlene Praxis, weil:

  1. Es ist nicht offensichtlich / explizit
  2. Wenn sich die Spaltenreihenfolge ändert, ist die Abfrage weiterhin gültig, sodass Sie das Risiko eingehen, nach etwas zu bestellen, das Sie nicht beabsichtigt haben
OMG Ponys
quelle
1
Meine Frage, ob es einen Vorteil
OMG Ponies
Dies hat nur das sqlTag. In Standard SQL sind in der OREDER BYKlausel nur Spaltenkorrelationsnamen zulässig , da die Tabellenkorrelationsnamen theoretisch außerhalb des Gültigkeitsbereichs liegen, dh sollten ORDER BY PAYMENT_DATE;. Natürlich entsprechen nicht alle SQL-Implementierungen den Standards.
Tag, wenn der
Getestet und funktioniert in 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 Ponys, Sie haben erwähnt, dass dies keine empfohlene Vorgehensweise ist. Was ist also der nächstbeste Ersatz? frage weil ich neugierig bin .. danke!
Dian Jin
40

Dies ist nützlich, wenn Sie satzbasierte Operatoren verwenden, z. B. union

select cola
  from tablea
union
select colb
  from tableb
order by 1;
daven11
quelle
4
Aha, das macht Sinn. Dies ist der erste gute Grund, den ich bisher gesehen habe.
Echo
4
@Lazer Ich glaube nicht, um eine Union durchzuführen, wird wahrscheinlich eine Sortierung intern durchgeführt, aber dies ist eine Implementierungsfrage im Gegensatz zu einer logischen Ausgabefrage, und im Sinne von SQL besteht keine Notwendigkeit, die Zeilen der Reihe nach auszugeben. Was ist auch, wenn Sie absteigend sortieren möchten? Dann sind Sie wieder beim ursprünglichen Problem.
Daven11
3
trotzdem ... würde ich lieber benutzenorder by tablea.cola
Shahar Shokrani
1
@ ShaharShokrani das würde nicht funktionieren. aber Sie können sagen, ich bevorzuge Cola als x aus Tablea Union auswählen Colb als x aus Tabelleb Reihenfolge nach x;
Ozgur Ozturk
wähle * aus (wähle cola col aus tablea union aus, wähle colb col aus tableb) bestelle nach col
hareluya86
8

Es bedeutet einfach, die Ansicht oder Tabelle nach der ersten Spalte des Abfrageergebnisses zu sortieren.

kshitij
quelle
7

Ich glaube an Oracle, es bedeutet Reihenfolge nach Spalte 1

Christoph
quelle
7

Dadurch werden Ihre Ergebnisse nach der ersten zurückgegebenen Spalte sortiert. Im Beispiel wird nach Zahlungsdatum sortiert.

CTKeane
quelle
4

Wie in anderen Antworten erwähnt, wird in ORDER BY 1der ersten Spalte geordnet.

Ich bin auf ein anderes Beispiel gestoßen, wo Sie es verwenden könnten. Wir haben bestimmte Fragen, die bestellt werden müssen, wählen Sie die gleiche Spalte. Sie würden einen SQL-Fehler erhalten, wenn Sie nach Nameunten bestellen .

SELECT Name, Name FROM Segment ORDER BY 1
nicV
quelle
warum würdest du das tun? warum nicht alias sie. [zu später Kommentar]
Abdul Qayyum
1
@abdulqayyum es ist nur eine andere Art, Dinge wirklich zu tun. Das obige Beispiel ist sehr vereinfacht. Manchmal handelt es sich bei der Spalte 'Name' tatsächlich um verschiedene Spalten aus verschiedenen Tabellen, die Sie in eine andere Tabelle einfügen. Das Hinzufügen einer Reihe von Aliasnamen kann das Lesen erschweren. Ein weiteres Beispiel für die Verwendung ist die Auswahl vieler verschiedener Berechnungen und die Reihenfolge nacheinander - ohne Alias. (Obwohl ich hier persönlich einen Alias ​​bevorzugen würde, um zu sagen, was die Berechnung ist)
nicV
-1

Siehe auch:

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

Für eine Beschreibung der Bestellung von. Ich habe etwas gelernt! :) :)

Ich habe dies auch in der Vergangenheit verwendet, als ich einer SQL-Anweisung eine unbestimmte Anzahl von Filtern hinzufügen wollte. Schlampig weiß ich, aber es hat funktioniert. : P.

kdmurray
quelle
-1

Ein Beispiel hier aus einer Beispieltest-WAMP-Serverdatenbank: -

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)

Und wenn es zusätzlich gegeben wird order by PRIVILEGE_TYPEoder gegeben werden kann order by 3. Beachten Sie, dass die 3. Spalte ( PRIVILEGE_TYPE) alphabetisch sortiert wird.

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)

ENDGÜLTIG, eine lange Antwort und viel Scrollen. Außerdem hatte ich große Mühe, die Ausgabe der Abfragen an eine Textdatei zu übergeben. Hier into outfileerfahren Sie, wie Sie dies tun können, ohne das nervige Ding zu verwenden.

Tee E: /sqllogfile.txt;

Und wenn Sie fertig sind, stoppen Sie die Protokollierung.

abschlagen;

Hoffe, es fügt mehr Klarheit hinzu.

kriss
quelle