Valitse (SQL)

Vakaa versio kirjattiin ulos 11.4.2022 . Malleissa tai malleissa on vahvistamattomia muutoksia .

SELECT ( englannin sanasta  select  - "select") on SQL -kielen kyselyoperaattori ( DML / DQL ), joka palauttaa tietojoukon (valinnan) tietokannasta .

Operaattori palauttaa nollan tai useamman rivin. Palautettavien sarakkeiden luettelo määritetään käskyn osassa, jota kutsutaan SELECT-lauseeksi. Koska SQL on deklaratiivinen kieli, SELECT-kysely määrittää vain palautetun tietojoukon vaatimukset, eikä se ole tarkka ohje niiden laskemiseen. DBMS kääntää SELECT-kyselyn sisäiseksi suoritussuunnitelmaksi ("kyselysuunnitelma"), joka voi poiketa jopa syntaktisesti identtisissä kyselyissä tietystä DBMS:stä.

SELECT-lause koostuu useista lauseista (osioista):

Operaattorin rakenne

SELECT-käskyllä ​​on seuraava rakenne:

VALITSE [ DISTINCT | DISTINCTROW | KAIKKI ] select_expression ,... FROM taulukkoviittaukset [ WHERE where_definition ] [ GROUP BY { unsigned_integer | sarakkeen_nimi | kaava } ] [ ON missä_määritelmä ] [ ORDER BY { unsigned_integer | sarakkeen_nimi | kaava } [ ASC | DESC ], ...]

Operaattorin ehdotukset

VALITSE

Operaattorilause on tarkoitettu määrittelemään sarakkeiden tulosjoukko, joka saadaan sen jälkeen, kun lauseessa oleva taulukkolauseke on arvioitu SELECTja ryhmitelty tulokseen (jos sellainen on). Lause toteuttaa projektiooperaation, eli taulukon lausekkeen taulukoiden sarakkeiden osajoukon määrittämisen sekä sarakkeiden uudelleennimeämisen ja uusien laskettavien sarakkeiden lisäämisen. SELECTFROMGROUP BYSELECT

FROM

Lausea FROMkäytetään perustaulukon lausekkeen arvioimiseen, jota sitten käyttävät muut operaattorin lausekkeet SELECT.

MISSÄ

Lauseen [[WHERE (SQL)|WHERE]] avulla määritetään, mitkä rivit tulee valita lauseen taulukkolausekkeesta FROM.

GROUP BY

[[GROUP BY (SQL)|GROUP BY]] — valinnainen operaattorilause , jolla ryhmitellään rivejä aggregaattifunktioiden ( , , , …) SELECTtulosten perusteella .MAXSUMAVG

On välttämätöntä, että lauseessa määritetään SELECTvain tulosvirran vaaditut sarakkeet, jotka on lueteltu GROUP BYja/tai aggregoidut arvot . Yleinen virhe on sisällyttää SELECTlauseeseen sarake, joka puuttuu GROUP BY.

HAVING

HAVING on valinnainen operaattoriehdotus, SELECTjonka avulla voit valita ryhmistä, jotka johtuvat GROUP BY.

Kun määritetään , voit HAVING <условия>määrittää ehtoja sarakkeille, jotka on määritetty kohdassa , GROUP BYja kullekin funktion muodostamalle ryhmälle laskettujen aggregaattifunktioiden arvoille GROUP BY.

TILAA

ORDER BYSELECTon ja  -operaattoreiden valinnainen lauseke UNION, mikä tarkoittaa, että SELECT, -operaattorit UNIONpalauttavat joukon rivejä, jotka on lajiteltu yhden tai useamman sarakkeen arvojen mukaan. Sitä voidaan soveltaa sekä numeerisiin sarakkeisiin että merkkijonoihin. Jälkimmäisessä tapauksessa lajittelu tapahtuu aakkosjärjestyksessä .

Lauseen käyttö ORDER BYon ainoa tapa lajitella rivien tulosjoukko. Ilman tätä lauseketta DBMS voi palauttaa rivit missä tahansa järjestyksessä. Jos tilaus tarvitaan, ORDER BYon oltava läsnä SELECT, UNION.

Lajittelu voidaan tehdä nousevassa tai laskevassa järjestyksessä.

  • ( Oletusasetus ASC) asettaa lajittelujärjestyksen nousevaan järjestykseen pienimmistä arvoista suurimpaan.
  • Parametri DESCasettaa lajittelujärjestyksen laskevassa järjestyksessä suurimmasta pienimpään.

Esimerkkejä

"T" pöytä Pyyntö Tulos
C1 C2
yksi a
2 b
VALITSE * FROM T
C1 C2
yksi a
2 b
C1 C2
yksi a
2 b
VALITSE C1 T : STA
C1
yksi
2
C1 C2
yksi a
2 b
VALITSE * FROM T , MISSÄ C1 = 1
C1 C2
yksi a
C1 C2
yksi a
2 b
SELECT * FROM T ORDER BY C1 DESC
C1 C2
2 b
yksi a

Taulukon T kyselyyn

VALITSE * FROM T

palauttaa annetun taulukon kaikkien rivien kaikki sarakkeet. Samaa taulukkoa varten kysely

VALITSE C1 T : STA

palauttaa kaikkien taulukon rivien sarakkeen C1 arvot. Relaatioalgebran osalta voidaan sanoa, että projektio on tehty . Samaa taulukkoa varten kysely

VALITSE * FROM T , MISSÄ C1 = 1

palauttaa taulukon kaikkien rivien kaikkien sarakkeiden arvot, joille kentän C1 arvo on 1. Relaatioalgebran suhteen voidaan sanoa, että valinta on tehty . Viimeinen pyyntö

SELECT * FROM T ORDER BY C1 DESC

palauttaa samat rivit kuin ensimmäinen, mutta tulos lajitellaan käänteisessä järjestyksessä (ZA), koska ORDER BY -avainsanaa käytetään C1-kentän lajittelukentässä. Tämä kysely ei sisällä WHERE-avainsanaa, joten se palauttaa mitä tahansa taulukosta. Useita ORDER BY -elementtejä voidaan määrittää pilkuilla erotettuina [esim. TILAA C1 ASC, C2 DESC] tarkempaan lajitteluun.

Valitsee kaikki rivit, joissa sarakkeen_nimi-kenttä on yhtä suuri kuin jokin luetelluista arvoista arvo1, arvo2,…

SELECT * FROM taulukon_nimi WHERE sarakkeen_nimi IN ( arvo1 , arvo2 , ...)

Palauttaa luettelon osastotunnuksista, joiden myynti ylitti 1 000 1. tammikuuta 2000, sekä niiden kyseisen päivän myyntimäärät:

SELECT DeptID , SUM ( SaleAmount ) FROM Sales WHERE SaleDate = '01-Jan-2000' GROUP BY DeptID HAVING SUM ( SaleAmount ) > 1000

Palautettujen merkkijonojen rajoitus

ISO SQL:2003: n mukaan palautettava tietojoukko voidaan rajoittaa seuraavilla tavoilla:

  • osoittimet tai
  • ikkunafunktioiden lisääminen SELECT- käskyyn

ROW_NUMBER() ikkunafunktio

Ikkunatoimintoja on erilaisia . ROW_NUMBER() OVERvoidaan yksinkertaisesti rajoittaa palautettavien rivien määrää. Jos esimerkiksi haluat palauttaa enintään kymmenen riviä:

SELECT * FROM ( SELECT ROW_NUMBER ( ) OVER ( ORDER BY key ASC ) AS rivinumero , sarakkeet FROM taulukon nimi ) AS foo WHERE rivinumero <= 10

ROW_NUMBER voi olla epädeterministinen: jos avain ei ole ainutlaatuinen, joka kerta kun kysely suoritetaan, on mahdollista määrittää eri numeroita riveille, joilla on sama avain . Kun avain on ainutlaatuinen, jokainen rivi saa aina yksilöllisen rivinumeron.

RANK()-ikkunafunktio

Funktio RANK() OVERtoimii paljolti samalla tavalla kuin ROW_NUMBER, mutta voi tietyissä olosuhteissa palauttaa enemmän kuin n riviä. Esimerkiksi saadaksesi 10 parasta nuorinta:

SELECT * FROM ( SELECT RANK ( ) OVER ( JÄRJESTÄ iän mukaan ASC ) AS ranking , henkilötunnus , henkilön_nimi , ikä FROM henkilö ) AS foo WHERE ranking < = 10

Tämä koodi voi palauttaa yli 10 riviä. Jos esimerkiksi kaksi henkilöä on samanikäinen, se palauttaa 11 riviä.

Epätyypillinen syntaksi

Kaikki DBMS-järjestelmät eivät tue yllä olevia ikkunatoimintoja. Samaan aikaan monilla on epästandardi syntaksi samojen ongelmien ratkaisemiseksi. Alla on esimerkkejä yksinkertaisista näytteenottorajoituksista eri tietokantajärjestelmille:

Toimittaja/DBMS Rajoitussyntaksi
DB2 (Tukee standardia DB2-versiosta 6 lähtien)
VALITSE * ASTA [ T ] HAE VAIN 10 ENSIMMÄISET RIVIÄ
tulilintu VALITSE ENSIMMÄISET 10 * ALKAAN [ T ]
Informix VALITSE ENSIMMÄISET 10 * ALKAAN [ T ]
Interbase VALITSE * RIVISTA [ T ] 10 _
Microsoft (Tukee standardia SQL Server 2005:stä lähtien)
MyösVALITSE TOP 10 [ PROSENTTIA ] * T ARJ _ _ _
MySQL VALITSE * T - RAJASTA 10
SQLite VALITSE * T - RAJASTA 10
PostgreSQL (Tukee standardia PostgreSQL 8.4:stä lähtien)
VALITSE * T - RAJASTA 10
Oraakkeli (Tukee standardia Oracle8i:stä lähtien)
MyösVALITSE * MISTÄ RIVI < = 10 _

Kirjallisuus

  • Chamberlin, Donald D. SQL:n varhainen historia . // IEEE Annals of the History of Computing 34.4 (2012): 78-82. (Englanti)
  • Alex Kriegel, Boris M. Trukhnov. SQL Bible (2. painos). Wiley Publishing, 2008.  (englanniksi)
  • Gruber M. SQL:n ymmärtäminen. - Moskova, 1993. - 291 s.