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 UPDATElausekkeissa.
- 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
ASaikaisemminSELECTkohdassa. Tällöin lajitteluavaimena käytetäänSELECTlausekkeen laskemaa arvoa. - positiivinen kokonaisluku, joka ilmaisee jonkin tietolähteen sarakkeista, joko
FROMlausekkeenSELECT, jossa se tapahtuu, tai taulukon kirjoittaaDELETEtaiUPDATE. 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 ORDINALITYlausekkeen operandin järjestys (FROMSELECTlausekkeen operandin sisällä) on säilynyt,jotta rivien numerointia voidaan hallita. - itsenäisen
LIMITtaiOFFSETlausekkeen operandin järjestys (withinaFROMSELECTlausekkeen operandi) säilyy, jotta voidaan määrittää, mitkä rivit pidetään tuloksessa. -
INSERT– lausekkeen taiUPSERT– lausekkeen, jossa myösLIMITkäytetään, tietolähteen järjestys säilytetään, jotta voidaan määrittää, mitä rivejä käsitellään, mutta ei niiden järjestystä. -
UPDATEtaiDELETElauseketta, 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 BYettä 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
INSERTUPSERTDELETEUPDATE
oliko tästä sivusta apua?
Kyllä
Ei