ORDER BY
lauseke määrää, missä järjestyksessä rivit palautetaan tai käsitellään. Sitä voidaan käyttää missä tahansa valitsijakokoelmassa, mukaan lukien INSERT
tai UPSERT
sekä DELETE
ja UPDATE
lausekkeissa.
- Synopsis
- parametrit
- järjestyksen säilyminen
- Order of rivs without ORDER BY
- Lajittelu yksinkertaisilla palstavalinnoilla
- Lajittelu käyttäen useita sarakkeita
- kääntäen järjestysjärjestyksen
- Lajittelu ensisijaisen avaimen järjestykseen
- Lajittelu indeksijärjestyksessä
- tilausrivit DML-lausekkeissa
- Lajittele poistojen ulostulo
- Katso myös
Synopsis
parametrit
ORDER BY
lauseke ottaa pilkulla erotellun luettelon tilauserittelyistä.Jokainen tilauseritelmä koostuu sarakevalinnasta, jota seuraa vaihtoehtoisesti hakusana ASC
tai DESC
.
jokainen sarakkeen valinta voi olla jokin seuraavista muodoista:
- yksinkertainen sarakevalinta, joka määritetään seuraavasti:
- sellaisen sarakeotsikon nimi, joka on määritetty
AS
aikaisemminSELECT
kohdassa. Tällöin lajitteluavaimena käytetäänSELECT
lausekkeen laskemaa arvoa. - positiivinen kokonaisluku, joka ilmaisee jonkin tietolähteen sarakkeista, joko
FROM
lausekkeenSELECT
, jossa se tapahtuu, tai taulukon kirjoittaaDELETE
taiUPDATE
. Tämä käyttää lajitteluavaimena tietolähteen vastaavaa syöttöarvoa. - mielivaltainen skalaarilauseke. Tässä käytetään kyseisen ilmaisun arvioinnin tulosta lajitteluavaimena.
- sellaisen sarakeotsikon nimi, joka on määritetty
- notaatio
PRIMARY KEY <table_name>
. Tässä käytetään lajitteluavaimena annetun taulukon ensisijaisia avainsarakkeita. Tämän taulukon on oltava osa tietolähdettä. - notaatio
INDEX <table_name>@<index_name>
. Tämä käyttää annetun indeksin indeksoimia sarakkeita lajitteluavaimina. Tämän taulukon on oltava osa tietolähdettä.
valinnainen hakusana ASC
sarakkeen valinnan jälkeen osoittaa lajitteluavaimen käyttämisen sellaisenaan ja on siten merkityksetön.
valinnainen hakusana DESC
kääntää välittömästi edeltävän valinnan valitsemien sarakkeiden suunnan.
CockroachDB tukee NULLS FIRST
/NULLS LAST
ORDER BY
pykälissä yhteensopivuutta PostgreSQL: n rivilajittelusyntaksin kanssa.
tuki NULLS LAST
: lle on nykyisin vain syntaksia. Jos määrität NULLS LAST
ORDER BY
– lausekkeessa, torakka käyttää NULLS FIRST
eikä palauta virhettä.
järjestyksen säilyminen
yleensä kyselyn välitulosten järjestystä ei voida taata,vaikka ORDER BY
olisi määritelty. Toisin sanoen ORDER BY
– lauseke on voimassa vain ylätason lauseessa. Esimerkiksi queryplanner jättää sen huomiotta, kun se esiintyy alikyselyssä FROM
lausekkeessa seuraavasti:
> SELECT * FROM a, b ORDER BY a.x; -- valid, effective> SELECT * FROM (SELECT * FROM a ORDER BY a.x), b; -- ignored, ineffective
kuitenkin yhdistettäessä kyselyt yhdessä subkyselyiden kanssa, jotkin yhdistelmät tekevät ORDER BY
– lausekkeen alakyselyyn:
-
WITH ORDINALITY
lausekkeen operandin järjestys (FROM
SELECT
lausekkeen operandin sisällä) on säilynyt,jotta rivien numerointia voidaan hallita. - itsenäisen
LIMIT
taiOFFSET
lausekkeen operandin järjestys (withinaFROM
SELECT
lausekkeen operandi) säilyy, jotta voidaan määrittää, mitkä rivit pidetään tuloksessa. -
INSERT
– lausekkeen taiUPSERT
– lausekkeen, jossa myösLIMIT
käytetään, tietolähteen järjestys säilytetään, jotta voidaan määrittää, mitä rivejä käsitellään, mutta ei niiden järjestystä. -
UPDATE
taiDELETE
lauseketta, jossa käytetään myösLIMIT
, käytetään määritettäessä, mitkä rivit käsitellään, mutta ei niiden järjestystä.(Tämä on Torakkadb laajennus.) - skalaariekspressiossa käytetyn alikyselyn järjestys on säilynyt.
esimerkiksi käyttämällä 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.
esimerkiksi käyttämällä itsenäistä LIMIT
lauseketta FROM
:
esimerkiksi käyttämällä alikyselyä skalaariyhteydessä:
Order of rivs without ORDER BY
Without ORDER BY
, rivit käsitellään tai palautetaan anon-deterministisessä järjestyksessä. ”Ei-deterministinen” tarkoittaa, että todellinen järjestys voi riippua loogisesta suunnitelmasta, levyn tietojen järjestyksestä, Torakkadb-klusterin topologiasta ja on yleensä muuttuva ajan myötä.
Lajittelu yksinkertaisilla palstavalinnoilla
ottaen huomioon seuraavan taulukon:
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);
seuraavat lauseet vastaavat:
+---------+| a |+---------+| 1 || 2 || 3 |+---------+(3 rows)
huomaa, että sääntöjen järjestyksellä on väliä. Jos on epäselvyyttä, AS
aliasestake prioriteetti tietolähdesarakkeisiin nähden, esimerkiksi:
on myös mahdollista lajitella käyttäen mielivaltaista skalaarilauseketta, joka on laskettu jokaiselle riville, esimerkiksi:
> SELECT a, b FROM ab ORDER BY a + b; -- orders by the result of computing a+b.
Lajittelu käyttäen useita sarakkeita
kun on annettu useampi kuin yksi tilausmääritelmä, käytetään myöhempiä määrityksiä tilausriveille, jotka ovat yhtä suuret kuin aikaisemmat määritykset, esimerkiksi:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b, a;
tämä lajittelee tulokset sarakkeittain b
, ja jos sitten on olemassa kertoimia, joilla on sama arvo sarakkeessa b
, se järjestää nämä tulokset sarakkeittain a
.
kääntäen järjestysjärjestyksen
hakusana DESC
(”laskeva”) voidaan lisätä järjestysmäärittelyn jälkeen sen järjestyksen muuttamiseksi. Tämä voidaan määritellä erikseen jokaiselle spesifikaatiolle, esimerkiksi:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b DESC, a; -- sorts on b descending, then a ascending.
Lajittelu ensisijaisen avaimen järjestykseen
ORDER BY PRIMARY KEY
merkintä takaa, että tulokset esitetään ensisijaisen avaimen järjestyksessä.
erityinen etu on se,että ensisijaista indeksiä käyttävien kyselyiden osalta tämä takaa järjestyksen, mutta takaa myös sen, että ei ole ylimääräistä lajittelulaskentaa sen saavuttamiseksi, esimerkiksi:
> CREATE TABLE kv(k INT PRIMARY KEY, v INT);> SELECT k, v FROM kv ORDER BY PRIMARY KEY kv; -- guarantees ordering by column k.
jos ensisijainen avain käyttää jo hakusanaa DESC
, sen merkitys käännetään (peruutetaan), jos ORDER BY
lausekkeessa käytetään myösDESC
, esimerkiksi:
Lajittelu indeksijärjestyksessä
ORDER BY INDEX
merkintä takaa, että tulokset esitetään tietyn indeksin järjestyksessä.
erityinen etu on se, että tätä indeksiä käyttävien kyselyiden osalta tämä takaa järjestyksen, mutta takaa myös, että sen saavuttamiseksi ei ole ylimääräistä lajittelulaskentaa, esimerkiksi:
> 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.
jos indeksi käyttää jo avainsanaa DESC
, sen merkitys käännetään (peruutetaan), jos ORDER BY
lausekkeessa käytetään myösDESC
, esimerkiksi:
tilausrivit DML-lausekkeissa
käytettäessä ORDER BY
INSERT
,UPSERT
, UPDATE
taiDELETE
(ts., DML-lauseke), ORDER BY
lauseke merkitään, jos sitä ei käytetä yhdessä LIMIT
: n ja/taiOFFSET
: n kanssa.
sekä ORDER BY
että LIMIT
/OFFSET
yhdistelmä määrittää, mitä syötteen rivejä käytetään tabledatan lisäämiseen, päivittämiseen tai poistamiseen, mutta se ei määritä, missä järjestyksessä mutaatio tulee tilalle.
esimerkiksi käyttäen 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.
syy siihen, miksi ORDER BY
ei hallitse taulukon rivien lopullista järjestystä, on se, että rivien järjestys kohdetaulukossa määräytyy sen ensisijaisen ja toissijaisen indeksin mukaan.
RETURNING
lausekkeen tuloksen järjestämiseksi katso poistojen Lajittelu.
Lajittele poistojen ulostulo
Lajittele DELETE
lausekkeen tuloste, käytä:
> WITH a AS (DELETE ... RETURNING ...) SELECT ... FROM a ORDER BY ...
esimerkki: katso poistettujen rivien lajittelu ja palautus.
Katso myös
- Valintakyselyt
- Skalaarilausekkeet
INSERT
UPSERT
DELETE
UPDATE
oliko tästä sivusta apua?
Kyllä Ei