Ordinare i risultati delle query

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 UPDATEistruzioni.

Sinossi

ORDERBYa_exprASCDESCNULLSFIRSTLASTPRIMARYKEYtable_nameINDEXtable_name@index_nameASCDESC,

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:
    1. Il nome di un’etichetta di colonna configurata con AS in precedenza nella clausola SELECT. Questo utilizza il valore calcolato dalla clausola SELECT come chiave di ordinamento.
    2. Un numero intero positivo, che designa una delle colonne nell’origine dati, la clausola FROM della clausola SELECT in cui accade o la tabella in cui viene scritta da DELETEo UPDATE. Questo utilizza il valore di input corrispondente dall’origine dati da utilizzare come chiave di ordinamento.
    3. Un’espressione scalare arbitraria. Questo utilizza il risultato della valutazione di tale espressione come chiave di ordinamento.
  • 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.

Nota:

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:

icona / pulsanti / copia
> 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:

  1. L’ordine dell’operando di una clausola WITH ORDINALITY (all’interno dell’operando FROM di una clausola SELECT) viene mantenuto,per controllare la numerazione delle righe.
  2. L’ordine dell’operando di una clausola LIMIT o OFFSET stand-alone (withina FROM operando di una clausola SELECT) viene mantenuto, per determinarequali righe vengono mantenute nel risultato.
  3. L’ordine dell’origine dati per un’istruzione INSERT o un’istruzione UPSERT che utilizza ancheLIMIT viene mantenuto, per determinare quali righe vengono elaborate, ma non il loro ordine.
  4. L’ordine indicato per un’istruzione UPDATEo DELETE che utilizza anche LIMIT viene utilizzato per determinarequali righe vengono elaborate, ma non il loro ordine.(Questa è un’estensione CockroachDB.)
  5. L’ordine di una sotto-query utilizzata in un’espressione scalare è conservato.

Ad esempio, utilizzando WITH ORDINALITY :

icone/pulsanti/copia
> 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:

icona/pulsanti/copia

Per esempio, l’utilizzo di un sub-query in contesto scalare:

icone/pulsanti/copia

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:

icone/pulsanti/copia
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);

Le seguenti affermazioni sono equivalenti:

icone/pulsanti/copia
+---------+| 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:

icon / buttons / copy

È anche possibile ordinare utilizzando un’espressione scalare arbitraria calcolata per ogni riga, ad esempio:

icone/pulsanti/copia
> 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:

icone/pulsanti/copia
> 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:

icona / pulsanti / copia
> 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:

icone/pulsanti/copia
> 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:

icone/pulsanti/copia

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:

icone/pulsanti/copia
> 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:

icone/pulsanti/copia

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 LIMITe/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:

icona / pulsanti / copia
> 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:

icon / buttons / copy
> 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?

No

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.