Tot ce trebuie să știți despre declarația SQL GROUP BY

Tot ce trebuie să știți despre declarația SQL GROUP BY

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 acestuia uitându-ne la câteva exemple de date cu rânduri care împărtășesc unele valori comune.





computerul Windows 10 nu se va porni

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. The albume tabelul are nouă rânduri cu o cheie principală id coloană și coloane pentru nume, artist, anul lansării și vânzări:

+----+---------------------------+-----------+--------------+-------+
| id | name | artist_id | release_year | sales |
+----+---------------------------+-----------+--------------+-------+
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | The Dark Side of the Moon | 2 | 1973 | 24 |
| 3 | Rumours | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Animals | 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 |
+----+---------------------------+-----------+--------------+-------+

The artiști tabelul este chiar mai simplu. Are șapte rânduri cu coloane id și nume:



+----+---------------+
| id | name |
+----+---------------+
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Meat Loaf |
+----+---------------+

Puteți înțelege diferite 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 rânduri mai multe, 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:





SELECT artist_id FROM albums

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 :





SELECT artist_id FROM albums 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(*)
FROM albums
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ție î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:

SELECT COUNT(*) FROM albums
+----------+
| 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(sales)
FROM albums
GROUP BY artist_id
+-----------+------------+
| artist_id | SUM(sales) |
+-----------+------------+
| 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, sales
FROM albums
WHERE artist_id IN (2, 6)
+-----------+-------+
| artist_id | sales |
+-----------+-------+
| 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(*)
FROM albums
GROUP BY release_year, sales

Acest lucru va produce de obicei mai multe rezultate decât gruparea pe o singură coloană:

+--------------+-------+----------+
| release_year | sales | 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:

cum se face iso de Windows 10
SELECT AVG(sales) FROM albums
+------------+
| AVG(sales) |
+------------+
| 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(*)
FROM albums
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:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
+---------+--------+
| name | albums |
+---------+--------+
| Nirvana | 1 |
| Adele | 2 |
+---------+--------+

Rețineți, totuși, că dacă încercați să filtrați pe baza unei coloane agregate:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND albums > 2
GROUP BY artist_id;

Veți primi o eroare:

ERROR 1054 (42S22): Unknown column 'albums' in 'where clause'

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? The AVÂND clauza se ocupă de această nevoie:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
GROUP BY artist_id
HAVING albums > 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:

+------------+--------+
| name | albums |
+------------+--------+
| 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:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
HAVING albums > 1;

Numai un artist din baza noastră de date a lansat mai mult de un album după 1990:

+-------+--------+
| name | albums |
+-------+--------+
| 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 folosi cea mai mare parte a puterii unei baze de date relaționale.

Acțiune Acțiune Tweet E-mail Cum să interogați mai multe tabele de baze de date simultan cu SQL Joins

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.

afla ce placa de baza am
Citiți în continuare Subiecte asemănătoare
  • Programare
  • SQL
Despre autor Bobby Jack(58 articole publicate)

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.

Mai multe de la Bobby Jack

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Faceți clic aici pentru a vă abona