Vælg (SQL)
SELECT (fra det engelske select - "select") er en forespørgselsoperator ( DML / DQL ) i SQL -sproget , der returnerer et datasæt (selektion) fra databasen .
Operatøren returnerer nul eller flere rækker. Listen over kolonner, der skal returneres, er angivet i den del af sætningen, der kaldes SELECT-sætningen. Da SQL er et deklarativt sprog, definerer SELECT-forespørgslen kun kravene til det returnerede datasæt og er ikke en præcis instruktion om, hvordan de beregnes. DBMS'et oversætter SELECT-forespørgslen til en intern eksekveringsplan ("forespørgselsplan"), som kan afvige selv for syntaktisk identiske forespørgsler fra et specifikt DBMS.
SELECT-sætningen består af flere klausuler (sektioner):
- SELECT definerer listen over returnerede kolonner (både eksisterende og beregnede), deres navne, begrænsninger på unikheden af rækker i det returnerede sæt, begrænsninger på antallet af rækker i det returnerede sæt;
- FROM angiver et tabeludtryk, der definerer et basisdatasæt til at anvende operationer defineret i andre operatorudtryk;
- WHERE angiver en grænse for rækkerne i et tabeludtryk fra FROM-udtrykket;
- GROUP BY kombinerer rækker, der har den samme egenskab, ved hjælp af aggregerede funktioner
- HAVING vælger blandt grupperne defineret af GROUP BY parameteren
- ORDER BY specificerer kriterier for sortering af rækker; de sorterede rækker videregives til alarmen.
Operatørstruktur
SELECT-sætningen har følgende struktur:
VÆLG
[ DISTINCT | DISTINCTROW | ALL ]
select_expression ,...
FROM table_references
[ WHERE where_definition ]
[ GROUP BY { unsigned_integer | col_name | formel } ]
[ HAR hvor_definition ]
[ BESTIL EFTER { unsigned_integer | col_name | formel } [ ASC | DESC ], ...]
Operatørens forslag
VÆLG
Operatorudtrykket SELECTer SELECTberegnet til at definere det resultatsæt af kolonner, der opnås efter tabeludtrykket i udtrykket er blevet evalueret FROMog grupperet i resultatet GROUP BY(hvis nogen). Udtrykket SELECTimplementerer en projektionsoperation, det vil sige specificering af et undersæt af kolonner fra tabeller i et tabeludtryk, såvel som en operation med at omdøbe kolonner og en operation med tilføjelse af nye beregnelige kolonner.
FRA
Klausulen FROMbruges til at evaluere basistabeludtrykket, som derefter bruges af resten af operatorens klausuler SELECT.
HVOR
Klausulen [[WHERE (SQL)|WHERE]] bruges til at bestemme hvilke rækker der skal vælges fra tabeludtrykket i klausulen FROM.
GRUPPER EFTER
[[GROUP BY (SQL)|GROUP BY]] — en valgfri operatorsætning SELECTtil gruppering af rækker baseret på resultaterne af aggregerede funktioner ( MAX, SUM, AVG, …).
SELECTDet er nødvendigt, at kun de kolonner, der kræves i outputstrømmen, angivet i GROUP BYog/eller aggregerede værdier , angives i sætningen . En almindelig fejl er at inkludere en SELECTkolonne i en sætning, der mangler i GROUP BY.
HAR
HAVING er et valgfrit operatørforslag SELECTtil valg af grupper, der stammer fra GROUP BY.
Når det er angivet , kan du HAVING <условия>angive betingelser på kolonnerne angivet i GROUP BYog på værdierne af aggregerede funktioner beregnet for hver gruppe dannet af GROUP BY.
BESTIL AF
ORDER BY er en valgfri klausul af operatorerne SELECTog UNION, hvilket betyder, at SELECToperatorerne UNIONreturnerer et sæt rækker sorteret efter værdierne af en eller flere kolonner. Det kan anvendes på både numeriske kolonner og strenge. I sidstnævnte tilfælde vil sortering ske alfabetisk .
Brug af en klausul ORDER BYer den eneste måde at sortere resultatet af rækker på. Uden denne klausul kan DBMS returnere rækkerne i vilkårlig rækkefølge. Ved behov for bestilling, ORDER BYskal være til stede i SELECT, UNION.
Sortering kan udføres i stigende eller faldende rækkefølge.
- Indstillingen
ASC(standard) indstiller sorteringsrækkefølgen i stigende rækkefølge, fra mindste værdier til største. - Parameteren
DESCindstiller sorteringsrækkefølgen i faldende rækkefølge, fra største til mindste.
Eksempler
| "T" bord | Anmodning | Resultat | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
VÆLG * FRA T
|
| ||||||||||||
|
VÆLG C1 FRA T
|
| ||||||||||||
|
VÆLG * FRA HVOR C1 = 1 _
|
| ||||||||||||
|
VÆLG * FRA BESTILLING AF C1 DESC _
|
|
Til tabel T-forespørgsel
VÆLG * FRA T
returnerer alle kolonner i alle rækker i den givne tabel. For den samme tabel, forespørg
VÆLG C1 FRA T
returnerer værdierne i kolonne C1 i alle tabelrækker. Med hensyn til relationel algebra kan vi sige, at der er lavet en fremskrivning . For den samme tabel, forespørg
VÆLG * FRA HVOR C1 = 1 _
vil returnere værdierne for alle kolonner i alle rækker i tabellen, for hvilke værdien af feltet C1 er lig med 1. Med hensyn til relationel algebra kan vi sige, at der er foretaget et valg . Sidste anmodning
VÆLG * FRA BESTILLING AF C1 DESC _
vil returnere de samme rækker som den første, men resultatet vil blive sorteret i omvendt rækkefølge (ZA) på grund af brugen af ORDER BY nøgleordet med C1 feltet som sorteringsfeltet. Denne forespørgsel indeholder ikke nøgleordet WHERE, så det vil returnere det, der er i tabellen. Flere ORDER BY-elementer kan angives adskilt med kommaer [f.eks. BESTIL EFTER C1 ASC, C2 DESC] for mere præcis sortering.
Vælger alle rækker, hvor feltet kolonnenavn er lig med en af de opregnede værdier værdi1, værdi2,...
VÆLG *
FRA
tabelnavn
WHERE
kolonnenavn IN ( værdi1 , værdi2 , ...)
Returnerer en liste over afdelings-id'er, hvis salg oversteg 1000 den 1. januar 2000, sammen med deres salgstotaler for den pågældende dag:
VÆLG
DeptID ,
SUM ( SaleAmount )
FRA
Salg
HVOR
SaleDate = '01-Jan-2000'
GRUPPER EFTER DeptID HAR SUM ( SaleAmount ) > 1000
Begrænsning af returnerede strenge
Ifølge ISO SQL:2003 kan det returnerede datasæt begrænses med:
- markører , eller
- introduktion af vinduesfunktioner i SELECT-sætningen
ROW_NUMBER() vinduesfunktion
Der er forskellige vinduesfunktioner . ROW_NUMBER() OVERkan bruges til blot at begrænse antallet af returnerede rækker. For eksempel for at returnere ikke mere end ti rækker:
VÆLG * FRA (
SELECT
ROW_NUMBER () OVER ( ORDER BY key ASC ) SOM rækkenummer ,
kolonner
FRA tabelnavn
) SOM foo
WHERE rækkenummer <= 10
ROW_NUMBER kan være ikke-deterministisk: hvis nøglen ikke er unik, er det muligt at tildele forskellige numre til rækker, der har den samme nøgle , hver gang forespørgslen udføres . Når nøglen er unik, vil hver linje altid få et unikt linjenummer.
RANK() vinduesfunktionen
Funktionen RANK() OVERfungerer stort set på samme måde som ROW_NUMBER, men kan returnere mere end n rækker under visse betingelser. For eksempel for at få top 10 yngste mennesker:
VÆLG * FRA (
VÆLG
RANK () OVER ( ORDER BY age ASC ) AS ranking ,
person_id ,
person_name ,
age
FROM person
) AS foo
WHERE ranking <= 10
Denne kode kan returnere mere end 10 rækker. For eksempel, hvis der er to personer med samme alder, vil det returnere 11 rækker.
Ikke-standard syntaks
Ikke alle DBMS understøtter ovenstående vinduesfunktioner. Samtidig har mange ikke-standard syntaks til at løse de samme problemer. Nedenfor er eksempler på simple prøveudtagningsbegrænsninger for forskellige DBMS'er:
| Leverandør/DBMS | Begrænsningssyntaks |
|---|---|
| DB2 | (Understøtter standard siden DB2 Version 6) |
VÆLG * FRA [ T ] HENT KUN DE FØRSTE 10 RÆKKER
| |
| ildfugl | VÆLG FØRSTE 10 * FRA [ T ]
|
| Informix | VÆLG FØRSTE 10 * FRA [ T ]
|
| Interbase | VÆLG * FRA [ T ] RÆKKER 10
|
| Microsoft | (Understøtter standard siden SQL Server 2005) |
OgsåVÆLG TOP 10 [ PROCENT ] * FRA BESTILLING EFTER kol _
| |
| MySQL | VÆLG * FRA T LIMIT 10
|
| SQLite | VÆLG * FRA T LIMIT 10
|
| PostgreSQL | (Understøtter standard siden PostgreSQL 8.4) |
VÆLG * FRA T LIMIT 10
| |
| Oracle | (Understøtter standard siden Oracle8i) |
OgsåVÆLG * FRA HVOR ROWNUM < = 10
|
Litteratur
- Chamberlin, Donald D. Tidlig historie af SQL . // IEEE Annals of the History of Computing 34.4 (2012): 78-82. (Engelsk)
- Alex Kriegel, Boris M. Trukhnov. SQL Bible (2. udgave). Wiley Publishing, 2008. (engelsk)
- Gruber M. Forståelse af SQL. - Moskva, 1993. - 291 s.