O mare parte din puterea bazelor de date relaționale provine din filtrarea datelor și alăturarea tabelelor. Acesta este motivul pentru care reprezentăm aceste relații în primul rând. Dar sistemele moderne de baze de date oferă o altă tehnică valoroasă: gruparea.
Gruparea vă permite să extrageți informații rezumative dintr-o bază de date. Vă permite să combinați rezultatele pentru a crea date statistice utile. Gruparea vă scutește de scrierea codului pentru cazuri obișnuite, cum ar fi medierea listelor de cifre. Și poate crea sisteme mai eficiente.
Ce face clauza GROUP BY?
GROUP BY, după cum sugerează și numele, grupează rezultatele într-un set mai mic. Rezultatele constau dintr-un rând pentru fiecare valoare distinctă a coloanei grupate. Putem arăta utilizarea acesteia examinând câteva exemple de date cu rânduri care împărtășesc unele valori comune.
Următoarea este o bază de date foarte simplă cu două tabele reprezentând albume de înregistrări. Puteți configura o astfel de bază de date prin
scriind o schemă de bază pentru sistemul de baze de date ales. albume tabelul are nouă rânduri cu o cheie primară id coloană și coloane pentru nume, artist, anul lansării și vânzări:++++++
| id | nume | artist_id | eliberare_an | vânzări |
++++++
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | Latura întunecată a lunii | 2 | 1973 | 24 |
| 3 | Zvonuri | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Animale | 2 | 1977 | 6 |
| 6 | Goodbye Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Bat Out of Hell | 7 | 1977 | 28 |
++++++
artiști tabelul este chiar mai simplu. Are șapte rânduri cu coloane id și nume:
+++
| id | nume |
+++
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Pâine de carne |
+++
Puteți înțelege diverse aspecte ale GROUP BY doar cu un set de date simplu, cum ar fi acesta. Desigur, un set de date din viața reală ar avea multe, multe mai multe rânduri, dar principiile rămân aceleași.
Gruparea după o singură coloană
Să presupunem că vrem să aflăm câte albume avem pentru fiecare artist. Începeți cu un tipic SELECTAȚI interogare pentru preluarea coloanei artist_id:
SELECTează artist_id DIN albume
Aceasta returnează toate cele nouă rânduri, așa cum era de așteptat:
++
| artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
++
Pentru a grupa aceste rezultate după artist, adăugați fraza GROUP BY artist_id:
SELECTA artist_id DIN albume GROUP BY artist_id
Care oferă următoarele rezultate:
++
| artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
++
Există șapte rânduri în setul de rezultate, redus din totalul de nouă din albume masa. Fiecare unic artist_id are un singur rând. În cele din urmă, pentru a obține numărul real, adăugați NUMARA(*) la coloanele selectate:
SELECT artist_id, COUNT (*)
DIN albume
GROUP BY artist_id
+++
| artist_id | COUNT (*) |
+++
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+++
Rezultatele grupează două perechi de rânduri pentru artiștii cu id-uri 2 și 6. Fiecare are două albume în baza noastră de date.
Legate de: Foaia de trucuri pentru comenzile SQL esențiale pentru începători
Cum se accesează datele grupate cu o funcție agregată
Este posibil să fi folosit NUMARA funcționează înainte, în special în NUMARA(*) forma așa cum se vede mai sus. Obține numărul de rezultate dintr-un set. Îl puteți utiliza pentru a obține numărul total de înregistrări dintr-un tabel:
SELECTAȚI COUNT (*) DIN albume
++
| COUNT (*) |
++
| 9 |
++
COUNT este o funcție agregată. Acest termen se referă la funcții care traduc valorile din mai multe rânduri într-o singură valoare. Ele sunt adesea utilizate împreună cu declarația GROUP BY.
În loc să numărăm doar numărul de rânduri, putem aplica o funcție agregată valorilor grupate:
SELECT artist_id, SUM (vânzări)
DIN albume
GROUP BY artist_id
+++
| artist_id | SUMĂ (vânzări) |
+++
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+++
Vânzările totale afișate mai sus pentru artiștii 2 și 6 reprezintă vânzările lor multiple de albume combinate:
SELECT artist_id, vânzări
DIN albume
UNDE artist_id ÎN (2, 6)
+++
| artist_id | vânzări |
+++
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+++
Gruparea după mai multe coloane
Puteți grupa după mai multe coloane. Doar includeți mai multe coloane sau expresii, separate prin virgule. Rezultatele se vor grupa în funcție de combinația acestor coloane.
SELECT release_year, sales, count (*)
DIN albume
GROUP BY release_year, vânzări
Acest lucru va produce de obicei mai multe rezultate decât gruparea pe o singură coloană:
++++
| eliberare_an | vânzări | count (*) |
++++
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
++++
Rețineți că, în micul nostru exemplu, doar două albume au același an de lansare și numărul vânzărilor (28 în 1977).
Funcții agregate utile
În afară de COUNT, mai multe funcții funcționează bine cu GROUP. Fiecare funcție returnează o valoare bazată pe înregistrările aparținând fiecărui grup de rezultate.
- COUNT () returnează numărul total de înregistrări potrivite.
- SUM () returnează totalul tuturor valorilor din coloana dată adăugate.
- MIN () returnează cea mai mică valoare dintr-o coloană dată.
- MAX () returnează cea mai mare valoare dintr-o coloană dată.
- AVG () returnează media medie. Este echivalentul SUM () / COUNT ().
De asemenea, puteți utiliza aceste funcții fără o clauză GROUP:
Selectați AVG (vânzări) DIN albume
++
| AVG (vânzări) |
++
| 19.1111 |
++
Utilizarea GROUP BY Cu o clauză WHERE
La fel ca în cazul unui SELECT normal, puteți utiliza în continuare WHERE pentru a filtra setul de rezultate:
SELECT artist_id, COUNT (*)
DIN albume
WHERE release_year> 1990
GROUP BY artist_id
+++
| artist_id | COUNT (*) |
+++
| 4 | 1 |
| 6 | 2 |
+++
Acum aveți doar acele albume lansate după 1990, grupate după artist. Puteți utiliza, de asemenea, un join cu clauza WHERE, independent de GROUP BY:
SELECTAți r.name, COUNT (*) AS albume
DIN albume l, artiști r
UNDE artist_id = r.id
AND release_year> 1990
GROUP BY artist_id
+++
| nume | albume |
+++
| Nirvana | 1 |
| Adele | 2 |
+++
Rețineți, totuși, că dacă încercați să filtrați pe baza unei coloane agregate:
SELECTAți r.name, COUNT (*) AS albume
DIN albume l, artiști r
UNDE artist_id = r.id
ȘI albume> 2
GROUP BY artist_id;
Veți primi o eroare:
EROARE 1054 (42S22): coloană necunoscută „albume” în „unde clauză”
Coloanele bazate pe date agregate nu sunt disponibile pentru clauza WHERE.
Folosirea clauzei HAVING
Deci, cum filtrați setul de rezultate după ce a avut loc o grupare? AVÂND clauza se ocupă de această nevoie:
SELECTAți r.name, COUNT (*) AS albume
DIN albume l, artiști r
UNDE artist_id = r.id
GROUP BY artist_id
AVAND albume> 1;
Rețineți că clauza HAVING vine după GROUP BY. În caz contrar, este în esență o simplă înlocuire a WHERE cu HAVING. Rezultatele sunt:
+++
| nume | albume |
+++
| Pink Floyd | 2 |
| Adele | 2 |
+++
Puteți utiliza în continuare o condiție WHERE pentru a filtra rezultatele înainte de grupare. Va funcționa împreună cu o clauză HAVING pentru filtrare după grupare:
SELECTAți r.name, COUNT (*) AS albume
DIN albume l, artiști r
UNDE artist_id = r.id
AND release_year> 1990
GROUP BY artist_id
AVAND albume> 1;
Numai un artist din baza noastră de date a lansat mai mult de un album după 1990:
+++
| nume | albume |
+++
| Adele | 2 |
+++
Combinarea rezultatelor cu GROUP BY
Instrucțiunea GROUP BY este o parte incredibil de utilă a limbajului SQL. Poate furniza informații de sinteză a datelor, de exemplu, pentru o pagină de conținut. Este o alternativă excelentă la preluarea unor cantități mari de date. Baza de date gestionează bine acest volum de lucru suplimentar, deoarece designul său îl face optim pentru sarcină.
După ce ați înțeles gruparea și cum să vă alăturați mai multor tabele, veți putea utiliza cea mai mare parte a puterii unei baze de date relaționale.
Aflați cum să utilizați îmbinările SQL pentru a simplifica interogările, pentru a economisi timp și pentru a vă face să vă simțiți ca un utilizator SQL puternic.
- Programare
- SQL
Bobby este un pasionat de tehnologie care a lucrat ca dezvoltator de software timp de aproape două decenii. Este pasionat de jocuri, lucrează ca editor de recenzii la Switch Player Magazine și este cufundat în toate aspectele publicării online și dezvoltării web.
Aboneaza-te la newsletter-ul nostru
Alăturați-vă newsletterului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!
Încă un pas…!
Vă rugăm să confirmați adresa de e-mail în e-mailul pe care tocmai vi l-am trimis.