La clausola ORDER BY
controlla l’ordine in cui le righe vengono restituite o elaborate. Può essere utilizzato in qualsiasi selectionquery, includingas operando di INSERT
o UPSERT
, così come con DELETE
e UPDATE
istruzioni.
- Sinossi
- Parametri
- Conservazione degli ordini
- Ordinamento delle righe senza ORDER BY
- Ordinamento mediante semplice colonna selezioni
- l’Ordinamento utilizzo di più colonne
- Inversione dell’ordinamento
- Ordinamento nell’ordine della chiave primaria
- l’Ordinamento in ordine di indice
- di Ordinare le righe in DML
- Ordinamento dell’output di elimina
- Vedi anche
Sinossi
Parametri
La clausola ORDER BY
accetta un elenco separato da virgole di specifiche di ordinazione.Ogni specifica di ordinazione è composta da una selezione di colonne seguita optionallyby la parola chiave ASC
o DESC
.
Ogni selezione di colonne può assumere una delle seguenti forme:
- Una semplice selezione di colonne, determinata come segue:
- Il nome di un’etichetta di colonna configurata con
AS
in precedenza nella clausolaSELECT
. Questo utilizza il valore calcolato dalla clausolaSELECT
come chiave di ordinamento. - Un numero intero positivo, che designa una delle colonne nell’origine dati, la clausola
FROM
della clausolaSELECT
in cui accade o la tabella in cui viene scritta daDELETE
oUPDATE
. Questo utilizza il valore di input corrispondente dall’origine dati da utilizzare come chiave di ordinamento. - Un’espressione scalare arbitraria. Questo utilizza il risultato della valutazione di tale espressione come chiave di ordinamento.
- Il nome di un’etichetta di colonna configurata con
- La notazione
PRIMARY KEY <table_name>
. Questo utilizza le colonne della chiave primaria della tabella data come chiave di ordinamento. Questa tabella deve essere parte dell’origine dati. - La notazione
INDEX <table_name>@<index_name>
. Questo utilizza le colonne indicizzate dall’indice dato come chiave di ordinamento. Questa tabella deve essere parte dell’origine dati.
La parola chiave opzionale ASC
dopo una selezione di colonne indica di usarela chiave di ordinamento così com’è, e quindi non ha senso.
La parola chiave facoltativa DESC
inverte la direzione delle colonne selezionate dalla selezione che precede immediatamente.
CockroachDB supporta NULLS FIRST
/ NULLS LAST
in ORDER BY
clausole per la compatibilità con la sintassi di ordinamento delle righe PostgreSQL.
Il supporto per NULLS LAST
è attualmente solo sintassi. Se si specifica NULLS LAST
in una clausola ORDER BY
, CockroachDB utilizza NULLS FIRST
e non restituisce un errore.
Conservazione degli ordini
In generale, l’ordine dei risultati intermedi di una query non è garantito,anche se è specificato ORDER BY
. In altre parole, la clausola ORDER BY
è solo efficace nell’istruzione di livello superiore. Ad esempio, viene ignorato da queryplanner quando è presente in una sotto-query in una clausola FROM
come segue:
> SELECT * FROM a, b ORDER BY a.x; -- valid, effective> SELECT * FROM (SELECT * FROM a ORDER BY a.x), b; -- ignored, ineffective
Tuttavia,quando si combinano query insieme withsub-queries, alcune combinazioni renderanno la clausola ORDER BY
in una sotto-querysignificant:
- L’ordine dell’operando di una clausola
WITH ORDINALITY
(all’interno dell’operandoFROM
di una clausolaSELECT
) viene mantenuto,per controllare la numerazione delle righe. - L’ordine dell’operando di una clausola
LIMIT
oOFFSET
stand-alone (withinaFROM
operando di una clausolaSELECT
) viene mantenuto, per determinarequali righe vengono mantenute nel risultato. - L’ordine dell’origine dati per un’istruzione
INSERT
o un’istruzioneUPSERT
che utilizza ancheLIMIT
viene mantenuto, per determinare quali righe vengono elaborate, ma non il loro ordine. - L’ordine indicato per un’istruzione
UPDATE
oDELETE
che utilizza ancheLIMIT
viene utilizzato per determinarequali righe vengono elaborate, ma non il loro ordine.(Questa è un’estensione CockroachDB.) - L’ordine di una sotto-query utilizzata in un’espressione scalare è conservato.
Ad esempio, utilizzando 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.
Per esempio, l’utilizzo stand-alone LIMIT
clausola di FROM
:
Per esempio, l’utilizzo di un sub-query in contesto scalare:
Ordinamento delle righe senza ORDER BY
Senza ORDER BY
, le righe vengono trattati o restituiti in anon-deterministico ordine. “Non deterministico” significa che l’ordine effettivopuò dipendere dal piano logico, dall’ordine dei dati sul disco, dalla topologia del cluster CockroachDB ed è generalmente variabile nel tempo.
Ordinamento mediante semplice colonna selezioni
Considerando la seguente tabella:
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);
Le seguenti affermazioni sono equivalenti:
+---------+| a |+---------+| 1 || 2 || 3 |+---------+(3 rows)
si noti che l’ordine delle regole in materia. Se c’è ambiguità, il AS
aliasestake priorità sulle colonne di origine dati, ad esempio:
È anche possibile ordinare utilizzando un’espressione scalare arbitraria calcolata per ogni riga, ad esempio:
> SELECT a, b FROM ab ORDER BY a + b; -- orders by the result of computing a+b.
l’Ordinamento utilizzo di più colonne
Quando più di ordinazione specifica, il più tardi specifiche sono usedto le righe di un ordine che sono uguali rispetto alla precedente specifiche, per esempio:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b, a;
Questo consente di ordinare i risultati per colonna b
, e poi se ci sono multiplerows che hanno lo stesso valore nella colonna b
, sarà poi l’ordine di theserows da colonna a
.
Inversione dell’ordinamento
La parola chiave DESC
(“decrescente”) può essere aggiunta dopo una specifica di ordinamento per invertirne l’ordine. Questo può essere specificato separatamente per ogni specifica, ad esempio:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b DESC, a; -- sorts on b descending, then a ascending.
Ordinamento nell’ordine della chiave primaria
La notazione ORDER BY PRIMARY KEY
garantisce che i risultati siano presentati nell’ordine della chiave primaria.
Il vantaggio è che per le query utilizzando l’indice primario,questo garantisce l’ordine, mentre anche garantire che non ci sarà anadditional ordinamento calcolo per ottenere, per esempio:
> CREATE TABLE kv(k INT PRIMARY KEY, v INT);> SELECT k, v FROM kv ORDER BY PRIMARY KEY kv; -- guarantees ordering by column k.
Se una chiave primaria utilizza la parola chiave DESC
già, quindi la sua meaningwill essere capovolto (cancellata) se i ORDER BY
clausola utilizza anche, per esempio:
l’Ordinamento in ordine di indice
Il ORDER BY INDEX
notazione garantisce che i risultati sono presentedin l’ordine di un determinato indice.
Il vantaggio è che per le query utilizzando l’indice, thisguarantees ordine, mentre anche garantire che non ci sarà anadditional ordinamento calcolo per ottenere, per esempio:
> 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.
Se un indice che utilizza la parola chiave DESC
già, quindi la sua meaningwill essere capovolto (cancellata) se i ORDER BY
clausola utilizza anche, per esempio:
di Ordinare le righe in DML
Quando si utilizza ORDER BY
con un INSERT
,UPSERT
, UPDATE
oDELETE
(es., un’istruzione DML), la clausola ORDER BY
isignored se non viene utilizzata in combinazione con LIMIT
e/oOFFSET
.
La combinazione di entrambi ORDER BY
e LIMIT
/OFFSET
determinaquali righe dell’input vengono utilizzate per inserire, aggiornare o eliminare il tabledata, ma non determina in quale ordine la mutazione prendeposto.
Ad esempio, utilizzando 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.
Il motivo per cui ORDER BY
non controlla l’ordine finale delle righe nella tabella è che l’ordine delle righe nella tabella di destinazione è determinato dai suoi indici primari e secondari.
Per ordinare il risultato della clausola RETURNING
, vedere Ordinamento dell’output delle eliminazioni.
Ordinamento dell’output di elimina
Per ordinare l’output di un’istruzione DELETE
, utilizzare:
> WITH a AS (DELETE ... RETURNING ...) SELECT ... FROM a ORDER BY ...
Per un esempio, vedere Ordinare e restituire le righe eliminate.
Vedi anche
- Query di Selezione
- Espressioni Scalari
INSERT
UPSERT
DELETE
UPDATE
questa pagina È utile?
Sì No