Vælg (SQL)

Den stabile version blev tjekket ud den 11. april 2022 . Der er ubekræftede ændringer i skabeloner eller .

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):

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
C1 C2
en -en
2 b
VÆLG * FRA T
C1 C2
en -en
2 b
C1 C2
en -en
2 b
VÆLG C1 FRA T
C1
en
2
C1 C2
en -en
2 b
VÆLG * FRA HVOR C1 = 1 _
C1 C2
en -en
C1 C2
en -en
2 b
VÆLG * FRA BESTILLING AF C1 DESC _
C1 C2
2 b
en -en

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.