Exemple de grupare după sql. Gruparea datelor Transact-SQL GROUP BY

În acest articol, vă voi spune cum sunt grupate datele, cum să utilizați corect gruparea după și cum să aveți în interior interogări SQL folosind exemplul mai multor interogări.

Majoritatea informațiilor din bazele de date sunt stocate în formă detaliată. Cu toate acestea, este adesea nevoie de a obține rapoarte. De exemplu, aflați numărul total de comentarii ale utilizatorilor sau poate cantitatea de mărfuri din depozite. Există o mulțime de sarcini similare. Prin urmare, limbajul SQL prevede în mod specific pentru astfel de cazuri constructele grup și având, care permit, respectiv, gruparea și filtrarea grupurilor de date rezultate.

Cu toate acestea, utilizarea lor provoacă multe probleme pentru autorii începători de creații de software. Ele nu interpretează corect rezultatele obținute și mecanismul de grupare a datelor în sine. Prin urmare, să ne dăm seama în practică ce se întâmplă și cum.

Ca parte a exemplului, voi lua în considerare doar un singur tabel. Motivul este simplu, acești operatori sunt deja aplicați eșantionului de date rezultat (după combinarea rândurilor de tabel și filtrarea acestora). Deci, adăugarea operatorilor unde și join nu va schimba esența.

Să ne imaginăm exemplu abstract. Să presupunem că aveți un tabel rezumat al utilizatorilor forumului. Să-i spunem userstat și arată așa. Un punct important, credem că un utilizator poate aparține doar unui grup.

user_name - nume de utilizator

forum_group - numele grupului

mess_count - numărul de mesaje

is_have_social_profile - dacă profilul forumului conține un link către o pagină dintr-o rețea socială

După cum puteți vedea, tabelul este simplu și puteți calcula singur multe lucruri folosind un calculator. Cu toate acestea, acesta este doar un exemplu și există doar 10 intrări. În bazele de date reale, înregistrările pot fi măsurate în mii. Deci, să începem cu interogările.

Grupare pură folosind gruparea după

Să ne imaginăm că trebuie să cunoaștem valoarea fiecărui grup, și anume ratingul mediu al utilizatorilor din grup și numărul total de mesaje rămase pe forum.

În primul rând, o scurtă descriere verbală pentru a facilita înțelegerea interogării SQL. Deci, trebuie să găsiți valorile calculate pe grupuri de forum. În consecință, trebuie să împărțiți toate aceste zece linii în trei grupuri diferite: admin, moder, user. Pentru a face acest lucru, trebuie să adăugați o grupare după valorile câmpului forum_group la sfârșitul solicitării. Și adăugați, de asemenea, expresii calculate pentru a le selecta folosind așa-numitele funcții de agregare.

Specificați câmpurile și coloanele calculate selectați forum_group, avg(raiting) ca avg_raiting, sum(mess_count) ca total_mess_count -- Specificați tabelul din userstat -- Specificați gruparea după grupul de câmpuri după forum_group

Vă rugăm să rețineți că, după ce ați folosit grupul prin construct într-o interogare, puteți utiliza numai acele câmpuri din selectare care au fost specificate după grup fără a utiliza funcții de agregare. Câmpurile rămase trebuie specificate în cadrul funcțiilor agregate.

Am folosit și două funcții agregate. AVG - calculează valoarea medie. Și SUM - calculează suma.

grup_forumavg_ratingtotal_mess_count
admin 4 50
moder 3 50
utilizator 3 150

1. În primul rând, toate rândurile tabelului sursă au fost împărțite în trei grupuri în funcție de valorile câmpului forum_group. De exemplu, au existat trei utilizatori în cadrul grupului de administrare. Există, de asemenea, 3 linii în interiorul moder. Și în interiorul grupului de utilizatori erau 4 linii (patru utilizatori).

2. Funcțiile agregate au fost apoi aplicate fiecărui grup. De exemplu, pentru grupul de administrare, evaluarea medie a fost calculată după cum urmează (2 + 5 + 5)/3 = 4. Numărul de mesaje a fost calculat ca (10 + 15 + 25) = 50.

După cum puteți vedea, nimic complicat. Cu toate acestea, am aplicat o singură condiție de grupare și nu am filtrat după grup. Deci, să trecem la următorul exemplu.

Gruparea folosind group by și filtrarea grupurilor cu having

Acum, să ne uităm la un exemplu mai complex de grupare a datelor. Să presupunem că trebuie să evaluăm eficacitatea acțiunilor de a atrage utilizatorii către activitățile sociale. Pentru a spune simplu, aflați câți utilizatori din grupuri au lăsat link-uri către profilurile lor și câte e-mailuri ignorate etc. Cu toate acestea, în viața reală pot exista multe astfel de grupuri, așa că trebuie să eliminăm acele grupuri care pot fi neglijate (de exemplu, prea puțini oameni nu au lăsat un link; de ce aglomerați raportul complet). În exemplul meu, acestea sunt grupuri cu un singur utilizator.

În primul rând, vom descrie verbal ce trebuie făcut în interogarea SQL. Trebuie să împărțim toate rândurile din tabelul original userstat în funcție de următoarele criterii: numele grupului și prezența unui profil social. În consecință, este necesar să grupați datele tabelului după câmpurile forum_group și is_have_social_profile. Cu toate acestea, nu ne interesează acele grupuri în care există o singură persoană. Prin urmare, astfel de grupuri trebuie filtrate.

Notă: Merită să știți că această problemă ar putea fi rezolvată prin gruparea după un singur câmp. Dacă utilizați constructul case. Totuși, în cadrul acestui exemplu, sunt prezentate posibilitățile de grupare.

De asemenea, aș dori să clarific un lucru imediat punct important. Puteți filtra numai folosind have atunci când utilizați funcții agregate, și nu după câmpuri individuale. Cu alte cuvinte, acesta nu este un construct unde, este un filtru pentru grupuri de rânduri, nu înregistrări individuale. Deși condițiile din interior sunt specificate într-un mod similar folosind „sau” și „și”.

Acesta este modul în care ar arăta interogarea SQL

Specificați câmpurile și coloanele calculate select forum_group, is_have_social_profile, count(*) as total -- Specificați tabelul din userstat -- Specificați gruparea după câmpuri group by forum_group, is_have_social_profile -- Specificați filtrul de grup având count(*) > 1

Vă rugăm să rețineți că câmpurile de după construcția grupare sunt separate prin virgulă. Specificarea câmpurilor în select are loc în același mod ca în exemplul anterior. Am folosit, de asemenea, funcția de numărare agregată, care calculează numărul de rânduri în grupuri.

Iată rezultatul:

grup_forumis_have_social_profiletotal
admin 1 2
moder 1 2
utilizator 0 3

Să aruncăm o privire pas cu pas la cum a ieșit acest rezultat.

1. Inițial s-au obținut 6 loturi. Fiecare dintre grupurile forum_group a fost împărțit în două subgrupuri pe baza valorilor câmpului is_have_social_profile. Cu alte cuvinte, grupuri: , , , , , .

Notă: Apropo, nu ar fi neapărat grupuri 6. Deci, de exemplu, dacă toți administratorii ar completa un profil, atunci ar fi 5 grupuri, deoarece câmpul is_have_social_profile ar avea o singură valoare pentru utilizatorii grupului de admin.

2. Apoi condiția de filtrare în a avea fost aplicată fiecărui grup. Prin urmare, au fost excluse următoarele grupuri: , , . Deoarece în cadrul fiecărui astfel de grup exista doar un rând al tabelului sursă.

3. După aceasta, s-au calculat datele necesare și s-a obținut rezultatul.

După cum puteți vedea, nu este nimic dificil de folosit.

Merită să știți că, în funcție de baza de date, capacitățile acestor constructe pot diferi. De exemplu, pot exista mai multe funcții agregate sau puteți specifica coloane calculate mai degrabă decât câmpuri individuale ca grupare. Aceste informații trebuie deja analizate în caietul de sarcini.

Acum, știți cum să grupați datele cu grup după, precum și cum să filtrați grupuri folosind have.


Am arătat cum puteți calcula masa unui anumit produs furnizat de furnizori. Să presupunem că acum doriți să calculați masa totală a fiecăruia dintre produsele furnizate în prezent de furnizori. Acest lucru se poate face cu ușurință cu o propoziție

SELECTARE PR, SUM(Cant.) FROM Supplies GROUP BY PR;

Rezultatul este prezentat în Fig. 2.3,a.

A)b)V)G)
ETC
9 0
11 150
12 30
15 370
1 370
3 250
5 170
6 220
8 150
7 200
2 0
4 100
13 190
14 70
16 250
17 50
10 220
PSETCPrețQ_vo
1 9 -0- -0-
3 9 -0- -0-
5 9 -0- -0-
1 11 1.50 50
5 11 -0- -0-
6 11 -0- -0-
8 11 1.00 100
1 12 3.00 10
3 12 2.50 20
6 12 -0- -0-
1 15 2.00 170
3 15 1.50 200
2 1 3.60 300
7 1 4.20 70
2 3 -0- -0-
7 3 4.00 250
. . .
ETC
1 370
2 0
3 250
4 100
5 170
6 220
7 200
8 150
9 0
10 220
11 150
12 30
13 190
14 70
15 370
16 250
17 50
ETC
9 0
11 150
12 30
15 70
1 370
3 250
5 70
6 140
8 150
7 200
2 0
4 100
13 190
14 70
16 250
17 50
10 220

Orez. 2.3. Ilustrații pentru expresia GROUP BY

Clauza GROUP BY face ca tabelul specificat în FROM să fie rearanjat în grupuri, fiecare dintre ele având aceeași valoare în coloana specificată în GROUP BY. În exemplul luat în considerare, rândurile tabelului de consumabile sunt grupate astfel încât un grup să conțină toate rândurile pentru un produs cu PR = 1, celălalt pentru un produs cu PR = 2 etc. (vezi Fig. 2.3.b). În continuare, clauza SELECT este aplicată fiecărui grup. Fiecare expresie din această frază trebuie să aibă un singur sens pentru grup, adică. poate fi fie valoarea coloanei specificată în GROUP BY, fie o expresie aritmetică care implică acea valoare, fie o constantă, fie una dintre funcțiile SQL care operează pe toate valorile coloanei din grup și le reduce valorile la sens unic(de exemplu, la suma).

Rețineți că clauza GROUP BY nu implică ORDER BY. Pentru a asigura ordonarea de către PR a rezultatului exemplului luat în considerare (Fig. 2.3,c), ar trebui să se facă o cerere

SELECTAȚI PR, SUMA(CANTITATE) FROM Supplies GROUP BY PR ORDER BY PR;

În cele din urmă, rețineți că rândurile unui tabel pot fi grupate după orice combinație a coloanelor sale. Da, la cerere

SELECTAȚI T, BL, NUMĂRARE(BL) DIN GRUPA COMANDĂ BY T, BL;

puteți afla codurile și numărul de porții de preparate comandate de oaspeții pensiunii (32 persoane) pentru fiecare dintre mesele din ziua următoare:

TBLCOUNT(BL)
1 3 18
1 6 14
1 19 17
1 21 15
...

Dacă o interogare folosește clauze WHERE și GROUP BY, rândurile care nu îndeplinesc clauza WHERE sunt excluse înainte ca gruparea să fie efectuată.

De exemplu, pentru fiecare produs, emite codul acestuia și volumul total de posibile livrări, ținând cont de incapacitatea temporară a furnizorului cu PS = 2:

SELECTARE PR, SUM(Cant.) FROM Consumabile WHERE PS 2 GROUP BY PR;

Rezultatul prezentat în Fig. 2.3d diferă de rezultatul (Fig. 2.3a) al unei cereri similare pentru toți furnizorii prin volumul livrărilor de produse cu codurile 15, 5 și 6.

Traduce o interogare SELECT într-un plan intern de execuție („plan de interogare”), care poate diferi chiar și pentru interogări identice din punct de vedere sintactic și dintr-un anumit SGBD.

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

  • SELECT definește o listă de coloane care trebuie returnate (atât existente, cât și calculate), numele acestora, restricții privind unicitatea rândurilor din setul returnat, restricții privind numărul de rânduri din setul returnat;
  • FROM specifică o expresie de tabel care definește setul de date subiacent pentru aplicarea operațiunilor definite în alte clauze de instrucțiuni;
  • WHERE specifică o restricție asupra rândurilor expresiei tabelului din clauza FROM;
  • GROUP BY combină serii care au aceeași proprietate folosind funcții de agregare
  • HAVING selectează dintre grupurile definite de parametrul GROUP BY
  • ORDER BY specifică criteriile de sortare a rândurilor; rândurile sortate sunt trecute la punctul de apel.

Structura declarației

Instrucțiunea SELECT are următoarea structură:

SELECTAȚI [ DISTINCT | DISTINCTROW | ALL ] select_expression ,... FROM table_references [ WHERE unde_definition ] [ GROUP BY ( unsigned_intger | col_name | formula ) ] [ HAVING where_definition ] [ ORDER BY ( unsigned_intger | col_name | formula ) [ ASC | DESC ], ...]

Opțiuni pentru operator

COMANDA PENTRU

ORDER BY - parametru operator opțional (opțional). SELECTAȚIși UNION , ceea ce înseamnă că operatorii SELECTAȚI, UNION returnează un set de rânduri sortate după valorile uneia sau mai multor coloane. Poate fi aplicat atât coloanelor numerice, cât și coloanelor de șir. În acest din urmă caz, sortarea va avea loc alfabetic.

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

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

  • Opțiunea ASC (implicit) stabilește ordinea de sortare în ordine crescătoare, de la valorile cele mai mici la cele mai mari.
  • Parametrul DESC setează ordinea de sortare în ordine descrescătoare, de la valorile mai mari la cele mai mici.

Exemple

SELECTAȚI * FROM T ;

C1 C2
1 A
2 b
C1 C2
1 A
2 b

SELECTAȚI C1 DIN T ;

C1
1
2
C1 C2
1 A
2 b
C1 C2
1 A
C1 C2
1 A
2 b
C1 C2
2 b
1 A

Pentru interogarea tabelului T

SELECTAȚI * FROM T ;

va returna toate coloanele din toate rândurile din tabelul dat. Pentru aceeași interogare de tabel

SELECTAȚI C1 DIN T ;

va returna valorile coloanei C1 ale tuturor rândurilor tabelului - în termeni de algebră relațională proiecție. Pentru aceeași interogare de tabel

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 algebrei relaționale putem spune că probă, deoarece cuvântul cheie WHERE este prezent. 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ă (Z-A) 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 totul din 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,...

Returnează o listă de ID-uri de departament care au avut vânzări mai mari de 1.000 USD la 1 ianuarie 2000, împreună cu sumele vânzărilor pentru ziua respectivă:

Limitarea rândurilor returnate

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

  • introducere funcțiile ferestreiîn instrucțiunea SELECT

Funcția fereastră ROW_NUMBER()

Sunt diverse funcțiile ferestrei. ROW_NUMBER() OVER poate fi folosit pentru limitare simplă numărul de rânduri returnate. De exemplu, pentru a returna nu mai mult de zece rânduri:

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

Funcția fereastră RANK()

Funcția RANK() OVER funcționează aproape la fel ca ROW_NUMBER, dar poate returna mai mult decât n linii în anumite condiţii. De exemplu, pentru a obține primii 10 cei mai tineri:

Acest cod poate returna mai mult de 10 linii. 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. Cu toate acestea, mulți au sintaxă non-standard pentru a rezolva aceleași probleme. Mai jos sunt opțiunile limitare simplă mostre pentru diferite SGBD:

Producător/DBMS Sintaxa constrângerii
DB2 (Acceptă standardul începând cu DB2 Versiunea 6)

Am analizat o mulțime de materiale despre SQL, în special Transact-SQL, dar nu am atins-o de fapt. subiect simplu Cum gruparea datelor GROUP BY. Așa că astăzi vom învăța cum să folosim grupul după operator pentru a grupa datele.

Mulți programatori începători, atunci când se confruntă cu SQL, nu știu despre o astfel de posibilitate precum gruparea datelor folosind operatorul GROUP BY, deși această caracteristică este necesară destul de des în practică, în acest sens, lecția noastră de astăzi, ca de obicei cu exemple, este dedicată tocmai pentru Ți-a fost mai simplu și mai ușor să înveți cum să folosești acest operator, deoarece cu siguranță îl vei întâlni. Dacă sunteți interesat de subiectul SQL, atunci, așa cum am spus mai devreme, am atins-o de mai multe ori, de exemplu, în articolele SQL Language - JOIN sau Union and union all, astfel încât să vă puteți familiariza cu acest material .

Și pentru introducere, puțină teorie.

Ce este operatorul GROUP BY

A SE GRUPA CU este operatorul ( sau design, oricare este mai convenabil pentru dvs) SQL pentru gruparea datelor după câmp atunci când utilizați funcții agregate, cum ar fi sumă, max, min, număr și altele într-o interogare.

După cum știți, funcțiile agregate funcționează cu un set de valori, de exemplu, suma însumează toate valorile. Dar să presupunem că trebuie să însumați după o anumită condiție sau după mai multe condiții simultan, de aceea avem nevoie ca gruparea după operator să grupeze toate datele pe câmpuri cu rezultatul rezultatelor funcțiilor agregate.

Mi se pare că va fi mai clar să analizăm toate acestea cu exemple, așa că să trecem la exemple.

Notă! Vom scrie toate exemplele în Management Studio SQL Server 2008.

Exemple de utilizare a operatorului GROUP BY

Și mai întâi, să creăm și să populam un tabel de testare cu date către care vom trimite interogările noastre selectate folosind gruparea după. Tabelul și datele sunt, desigur, fictive, pur de exemplu.

Creați un tabel

CREATE TABLE .( NULL, (50) NULL, NULL, NULL) ON GO

L-am completat cu următoarele informații:

  • Id – identificatorul de înregistrare;
  • Nume – numele de familie al angajatului;
  • Summa - numerar;
  • Premiu – semn Bani(să spunem 1-Salariu; 2-Bonus).

Gruparea datelor folosind grupul după interogare

Și la început, să ne uităm la sintaxă a se grupa cu, adică unde se scrie această construcție:

Sintaxă:

Selectați funcții agregate

Din sursă

Unde Conditii de selectie

A se grupa cu gruparea câmpurilor

Având Condiții pentru funcțiile agregate

Comandă până la sortarea câmpurilor

Acum, dacă trebuie să însumăm toate fondurile unui anumit angajat fără a folosi gruparea, vom trimite următoarea solicitare:

SELECTAȚI SUM(summa) ca summa FROM test_table WHERE nume="Ivanov"

Și dacă trebuie să însumăm un alt angajat, atunci pur și simplu schimbăm condiția. De acord, dacă sunt mulți astfel de angajați, de ce să-i rezumați pe fiecare, iar acest lucru cumva nu este clar, așa că grupul după operator ne vine în ajutor. Scriem o cerere:

SELECTAȚI SUM(summa) ca suma, nume FROM test_table GROUP BY nume

După cum ați observat, nu scriem nicio condiție și afișăm imediat toți angajații cu suma însumată a fondurilor, ceea ce este mai clar.

Notă! Voi observa imediat că, pe lângă funcțiile de agregare, scriem același număr de câmpuri în grupul după construct, în funcție de câte câmpuri scriem în cerere (adică gruparea câmpurilor). În exemplul nostru, afișăm un câmp, așa că în grupul după am specificat un singur câmp (nume); dacă am afișa mai multe câmpuri, atunci toate ar trebui să fie specificate în grupul după construcție (veți vedea acest lucru în următoarele exemple).

De asemenea, puteți utiliza alte funcții, de exemplu, numărați de câte ori au fost primite fonduri către un anumit angajat cu suma totală a fondurilor primite. Pentru a face acest lucru, pe lângă funcția de sumă, vom folosi și funcția de numărare.

SELECTAȚI SUM(summa) ca [Total fonduri], COUNT(*) ca [Număr de chitanțe], Nume [Angajat] FROM test_table GROUP BY nume

Dar să spunem că acest lucru nu este suficient pentru autorități, ele cer și ele să rezumați la fel, dar cu grupare după atribut, adică. ce fel de bani sunt acestia (salariu sau bonus), pentru asta pur si simplu adaugam inca un camp la grupare, iar pentru o mai buna intelegere vom adauga sortarea pe angajat, iar rezultatul va fi urmatorul:

SELECTAȚI SUM(summa) ca [Total fonduri], COUNT(*) ca [Număr de chitanțe], Nume [Angajat] , Premiul [Sursa] FROM test_table GROUP BY nume, priz ORDER BY nume

Acum totul este afișat, adică câți bani a primit angajatul, de câte ori și din ce sursă.

Acum, pentru a consolida, să scriem o interogare și mai complexă cu grupare, dar să adăugăm și numele acestei surse, deoarece veți fi de acord că, pe baza identificatorilor de atribut, nu este clar din ce sursă provin fondurile. Pentru aceasta folosim construcția caz.

SELECTAȚI SUM(summa) AS [Numerar total], COUNT(*) AS [Număr de chitanțe], Nume [Angajat], CASE WHEN priz = 1 apoi "Salariu" WHEN priz = 2 apoi "Bonus" ELSE "Fără sursă" END AS [Sursa] FROM test_table GROUP BY nume, priz ORDER BY nume

Acum totul este destul de clar și nu atât de dificil, chiar și pentru începători.

Să atingem, de asemenea, condițiile pentru rezultatele finale ale funcțiilor agregate ( având). Cu alte cuvinte, adăugăm o condiție nu pentru selectarea rândurilor în sine, ci pentru valoarea finală a funcțiilor, în cazul nostru este suma sau numărul. De exemplu, trebuie să afișăm același lucru, dar numai pe cei cu "fonduri totale" mai mult de 200. Pentru a face acest lucru, adăugați condiția având:

SELECTAȚI SUMA(summa) ca [Numerar total], CONTARE(*) ca [Număr de chitanțe], Nume [Angajat], CAZ CÂND priz = 1 apoi "Salariu" WHEN priz = 2 apoi "Bonus" ELSE "Fără sursă" END AS [Sursa] FROM test_table GROUP BY nume, priz --group HAVING SUM(summa) > 200 --select ORDER BY nume --sort

Acum am afișat toate valorile sum(summa) care sunt mai mari de 200, totul este simplu.

Sper că după lecția de astăzi ți-a devenit clar cum și de ce să folosești designul a se grupa cu. Noroc! Vom continua să studiem SQL în articolele următoare.

Traduce o interogare SELECT într-un plan intern de execuție („plan de interogare”), care poate diferi chiar și pentru interogări identice din punct de vedere sintactic și dintr-un anumit SGBD.

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

  • SELECT definește o listă de coloane care trebuie returnate (atât existente, cât și calculate), numele acestora, restricții privind unicitatea rândurilor din setul returnat, restricții privind numărul de rânduri din setul returnat;
  • FROM specifică o expresie de tabel care definește setul de date subiacent pentru aplicarea operațiunilor definite în alte clauze de instrucțiuni;
  • WHERE specifică o restricție asupra rândurilor expresiei tabelului din clauza FROM;
  • GROUP BY combină serii care au aceeași proprietate folosind funcții de agregare
  • HAVING selectează dintre grupurile definite de parametrul GROUP BY
  • ORDER BY specifică criteriile de sortare a rândurilor; rândurile sortate sunt trecute la punctul de apel.

Structura declarației[ | ]

Instrucțiunea SELECT are următoarea structură:

SELECTAȚI [ DISTINCT | DISTINCTROW | ALL ] select_expression ,... FROM table_references [ WHERE unde_definition ] [ GROUP BY ( unsigned_intger | col_name | formula ) ] [ HAVING where_definition ] [ ORDER BY ( unsigned_intger | col_name | formula ) [ ASC | DESC ], ...]

Opțiuni pentru operator[ | ]

Folosit pentru a determina ce rânduri trebuie selectate sau incluse în GROUP BY.

A SE GRUPA CU [ | ]

GROUP BY - parametru operator opțional SELECTAȚI, pentru a grupa rândurile în funcție de rezultatele funcțiilor agregate (MAX, SUM, AVG, ...).

AVÂND [ | ]

HAVING - parametru operator opțional (opțional). SELECTAȚI pentru a indica condiții privind rezultatul funcțiilor agregate (MAX, SUM, AVG, ...).

AVÂND<условия>similar cu UNDE<условия>cu excepția faptului că rândurile nu sunt selectate după valorile coloanei, ci sunt construite din valorile coloanei specificate în GROUP BY și valorile funcției agregate calculate pentru fiecare grup format din GROUP BY.

SELECTare necesită ca numai coloanele enumerate în GROUP BY și/sau valorile agregate să fie specificate în fluxul de ieșire. O greșeală comună este specificarea unei coloane în SELECT care lipsește în GROUP BY.

Dacă parametrul GROUP BY nu este specificat în SELECT, HAVING este aplicat „grupului” tuturor rândurilor din tabel, în duplicare completă (nu este permis în toate implementările standardului SQL).

COMANDA PENTRU [ | ]

ORDER BY - parametru operator opțional (opțional). SELECTAȚIși UNION , ceea ce înseamnă că operatorii SELECTAȚI, UNION returnează un set de rânduri sortate după valorile uneia sau mai multor coloane. Poate fi aplicat atât coloanelor numerice, cât și coloanelor de șir. În acest din urmă caz, sortarea va avea loc alfabetic.

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

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

  • Opțiunea ASC (implicit) stabilește ordinea de sortare în ordine crescătoare, de la valorile cele mai mici la cele mai mari.
  • Parametrul DESC setează ordinea de sortare în ordine descrescătoare, de la valorile mai mari la cele mai mici.

Exemple [ | ]

SELECTAȚI * FROM T ;

C1 C2
1 A
2 b
C1 C2
1 A
2 b

SELECTAȚI C1 DIN T ;

C1
1
2
C1 C2
1 A
2 b
C1 C2
1 A
C1 C2
1 A
2 b
C1 C2
2 b
1 A

Pentru interogarea tabelului T

SELECTAȚI * FROM T ;

va returna toate coloanele din toate rândurile din tabelul dat. Pentru aceeași interogare de tabel

SELECTAȚI C1 DIN T ;

va returna valorile coloanei C1 ale tuturor rândurilor tabelului - în termeni de algebră relațională proiecție. Pentru aceeași interogare de tabel

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 algebrei relaționale putem spune că probă, deoarece cuvântul cheie WHERE este prezent. 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ă (Z-A) 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 totul din 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,...

Returnează o listă de ID-uri de departament care au avut vânzări mai mari de 1.000 USD la 1 ianuarie 2000, împreună cu sumele vânzărilor pentru ziua respectivă:

Limitarea rândurilor returnate[ | ]

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

Funcția fereastră ROW_NUMBER()[ | ]

Sunt diverse funcțiile ferestrei. ROW_NUMBER() OVER poate fi folosit pentru limitare simplă numărul de rânduri returnate. De exemplu, pentru a returna nu mai mult de zece rânduri:

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

Funcția fereastră RANK()[ | ]

Funcția RANK() OVER funcționează aproape la fel ca ROW_NUMBER, dar poate returna mai mult decât n linii în anumite condiţii. De exemplu, pentru a obține primii 10 cei mai tineri:

Acest cod poate returna mai mult de 10 linii. 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. Cu toate acestea, mulți au sintaxă non-standard pentru a rezolva aceleași probleme. Mai jos sunt opțiunile limitare simplă mostre pentru diferite SGBD:

Producător/DBMS Sintaxa constrângerii
DB2 (Acceptă standardul începând cu DB2 Versiunea 6)

SELECTAȚI * DIN [ T ] ADUCE NUMAI PRIMELE 10 RÂNDURI