Kiválasztás (SQL)

A stabil verziót 2022. április 11-én nézték meg . Ellenőrizetlen változtatások vannak a sablonokban vagy a .

A SELECT (az angol  select  - "select" szóból) egy lekérdezési operátor ( DML / DQL ) az SQL nyelvben , amely egy adatkészletet (kiválasztást) ad vissza az adatbázisból .

Az operátor nulla vagy több sort ad vissza. A visszaadandó oszlopok listája az utasítás SELECT részében van megadva. Mivel az SQL deklaratív nyelv, a SELECT lekérdezés csak a visszaadott adatkészlet követelményeit határozza meg, és nem ad pontos utasítást ezek kiszámítására. A DBMS a SELECT lekérdezést belső végrehajtási tervvé ("lekérdezési terv") fordítja le, amely még az adott DBMS-től szintaktikailag azonos lekérdezések esetén is eltérhet.

A SELECT utasítás több tagmondatból (szakaszból) áll:

Operátor szerkezet

A SELECT utasítás szerkezete a következő:

KIVÁLASZTÁS [ DISTINCT | DISTINCTROW | ALL ] select_expression ,... FROM table_references [ WHERE where_definition ] [ GROUP BY { unsigned_integer | oszlopnév | formula } ] [ HAVING where_definition ] [ ORDER BY { unsigned_integer | oszlopnév | képlet } [ ASC | DESC ], ...]

Üzemeltetői javaslatok

KIVÁLASZTÁS

Az SELECToperátori záradék SELECTcélja, hogy meghatározza az oszlopok eredményhalmazát, amelyet azután kapunk, hogy a záradékban lévő táblázatkifejezést kiértékelték FROMés csoportosították az eredményben GROUP BY(ha van ilyen). A záradék SELECTegy vetítési műveletet valósít meg, azaz egy táblázatkifejezés tábláinak oszlopainak egy részét adja meg, valamint egy oszlopok átnevezési műveletet és egy új kiszámítható oszlopok hozzáadásának műveletét.

FROM

A záradék FROMaz alaptábla-kifejezés kiértékelésére szolgál, amelyet azután az operátor többi tagmondata használ SELECT.

WHERE

A záradékot [[WHERE (SQL)|WHERE]] arra használjuk, hogy meghatározzuk, mely sorokat válasszuk ki a záradékban található táblázatkifejezésből FROM.

GROUP BY

[[GROUP BY (SQL)|GROUP BY]] — egy opcionális operátori záradék SELECTa sorok csoportosítására aggregált függvények eredményei alapján ( MAX, SUM, AVG, …).

A mondatban SELECTcsak a kimeneti adatfolyamban szükséges oszlopokat kell megadni, GROUP BYés/vagy összesített értékeket kell megadni. Gyakori hiba, hogy egy olyan SELECToszlopot vesznek fel egy mondatba, amely hiányzik a GROUP BY.

HAVING

HAVING egy opcionális operátori javaslat SELECTa következőből származó csoportok kiválasztásához GROUP BY.

Ha meg van adva , HAVING <условия>feltételeket adhat meg a -ban megadott oszlopokon GROUP BYés az összesített függvények értékein, amelyeket az által alkotott csoportok mindegyikére számítanak ki GROUP BY.

MEGRENDELÉS

ORDER BY az SELECTés operátorok opcionális záradéka UNION, ami azt jelenti, hogy a SELECT, operátorok UNIONegy vagy több oszlop értékei szerint rendezett sorok halmazát adják vissza. Numerikus oszlopokra és karakterláncokra egyaránt alkalmazható. Az utóbbi esetben a rendezés ábécé szerint történik .

A záradék ORDER BYhasználata az egyetlen módja a sorok eredményhalmazának rendezésének. E záradék nélkül a DBMS bármilyen sorrendben visszaadhatja a sorokat. Ha rendelésre van szükség, ORDER BYjelen kell lennie a SELECT, UNION.

A rendezés történhet növekvő vagy csökkenő sorrendben.

  • Az ASC(alapértelmezett) opció a rendezési sorrendet növekvő sorrendben állítja be, a legkisebb értéktől a legnagyobbig.
  • A paraméter DESCa rendezési sorrendet csökkenő sorrendben állítja be, a legnagyobbtól a legkisebbig.

Példák

"T" tábla Kérés Eredmény
C1 C2
egy a
2 b
KIVÁLASZTÁS * FROM T
C1 C2
egy a
2 b
C1 C2
egy a
2 b
KIVÁLASZTÁS A C1 -BŐL T
C1
egy
2
C1 C2
egy a
2 b
SELECT * FROM T WHERE C1 = 1
C1 C2
egy a
C1 C2
egy a
2 b
KIVÁLASZTÁS * FROM T ORDER BY C1 DESC
C1 C2
2 b
egy a

T tábla lekérdezéséhez

KIVÁLASZTÁS * FROM T

visszaadja az adott tábla összes sorának összes oszlopát. Ugyanerre a táblára vonatkozó lekérdezés

KIVÁLASZTÁS A C1 -BŐL T

az összes táblázatsor C1 oszlopának értékeit adja vissza. A relációs algebra szempontjából azt mondhatjuk, hogy egy vetítés készült . Ugyanerre a táblára vonatkozó lekérdezés

SELECT * FROM T WHERE C1 = 1

visszaadja a táblázat összes olyan sorának összes oszlopának értékét, amelynél a C1 mező értéke 1. A relációs algebra szempontjából azt mondhatjuk, hogy a kijelölés megtörtént . Utolsó kérés

KIVÁLASZTÁS * FROM T ORDER BY C1 DESC

ugyanazokat a sorokat adja vissza, mint az első, azonban az eredmény fordított sorrendben (ZA) lesz rendezve, mivel az ORDER BY kulcsszót C1 mezővel rendezési mezőként használja. Ez a lekérdezés nem tartalmazza a WHERE kulcsszót, ezért a táblázatban szereplő tartalmat adja vissza. Több ORDER BY elem is megadható vesszővel elválasztva [pl. MEGRENDELÉS C1 ASC, C2 DESC] a pontosabb válogatás érdekében.

Kijelöli az összes olyan sort, ahol az oszlopnév mező megegyezik a felsorolt ​​értékek egyikével: érték1, érték2,…

SELECT * FROM táblanév WHERE oszlopnév IN ( érték1 , érték2 , ...)

Visszaadja azon részlegazonosítók listáját, amelyek eladásai 2000. január 1-jén meghaladták az 1000-et, valamint az aznapi értékesítési összértéküket:

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

A visszaadott karakterláncokra vonatkozó korlátozás

Az ISO SQL:2003 szerint a visszaadott adatkészlet a következőkkel korlátozható:

  • kurzorok , vagy
  • ablakfüggvények bevezetése a SELECT utasításba

ROW_NUMBER() ablakfüggvény

Különféle ablakfunkciók vannak . ROW_NUMBER() OVERsegítségével egyszerűen korlátozható a visszaadott sorok száma. Például, ha legfeljebb tíz sort szeretne visszaadni:

SELECT * FROM ( SELECT ROW_NUMBER ( ) OVER ( ORDER BY kulcs ASC ) AS sorszám , oszlopok FROM táblanév ) AS foo WHERE sorszám <= 10

A ROW_NUMBER lehet nem determinisztikus: ha a kulcs nem egyedi, akkor a lekérdezés minden egyes végrehajtásakor különböző számokat rendelhet az azonos kulcsú sorokhoz. Ha a kulcs egyedi, minden sor mindig egyedi sorszámot kap.

A RANK() ablakfüggvény

A függvény RANK() OVERnagyjából ugyanúgy működik, mint a ROW_NUMBER, de bizonyos feltételek mellett n -nél több sort is visszaadhat. Például az első 10 legfiatalabb személy megtalálásához:

SELECT * FROM ( SELECT RANK ( ) OVER ( ORDER BY kor ASC ) AS rangsor , személyazonosító , személynév , életkor FROM személy ) AS foo WHERE rangsor <= 10

Ez a kód több mint 10 sort adhat vissza. Például, ha két azonos korú ember van, akkor 11 sort ad vissza.

Nem szabványos szintaxis

Nem minden DBMS támogatja a fenti ablakfunkciókat. Ugyanakkor sok nem szabványos szintaxissal rendelkezik ugyanazon problémák megoldására. Az alábbiakban példák találhatók a különböző DBMS-ek egyszerű mintavételi megszorításaira:

Szállító/DBMS Kényszer szintaxis
DB2 (Támogatja a szabványt a DB2 6-os verziója óta)
KIVÁLASZTÁS * A [ T ] -BÓL CSAK AZ ELSŐ 10 SOR KERESÉSE LE
Tűzmadár ELSŐ 10 KIVÁLASZTÁSA * A [ T ] -BÓL
Informix ELSŐ 10 KIVÁLASZTÁSA * A [ T ] -BÓL
Interbase KIVÁLASZTÁS * A [ T ] 10. SORBÓL
Microsoft (Az SQL Server 2005 óta támogatja a szabványt)
IsKIVÁLASZTÁS TOP 10 [ SZÁZALÉK ] * RENDEZÉS SZÁM SZERINT _ _
MySQL KIVÁLASZTÁS * A T HATÁRÉRTŐL 10
SQLite KIVÁLASZTÁS * A T HATÁRÉRTŐL 10
PostgreSQL (Támogatja a szabványt a PostgreSQL 8.4 óta)
KIVÁLASZTÁS * A T HATÁRÉRTŐL 10
Jóslat (Az Oracle8i óta támogatja a szabványt)
IsKIVÁLASZTÁS * FROM T WHERE SOR <= 10

Irodalom

  • Chamberlin, Donald D. Az SQL korai története . // IEEE Annals of the History of Computing 34.4 (2012): 78-82. (Angol)
  • Alex Kriegel, Boris M. Trukhnov. SQL Biblia (2. kiadás). Wiley Publishing, 2008.  (angol)
  • Gruber M. Az SQL megértése. - Moszkva, 1993. - 291 p.