MySQL Agregacijske funkcije: SUM, COUNT, AVG & MAX

⚡ Pametni sažetak

Agregatne funkcije u MySQL izvršiti izračun u više redaka jednog stupca i vratiti jednu sažetu vrijednost. Pet ISO standardnih funkcija - COUNT, SUM, AVG, MIN i MAX — pokreću gotovo svako izvješće koje baza podataka generira.

  • 🔢 Ponašanje COUNT-a: COUNT(stupac) zanemaruje NULL vrijednosti, dok COUNT(*) broji svaki red u tablici, uključujući duplikate i NULL vrijednosti.
  • ???? DISTINCT ključna riječ: DISTINCT uklanja duplicirane vrijednosti prije pokretanja izračuna; ALL je zadana vrijednost i zadržava ih.
  • 📉 MIN i MAX: MIN vraća najmanju vrijednost u stupcu, a MAX vraća najveću, i to za numeričke, string i datumske tipove.
  • SUM i AVG: Oba rade samo s numeričkim stupcima i oba isključuju NULL retke iz vraćenog rezultata.
  • 📊 GRUPIRAJ PO Sparivanju: Dodavanjem naredbe GROUP BY jedna sažeta slika pretvara se u jedan sažetni redak po grupi.
  • ⚠️ NULL zamka: AVG dijeli samo s brojem redaka koji nisu NULL, pa nedostajuće vrijednosti tiho povećavaju prosjek.

Što su agregacijske funkcije u MySQL?

An agregatna funkcija čita više redaka jednog stupca i sažima ih u jednu vrijednost. Agregatne funkcije su:

  • Izvršavanje izračuna na više redaka
  • Od jednog stupca tablice
  • I vraćanje jedne vrijednosti.

ISO standard definira pet (5) agregatnih funkcija, i to:

  1. TOČKA
  2. IZNOS
  3. AVG
  4. MIN
  5. MAX

Jedno pravilo vrijedi za svih pet: Agregatne funkcije ignoriraju NULL vrijednosti. COUNT(*) je jedina iznimka, a u nastavku ćemo pogledati zašto.

Zašto koristiti agregatne funkcije

Različite razine organizacije imaju različite zahtjeve za informacijama. Menadžeri na najvišoj razini obično su zainteresirani za cijele brojke, a ne za pojedinačne detalje.

Skupne funkcije omogućuju nam jednostavnu izradu sažetih podataka iz naše baze podataka.

Na primjer, iz naše myflix baze podataka, uprava može zahtijevati sljedeća izvješća:

  • Najmanje iznajmljivani filmovi.
  • Većina iznajmljivanih filmova.
  • Prosječan broj iznajmljivanja svakog filma u mjesecu.

Sva gore navedena izvješća dolaze iz agregatnih funkcija. Pogledajmo svaku od njih detaljnije.

COUNT funkcija

Funkcija COUNT vraća ukupan broj vrijednosti u navedenom polju, i za numeričke i za nenumeričke tipove podataka. Kao i svaka agregacijska funkcija, COUNT(stupac) isključuje NULL vrijednosti.

COUNT(*) je poseban oblik koji vraća broj svih redaka u tablici. Također broji NULL-ovi i duplikate, jer broji retke, a ne vrijednosti.

Tablica movietrenals sadrži ove podatke:

referentni_ broj Datum transakcije Datum povratka članski broj film_id film_ se vratio
11 20-06-2012 NULL 1 1 0
12 22-06-2012 25-06-2012 1 2 0
13 22-06-2012 25-06-2012 3 2 0
14 21-06-2012 24-06-2012 2 2 0
15 23-06-2012 NULL 3 3 0

Pretpostavimo da želimo dobiti koliko je puta film s ID-jem 2 bio iznajmljen.

SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;

Izvršavanje ovoga u MySQL Radna tezga u odnosu na myflixdb vraća 3, jer tri reda nose movie_id 2.

BROJ(`movie_id`)
3

DISTINCT Ključna riječ

COUNT odgovara na „koliko“. Sljedeće pitanje je obično „koliko drukčiji one”, i za to služi DISTINCT.

DISTINCT Ključna riječ

Ključna riječ DISTINCT izostavlja duplikate iz naših rezultata po grupamaping identične vrijednosti zajedno, točno kao što gornja ilustracija sugerira.

Prvo, izvršimo jednostavan upit.

SELECT `movie_id` FROM `movierentals`;
film_id
1
2
2
2
3

Sada isti upit s ključnom riječi DISTINCT:

SELECT DISTINCT `movie_id` FROM `movierentals`;

DISTINCT izostavlja duplicirane zapise:

film_id
1
2
3

COUNT vs. COUNT(*) vs. COUNT(DISTINCT): Koji biste trebali koristiti?

DISTINCT se također može postaviti u agregatna funkcija, i tu većina početnika gubi track od kojih se redova zapravo broji. Četiri obrasca u nastavku sva se pokreću prema istoj tablici movietrenals s pet redaka prikazanoj ranije, no ne vraćaju svi isti broj. Razlika se svodi na dva pitanja: broji li obrazac retke ili vrijednosti i čuva li duplikate?

Oblik Što se računa Rezultat na najmu filmova
RAČUNATI(*) Svaki redak, uključujući duplikate i retke koji su u potpunosti NULL 5
BROJ(`movie_id`) Svaka vrijednost u stupcu koja nije NULL, uključujući duplikate 5
COUNT(`datum_povratka`) Samo vrijednosti koje nisu NULL — dva NULL datuma povrata se preskaču 3
BROJ(RAZLIČITI `id_filma`) Samo jedinstvene vrijednosti koje nisu NULL 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡 Savjet: Koristite COUNT(*) za brojanje redaka, COUNT(stupac) kada NULL treba značiti „ne primjenjuje se“ i COUNT(DISTINCT stupac) za jedinstvene vrijednosti. Suprotno od DISTINCT je ALL - zadano i stoga se rijetko piše.

MIN funkcija

Funkcija MIN vraća najmanju vrijednost u navedenom polju tablice.

Pretpostavimo da želimo godinu u kojoj je izašao najstariji film u našoj biblioteci. MySQLTo nam daje funkcija MIN od .

SELECT MIN(`year_released`) FROM `movies`;

Rezultat:

MIN(`godina_izdanja`)
2005

MAX funkcija

Kao što naziv sugerira, funkcija MAX suprotna je funkciji MIN. To vraća najveću vrijednost iz navedenog polja tablice.

Pretpostavimo da želimo godinu u kojoj je izašao najnoviji film u našoj bazi podataka. Sljedeći primjer je vraća.

SELECT MAX(`year_released`) FROM `movies`;

Rezultat:

MAX(`godina_izdanja`)
2012

SUM funkcija

MIN i MAX odabiru postojeću vrijednost iz stupca. SUM i AVG izračunajte novi broj iz cijelog stupca.

Pretpostavimo da želimo ukupan iznos do sada izvršenih plaćanja. MySQL IZNOS funkcija vraća zbroj svih vrijednosti u navedenom stupcu. SUM radi samo na numeričkim poljimai NULL vrijednosti su isključene iz rezultata.

Sljedeća tablica prikazuje podatke u tablici plaćanja.

plaćanje_ id članski broj Datum plačanja opis uplaćeni iznos vanjski_ referentni _broj
1 1 23-07-2012 Plaćanje najma filma 2500 11
2 1 25-07-2012 Plaćanje najma filma 2000 12
3 3 30-07-2012 Plaćanje najma filma 6000 NULL

Upit prikazan u nastavku dobiva sve izvršene uplate i zbraja ih u jedan rezultat: 2500 + 2000 + 6000 = 10500.

SELECT SUM(`amount_paid`) FROM `payments`;

Rezultat:

SUM(`iznos_plaćen`)
10500

AVG funkcija

The MySQL AVG funkcija vraća prosjek vrijednosti u određenom stupcu. Baš kao i funkcija SUM, to radi samo na numeričkim tipovima podataka.

Pretpostavimo da želimo pronaći prosječan plaćeni iznos. Možemo koristiti sljedeći upit koji dijeli ukupan iznos od 10500 s tri retka plaćanja koja nisu NULL.

SELECT AVG(`amount_paid`) FROM `payments`;

Rezultat:

AVG(`iznos_plaćen`)
3500

⚠️ Upozorenje: AVG dijeli se s brojem redaka koji nisu NULL, a ne s brojem redaka u tablici. Iznos NULL se preskače umjesto da se broji kao nula, što tiho povećava prosjek. Koristite AVG(IFNULL(`plaćeni_iznos`, 0)) kada nedostajuća vrijednost znači nulu.

Praktični primjer: Kombiniranje agregacijskih funkcija s GROUP BY

Svaka gornja funkcija vratila je jednu sliku za cijelu tablicu. Dodavanjem GROUP BY klauzula vraća jednu znamenku po grupi umjesto toga - i tako se grade prava izvješća.

Sljedeći primjer grupira članove po imenu, zatim broji ukupan broj plaćanja, prosječan iznos plaćanja i ukupan zbroj iznosa plaćanja za svakog člana.

SELECT m.`full_names`,
       COUNT(p.`payment_id`) AS `paymentscount`,
       AVG(p.`amount_paid`) AS `averagepaymentamount`,
       SUM(p.`amount_paid`) AS `totalpayments`
FROM members m, payments p
WHERE m.`membership_number` = p.`membership_number`
GROUP BY m.`full_names`;

Izvođenje gornjeg primjera u MySQL Workbench nam daje sljedeće rezultate.

AVG funkcija koja se koristi s GROUP BY

Upit spaja dvije tablice u WHERE klauzuli - starijem stilu spajanja zarezom. Moderni kod piše istu logiku kao eksplicitna UNUTARNJE SPAJANJE … UKLJUČENOTakođer imajte na umu da se svaki neagregirani stupac na SELECT listi mora pojaviti u GROUP BY ili MySQL 5.7 i novije verzije odbijaju upit pod ONLY_FULL_GROUP_BY. Pogledajte službenik MySQL referenca agregatne funkcije.

Pitanja i odgovori

The WHERE klauzula filtrira pojedinačne retke prije izračuna agregata. HAVING naknadno filtrira grupirane rezultate, tako da samo HAVING može referencirati agregat kao što je COUNT(*) ili SUM(plaćeni_iznos).

Da. Bez GROUP BY, agregat tretira cijeli skup rezultata kao jednu grupu i vraća točno jedan redak. Dodavanje GROUP BY dijeli taj rezultat u jedan redak za svaku zasebnu vrijednost grupe.

Da. Za razliku od SUM i AVG, MIN i MAX rade na bilo kojem usporedivom tipu. U tekstualnom stupcu vraćaju abecedno prvu i posljednju vrijednost, a u datumskom stupcu najraniji i najnoviji datum.

Da. Pomoćnici za pretvorbu teksta u SQL prevode pitanja poput „prosječne uplate po članu“ u GROUP BY upit. Pokrenite generirani SQL u MySQL Radna tezga i provjerite broj redaka prije nego što povjerujete brojkama.

Uobičajeni uzrok je rukovanje NULL-om i duplicirani spojevi redaka. AI model može odabrati COUNT(*) gdje je potreban COUNT(stupac) ili spojiti tablicu dvaput, što napuhuje svaki SUM. Uvijek provjerite u odnosu na poznatu brojku.

Sažmite ovu objavu uz: