Selectați (SQL)

Versiunea stabilă a fost verificată pe 11 aprilie 2022 . Există modificări neverificate în șabloane sau .

SELECT (din engleză  select  - „select”) este un operator de interogare ( DML / DQL ) în limbajul SQL care returnează un set de date (selectare) din baza de date .

Operatorul returnează zero sau mai multe rânduri. Lista coloanelor de returnat este specificată în partea din instrucțiune numită clauza SELECT. Deoarece SQL este un limbaj declarativ, interogarea SELECT definește doar cerințele pentru setul de date returnat și nu este o instrucțiune precisă despre cum să le calculeze. SGBD traduce interogarea SELECT într-un plan intern de execuție („plan de interogare”), care poate diferi chiar și pentru interogări identice sintactic de la un anumit SGBD.

Instrucțiunea SELECT constă din mai multe clauze (secțiuni):

Structura operatorului

Instrucțiunea SELECT are următoarea structură:

SELECTAȚI [ DISTINCT | DISTINCTROW | ALL ] select_expression ,... FROM table_references [ WHERE unde_definition ] [ GROUP BY { unsigned_integer | col_name | formula } ] [ AVÂND unde_definiție ] [ ORDER BY { unsigned_integer | col_name | formula } [ ASC | DESC ], ...]

Sugestiile operatorului

SELECTAȚI

Clauza SELECToperator SELECTare scopul de a defini setul de coloane de rezultat care se obține după ce expresia tabelului din clauză a fost evaluată FROMși grupată în rezultat GROUP BY(dacă există). Clauza SELECTimplementează o operație de proiecție, adică specificarea unui subset de coloane din tabelele unei expresii de tabel, precum și o operație de redenumire a coloanelor și o operație de adăugare de noi coloane calculabile.

DE LA

Clauza FROMeste folosită pentru a evalua expresia tabelului de bază, care este apoi folosită de restul clauzelor operatorului SELECT.

UNDE

Clauza [[WHERE (SQL)|WHERE]] este folosită pentru a determina ce rânduri trebuie selectate din expresia tabelului din clauză FROM.

GROUP BY

[[GROUP BY (SQL)|GROUP BY]] — o clauză operator opțională SELECT, pentru gruparea rândurilor pe baza rezultatelor funcțiilor agregate ( MAX, SUM, AVG, …).

SELECTEste necesar ca numai coloanele necesare în fluxul de ieșire, listate în GROUP BYși/sau valori agregate , să fie specificate în propoziție . O greșeală comună este să includeți o SELECTcoloană într-o propoziție care lipsește din GROUP BY.

AVÂND

HAVING este o sugestie opțională a operatorului SELECTpentru selectarea grupurilor rezultate din GROUP BY.

Atunci când este specificat , HAVING <условия>puteți specifica condiții pe coloanele specificate în GROUP BYși pe valorile funcțiilor agregate calculate pentru fiecare grup format din GROUP BY.

COMANDA DE

ORDER BY este o clauză opțională a operatorilor SELECTși UNION, ceea ce înseamnă că operatorii SELECT, UNIONreturnează un set de rânduri sortate după valorile uneia sau mai multor coloane. Poate fi aplicat atât coloanelor numerice, cât și șirurilor. În acest din urmă caz, sortarea va avea loc alfabetic .

Utilizarea unei clauze ORDER BYeste singura modalitate de a sorta setul de rânduri rezultat. Fără această clauză, SGBD poate returna rândurile în orice ordine. Dacă este necesară comanda, ORDER BYtrebuie să fie prezent în SELECT, UNION.

Sortarea se poate face în ordine crescătoare sau descrescătoare.

  • Opțiunea ASC(implicit) setează ordinea de sortare în ordine crescătoare, de la cele mai mici valori la cele mai mari.
  • Parametrul DESCsetează ordinea de sortare în ordine descrescătoare, de la cel mai mare la cel mai mic.

Exemple

Tabelul „T”. Cerere Rezultat
C1 C2
unu A
2 b
SELECTAȚI * DIN T
C1 C2
unu A
2 b
C1 C2
unu A
2 b
SELECTAȚI C1 DIN T
C1
unu
2
C1 C2
unu A
2 b
SELECTAȚI * DIN T UNDE C1 = 1
C1 C2
unu A
C1 C2
unu A
2 b
SELECTAȚI * DIN T ORDER BY C1 DESC
C1 C2
2 b
unu A

Pentru interogarea tabelului T

SELECTAȚI * DIN T

va returna toate coloanele din toate rândurile din tabelul dat. Pentru același tabel, interogați

SELECTAȚI C1 DIN T

va returna valorile coloanei C1 din toate rândurile tabelului. În ceea ce priveşte algebrei relaţionale , putem spune că a fost făcută o proiecţie . Pentru același tabel, interogați

SELECTAȚI * DIN T UNDE C1 = 1

va returna valorile tuturor coloanelor din toate rândurile tabelului pentru care valoarea câmpului C1 este egală cu 1. În ceea ce privește algebra relațională , putem spune că a fost făcută o selecție . Ultima cerere

SELECTAȚI * DIN T ORDER BY C1 DESC

va returna aceleași rânduri ca și primul, totuși rezultatul va fi sortat în ordine inversă (ZA) datorită utilizării cuvântului cheie ORDER BY cu câmpul C1 ca câmp de sortare. Această interogare nu conține cuvântul cheie WHERE, așa că va returna orice se află în tabel. Mai multe elemente ORDER BY pot fi specificate separate prin virgule [ex. ORDER BY C1 ASC, C2 DESC] pentru o sortare mai precisă.

Selectează toate rândurile în care câmpul nume_coloană este egal cu una dintre valorile enumerate value1, value2,...

SELECT * FROM nume_tabel WHERE nume_coloană IN ( valoare1 , valoare2 , ...)

Returnează o listă de ID-uri de departament ale căror vânzări au depășit 1000 la 1 ianuarie 2000, împreună cu totalul vânzărilor lor pentru ziua respectivă:

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

Restricție privind șirurile returnate

Conform ISO SQL:2003 , setul de date returnat poate fi limitat cu:

  • cursoare sau
  • introducerea de funcții de fereastră în instrucțiunea SELECT

Funcția ferestrei ROW_NUMBER()

Există diferite funcții ale ferestrei . ROW_NUMBER() OVERpoate fi folosit pentru a limita pur și simplu numărul de rânduri returnate. De exemplu, pentru a returna nu mai mult de zece rânduri:

SELECT * FROM ( SELECT ROW_NUMBER () OVER ( ORDER BY tasta ASC ) AS rownumber , coloane FROM tablename ) AS foo WHERE rownumber <= 10

ROW_NUMBER poate fi nedeterminist: dacă cheia nu este unică, de fiecare dată când se execută interogarea, este posibil să se atribuie numere diferite rândurilor care au aceeași cheie . Când cheia este unică, fiecare linie va primi întotdeauna un număr unic de linie.

Funcția ferestrei RANK()

Funcția RANK() OVERfuncționează în același mod ca ROW_NUMBER, dar poate returna mai mult de n rânduri în anumite condiții. De exemplu, pentru a obține primii 10 cei mai tineri:

SELECT * FROM ( SELECT RANK () OVER ( ORDER BY age ASC ) AS clasament , person_id , person_name , age FROM person ) AS foo WHERE clasament <= 10

Acest cod poate returna mai mult de 10 rânduri. De exemplu, dacă există două persoane cu aceeași vârstă, va returna 11 rânduri.

Sintaxă non-standard

Nu toate SGBD-urile acceptă funcțiile ferestrei de mai sus. În același timp, mulți au sintaxă non-standard pentru rezolvarea acelorași probleme. Mai jos sunt exemple de constrângeri simple de eșantionare pentru diferite SGBD:

Furnizor/DBMS Sintaxa constrângerii
DB2 (Acceptă standard începând cu DB2 Versiunea 6)
SELECTAȚI * DIN [ T ] ADUCE NUMAI PRIMELE 10 RÂNDURI
pasăre de foc SELECTAȚI PRIMILE 10 * DIN [ T ]
Informix SELECTAȚI PRIMILE 10 * DIN [ T ]
Interbază SELECTAȚI * DIN [ T ] RÂNDURI 10
Microsoft (Acceptă standard începând cu SQL Server 2005)
De asemeneaSELECTARE TOP 10 [ PROCENT ] * DIN T ORDER BY col
MySQL SELECTAȚI * DIN T LIMITĂ 10
SQLite SELECTAȚI * DIN T LIMITĂ 10
PostgreSQL (Acceptă standardul de la PostgreSQL 8.4)
SELECTAȚI * DIN T LIMITĂ 10
Oracol (Acceptă standardul de la Oracle8i)
De asemeneaSELECTAȚI * DIN T WHERE ROWNUM <= 10

Literatură

  • Chamberlin, Donald D. Istoria timpurie a SQL . // IEEE Annals of the History of Computing 34.4 (2012): 78-82. (Engleză)
  • Alex Kriegel, Boris M. Truhnov. Biblia SQL (ed. a II-a). Wiley Publishing, 2008.  (engleză)
  • Gruber M. Înțelegerea SQL-ului. - Moscova, 1993. - 291 p.