de ORDER BY
– clausule bepaalt de volgorde waarin rijen worden geretourneerd of verwerkt. Het kan worden gebruikt in elke selectiequery, met inbegrip van als operand van INSERT
of UPSERT
, alsmede met DELETE
en UPDATE
statements.
- Synopsis
- Parameters
- behoud van de volgorde
- volgorde van rijen zonder volgorde door
- Sorteren met behulp van eenvoudige kolomselecties
- Sorteren met meerdere kolommen
- het inverteren van de sorteervolgorde
- sorteren in primaire sleutelvolgorde
- Sorteren in de index order
- Bestellen rijen in DML-instructies
- sorteren van de uitvoer van verwijderingen
- zie ook
Synopsis
Parameters
de ORDER BY
– clausule bestaat uit een door komma ‘ s gescheiden lijst van orderspecificaties.Elke orderspecificatie bestaat uit een kolomselectie, optioneel gevolgd door het trefwoord ASC
of DESC
.
elke kolom kan een van de volgende vormen aannemen:
- een eenvoudige kolomselectie, als volgt bepaald:
- de naam van een kolomlabel dat is geconfigureerd met
AS
eerder in deSELECT
– clausule. Dit gebruikt de waarde berekend door deSELECT
clausule als de sorteersleutel. - een positief geheel getal, dat een van de kolommen in de gegevensbron aanwijst, hetzij de
FROM
clausule van deSELECT
clausule waar dit gebeurt, hetzij de tabel wordt geschreven metDELETE
ofUPDATE
. Dit gebruikt de overeenkomstige invoerwaarde uit de gegevensbron om te gebruiken als sorteersleutel. - een willekeurige scalaire uitdrukking. Dit gebruikt het resultaat van het evalueren van die expressie als de sorteersleutel.
- de naam van een kolomlabel dat is geconfigureerd met
- de notatie
PRIMARY KEY <table_name>
. Dit gebruikt de primaire sleutel kolom (s) van de gegeven tabel als sorteersleutel. Deze tabel moet deel uitmaken van de gegevensbron. - de notatie
INDEX <table_name>@<index_name>
. Dit gebruikt de kolommen geïndexeerd door de gegeven index als sorteersleutel. Deze tabel moet deel uitmaken van de gegevensbron.
het optionele sleutelwoord ASC
na een kolomselectie geeft aan dat de sorteersleutel als-is gebruikt wordt en is dus zinloos.
het facultatieve sleutelwoord DESC
keert de richting van de geselecteerde kolom(s)om door de selectie die onmiddellijk voorafgaat.
CockroachDB ondersteunt NULLS FIRST
/ NULLS LAST
in ORDER BY
clausules voor compatibiliteit met PostgreSQL rijsorteersyntaxis.
ondersteuning voor NULLS LAST
is momenteel alleen syntaxis. Als u NULLS LAST
opgeeft in een ORDER BY
– clausule, gebruikt CockroachDB NULLS FIRST
en geeft geen fout terug.
behoud van de volgorde
in het algemeen is de volgorde van de tussentijdse resultaten van een query niet gegarandeerd,zelfs als ORDER BY
is opgegeven. Met andere woorden, de ORDER BY
-clausule is alleen effectief op het hoogste niveau. Bijvoorbeeld, het wordt genegeerd door de queryplanner wanneer aanwezig in een sub-query in een FROM
clausule als volgt:
> SELECT * FROM a, b ORDER BY a.x; -- valid, effective> SELECT * FROM (SELECT * FROM a ORDER BY a.x), b; -- ignored, ineffective
bij het combineren van queries met sub-queries zullen sommige combinaties de ORDER BY
-clausule in een sub-querysignificant maken:
- de volgorde van de operand van een
WITH ORDINALITY
clausule(binnen deFROM
operand van eenSELECT
clausule) wordt behouden,om de nummering van de rijen te controleren. - de volgorde van de operand van een op zichzelf staande
LIMIT
ofOFFSET
clausule (met eenFROM
operand van eenSELECT
clausule) wordt behouden om te bepalen welke rijen in het resultaat worden bewaard. - de volgorde van de gegevensbron voor een statement
INSERT
of een statementUPSERT
dat ookLIMIT
gebruikt, wordt bewaard om te bepalen welke rijen worden verwerkt, maar niet de volgorde. - de volgorde die is aangegeven voor een statement
UPDATE
ofDELETE
dat ookLIMIT
gebruikt, wordt gebruikt om te bepalen welke rijen worden verwerkt, maar niet de volgorde.(Dit is een CockroachDB extensie.) - de volgorde van een subquery die in een scalaire expression wordt gebruikt, wordt behouden.
bijvoorbeeld met WITH ORDINALITY
:
> SELECT * FROM (SELECT * FROM a ORDER BY a.x) WITH ORDINALITY; -- ensures that the rows are numbered in the order of column a.x.
bijvoorbeeld, met behulp van een stand-alone LIMIT
clausule in FROM
:
bijvoorbeeld, met behulp van een subquery in scalaire context:
volgorde van rijen zonder volgorde door
zonder ORDER BY
worden rijen verwerkt of geretourneerd in een niet-deterministische volgorde. “Niet-deterministisch” betekent dat de daadwerkelijke orde van het logische plan, de Orde van gegevens op schijf, de topologie van de Kakkerlakkenb-cluster kan afhangen, en over het algemeen in de tijd variabel is.
Sorteren met behulp van eenvoudige kolomselecties
rekening houdend met de volgende tabel:
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);
de volgende statements zijn equivalent:
+---------+| a |+---------+| 1 || 2 || 3 |+---------+(3 rows)
merk op dat de volgorde van de regels ertoe doet. Als er dubbelzinnigheid is, krijgt de AS
aliasvoorkeur boven de kolommen van de gegevensbron, bijvoorbeeld:
het is ook mogelijk om te sorteren met een willekeurige scalaire expressie berekend voor elke rij, bijvoorbeeld:
> SELECT a, b FROM ab ORDER BY a + b; -- orders by the result of computing a+b.
Sorteren met meerdere kolommen
Als er meer dan één bestellen specificatie is gegeven, de latere specificaties zijn usedto om de rijen die zijn gelijk over de eerdere specificaties, bijvoorbeeld:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b, a;
Dit sorteert de resultaten per kolom b
, en dan als er multiplerows die dezelfde waarde in de kolom b
, het zal dan om theserows door de kolom a
.
het inverteren van de sorteervolgorde
het trefwoord DESC
(“aflopend”) kan na een orderspecificatie worden toegevoegd om de volgorde om te zetten. Dit kan afzonderlijk worden gespecificeerd voor elke specificatie, bijvoorbeeld:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b DESC, a; -- sorts on b descending, then a ascending.
sorteren in primaire sleutelvolgorde
de notatie ORDER BY PRIMARY KEY
garandeert dat de resultaten worden gepresenteerd in primaire sleutelvolgorde.
Het bijzondere voordeel is dat voor query ‘ s met de primaire index,dit garandeert de orde, terwijl ook het garanderen zal er niet anadditional sorteren berekening te bereiken, bijvoorbeeld:
> CREATE TABLE kv(k INT PRIMARY KEY, v INT);> SELECT k, v FROM kv ORDER BY PRIMARY KEY kv; -- guarantees ordering by column k.
Als u een primaire sleutel gebruikt het zoekwoord DESC
al is, dan is de meaningwill worden omgedraaid (geannuleerd) indien de ORDER BY
clausule is ook van toepassingenDESC
, bijvoorbeeld:
Sorteren in de index order
De ORDER BY INDEX
notatie garandeert dat de resultaten presentedin de volgorde van een bepaalde index.
Het bijzondere voordeel is dat voor query ‘ s met behulp van die index, thisguarantees de orde, terwijl ook het garanderen zal er niet anadditional sorteren berekening te bereiken, bijvoorbeeld:
> CREATE TABLE kv(k INT PRIMARY KEY, v INT, INDEX v_idx(v));> SELECT k, v FROM kv ORDER BY INDEX kv@v_idx; -- guarantees ordering by column v.
Als een index maakt gebruik van het sleutelwoord DESC
al is, dan is de meaningwill worden omgedraaid (geannuleerd) indien de ORDER BY
clausule is ook van toepassingenDESC
, bijvoorbeeld:
Bestellen rijen in DML-instructies
Bij gebruik van ORDER BY
met een INSERT
,UPSERT
, UPDATE
ofDELETE
(i.e.,a DML statement), is de ORDER BY
clausule ondertekend als het niet wordt gebruikt in combinatie metLIMIT
en/of OFFSET
.
de combinatie van zowel ORDER BY
als LIMIT
/OFFSET
bepaalt welke rijen van de invoer worden gebruikt om de tabelgegevens in te voegen, bij te werken of te verwijderen, maar bepaalt niet in welke volgorde de mutatie plaatsvindt.
bijvoorbeeld met LIMIT
in INSERT
:
> INSERT INTO a SELECT * FROM b ORDER BY b.x LIMIT 1; -- ensures that only the first row of b in the order of column b.x -- is inserted into a.
de reden waarom ORDER BY
de uiteindelijke volgorde van de rijen in de tabel niet bepaalt, is dat de volgorde van de rijen in de doeltabel wordt bepaald door de primaire en secundaire indexen.
om het resultaat van de RETURNING
– clausule te ordenen, zie het sorteren van de output van verwijderingen.
sorteren van de uitvoer van verwijderingen
om de uitvoer van een DELETE
statement te sorteren, gebruik:
> WITH a AS (DELETE ... RETURNING ...) SELECT ... FROM a ORDER BY ...
zie voor een voorbeeld verwijderde rijen sorteren en retourneren.
zie ook
- Selectiequeries
- scalaire expressies
INSERT
UPSERT
DELETE
UPDATE
Was deze pagina nuttig?
Ja Nee