Viskas, ką reikia žinoti apie SQL GROUP BY pareiškimą

Viskas, ką reikia žinoti apie SQL GROUP BY pareiškimą

Didelė dalis santykių duomenų bazių galios gaunama filtruojant duomenis ir sujungiant lenteles. Štai kodėl mes pirmiausia atstovaujame tiems santykiams. Tačiau šiuolaikinės duomenų bazių sistemos suteikia dar vieną vertingą metodą: grupavimą.





Grupavimas leidžia iš duomenų bazės išgauti suvestinę informaciją. Tai leidžia derinti rezultatus, kad būtų sukurti naudingi statistiniai duomenys. Grupavimas taupo jus nuo kodo rašymo įprastiems atvejams, pvz., Skaičių vidurkių skaičiavimui. Ir tai gali sukurti efektyvesnes sistemas.





Ką daro išlyga GROUP BY?

GROUP BY, kaip rodo pavadinimas, grupuoja rezultatus į mažesnį rinkinį. Rezultatus sudaro viena eilutė kiekvienai atskirai grupuoto stulpelio vertei. Mes galime parodyti jo naudojimą, žiūrėdami į kai kuriuos pavyzdinius duomenis su eilutėmis, turinčiomis kai kurias bendras vertybes.





Ar galite atsisiųsti filmus iš hulu

Toliau pateikiama labai paprasta duomenų bazė su dviem lentelėmis, atspindinčiomis įrašų albumus. Galite sukurti tokią duomenų bazę parašyti pagrindinę schemą jūsų pasirinktai duomenų bazių sistemai. The albumai lentelėje yra devynios eilutės su pirminiu raktu id vardo, atlikėjo, išleidimo metų ir pardavimo stulpeliai ir stulpeliai:

+----+---------------------------+-----------+--------------+-------+
| 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 menininkų lentelė dar paprastesnė. Jame yra septynios eilutės su ID ir pavadinimo stulpeliais:



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

Galite suprasti įvairius „GROUP BY“ aspektus naudodami tokį paprastą duomenų rinkinį. Žinoma, realaus gyvenimo duomenų rinkinyje būtų daug daug daugiau eilučių, tačiau principai išlieka tie patys.

Grupavimas pagal vieną stulpelį

Tarkime, norime sužinoti, kiek albumų turime kiekvienam atlikėjui. Pradėkite nuo tipiško PASIRINKTI užklausą, kaip gauti stulpelį „artist_id“:





SELECT artist_id FROM albums

Tai grąžina visas devynias eilutes, kaip tikėtasi:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
+-----------+

Norėdami sugrupuoti šiuos rezultatus pagal atlikėją, pridėkite frazę GROUP BY artist_id :





SELECT artist_id FROM albums GROUP BY artist_id

Kuris duoda tokius rezultatus:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+-----------+

Rezultatų rinkinyje yra septynios eilutės, sumažintos nuo devynių albumai lentelę. Kiekvienas unikalus artist_id turi vieną eilutę. Galiausiai, norėdami gauti faktinį skaičių, pridėkite COUNT (*) į pasirinktus stulpelius:

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 |
+-----------+----------+

Rezultatai sugrupuoja dvi poras eilučių menininkams su ID 2 ir 6 . Kiekvienas iš jų turi du albumus mūsų duomenų bazėje.

Susijęs: Esminiai SQL komandų kodų lapai pradedantiesiems

Kaip pasiekti sugrupuotus duomenis naudojant agreguotą funkciją

Galbūt naudojote COUNT funkcija anksčiau, ypač COUNT (*) formą, kaip parodyta aukščiau. Jis nuskaito rinkinio rezultatų skaičių. Galite jį naudoti norėdami gauti bendrą lentelės įrašų skaičių:

SELECT COUNT(*) FROM albums
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+

COUNT yra kaupimo funkcija. Šis terminas reiškia funkcijas, kurios verčia vertes iš kelių eilučių į vieną vertę. Jie dažnai naudojami kartu su teiginiu GROUP BY.

Užuot tik skaičiavę eilučių skaičių, sugrupuotoms vertėms galime taikyti agregavimo funkciją:

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 |
+-----------+------------+

Visi aukščiau parodyti 2 ir 6 atlikėjų pardavimai yra jų kelių albumų pardavimai kartu:

SELECT artist_id, sales
FROM albums
WHERE artist_id IN (2, 6)
+-----------+-------+
| artist_id | sales |
+-----------+-------+
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+-----------+-------+

Grupavimas pagal kelis stulpelius

Galite grupuoti pagal daugiau nei vieną stulpelį. Tiesiog įtraukite kelis stulpelius ar išraiškas, atskirtus kableliais. Rezultatai bus sugrupuoti pagal šių stulpelių derinį.

SELECT release_year, sales, count(*)
FROM albums
GROUP BY release_year, sales

Paprastai tai duos daugiau rezultatų nei grupavimas pagal vieną stulpelį:

+--------------+-------+----------+
| 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 |
+--------------+-------+----------+

Atminkite, kad mūsų mažame pavyzdyje tik du albumai turi tuos pačius išleidimo metus ir pardavimo skaičių (1977 m. - 28).

Naudingos agregato funkcijos

Be COUNT, su GROUP gerai veikia kelios funkcijos. Kiekviena funkcija grąžina vertę, pagrįstą kiekvienos rezultatų grupės įrašais.

  • COUNT () grąžina bendrą atitinkančių įrašų skaičių.
  • SUM () grąžina visų nurodyto stulpelio verčių sumą.
  • MIN () grąžina mažiausią vertę tam tikrame stulpelyje.
  • MAX () grąžina didžiausią reikšmę tam tikrame stulpelyje.
  • AVG () grąžina vidutinį vidurkį. Tai atitinka SUM () / COUNT ().

Taip pat galite naudoti šias funkcijas be GROUP sąlygos:

Kaip nemokamai rašyti tekstą iš kompiuterio į mobilųjį telefoną
SELECT AVG(sales) FROM albums
+------------+
| AVG(sales) |
+------------+
| 19.1111 |
+------------+

GROUP BY naudojimas su WHERE sąlyga

Kaip ir naudojant įprastą SELECT, vis tiek galite naudoti WHERE filtruoti rezultatų rinkinį:

SELECT artist_id, COUNT(*)
FROM albums
WHERE release_year > 1990
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 4 | 1 |
| 6 | 2 |
+-----------+----------+

Dabar turite tik tuos albumus, išleistus po 1990 m., Sugrupuotus pagal atlikėjus. Taip pat galite naudoti sujungimą su sąlyga WHERE, nepriklausomai nuo 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 |
+---------+--------+

Tačiau atminkite, kad jei bandysite filtruoti pagal suvestinį stulpelį:

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

Gausite klaidą:

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

Stulpeliai, pagrįsti suvestiniais duomenimis, nėra prieinami sąlygai WHERE.

Naudojant sąlygą HAVING

Taigi, kaip filtruoti rezultatų rinkinį po grupavimo? The Turėdamas punktas sprendžia šį poreikį:

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

Atminkite, kad sąlyga HAVING atsiranda po GROUP BY. Priešingu atveju tai iš esmės yra paprastas WHERE pakeitimas HAVING. Rezultatai yra tokie:

+------------+--------+
| name | albums |
+------------+--------+
| Pink Floyd | 2 |
| Adele | 2 |
+------------+--------+

Jūs vis dar galite naudoti WHERE sąlygą, kad filtruotumėte rezultatus prieš grupavimą. Jis veiks kartu su HAVING sąlyga filtruoti po grupavimo:

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;

Tik vienas atlikėjas mūsų duomenų bazėje po 1990 m. Išleido daugiau nei vieną albumą:

+-------+--------+
| name | albums |
+-------+--------+
| Adele | 2 |
+-------+--------+

Rezultatų derinimas su GROUP BY

„GROUP BY“ teiginys yra neįtikėtinai naudinga SQL kalbos dalis. Jis gali pateikti, pavyzdžiui, turinio puslapio duomenų suvestinę informaciją. Tai puiki alternatyva dideliam duomenų kiekiui gauti. Duomenų bazė puikiai susidoroja su šiuo papildomu darbo krūviu, nes dėl savo dizaino ji yra optimali darbui.

Kai suprasite grupavimą ir tai, kaip sujungti kelias lenteles, galėsite išnaudoti didžiąją dalį santykių duomenų bazės galios.

Dalintis Dalintis „Tweet“ Paštu Kaip užklausti kelias duomenų bazių lenteles vienu metu naudojant SQL jungtis

Sužinokite, kaip naudoti SQL jungtis, siekiant supaprastinti užklausas, sutaupyti laiko ir jaustis kaip SQL galios vartotojas.

kaip išjungti „MacBook Pro 2020“
Skaityti toliau Susijusios temos
  • Programavimas
  • SQL
Apie autorių Bobis Džekas(Paskelbti 58 straipsniai)

Bobby yra technologijų entuziastas, kuris beveik du dešimtmečius dirbo programinės įrangos kūrėju. Jis aistringai žaidžia, dirba „Switch Player Magazine“ apžvalgų redaktoriumi ir yra pasinėręs į visus internetinės publikacijos ir žiniatinklio kūrimo aspektus.

Daugiau iš Bobby Jack

Prenumeruokite mūsų naujienlaiškį

Prisijunkite prie mūsų naujienlaiškio, kad gautumėte techninių patarimų, apžvalgų, nemokamų el. Knygų ir išskirtinių pasiūlymų!

Norėdami užsiprenumeruoti, spustelėkite čia