MySQL Koondfunktsioonid: SUM, COUNT, AVG & MAX

⚡ Nutikas kokkuvõte

Koondfunktsioonid sisse MySQL teostada arvutus ühe veeru mitme rea ulatuses ja tagastada üks summeeritud väärtus. Viis ISO standardfunktsiooni — COUNT, SUM, AVG, MIN ja MAX – annavad jõudu peaaegu igale andmebaasi loodud aruandele.

  • 🔢 COUNT käitumine: Funktsioon COUNT(veerg) ignoreerib NULL-väärtusi, samas kui COUNT(*) loendab tabelis kõik read, sealhulgas duplikaadid ja NULL-väärtused.
  • 🚫 ERINEV märksõna: Funktsioon DISTINCT eemaldab enne arvutuse käivitamist duplikaatväärtused; vaikeväärtus on ALL ja see säilitab need.
  • 📉 MIN ja MAX: MIN tagastab veeru väikseima väärtuse ja MAX suurima nii numbriliste, stringi- kui ka kuupäevatüüpide puhul.
  • SUMMA ja AVG: Mõlemad töötavad ainult numbriliste veergudega ja mõlemad jätavad tagastatud tulemusest välja NULL-read.
  • 📊 GRUPI PIIRIDES Sidumine: Funktsiooni GROUP BY lisamine muudab ühe kokkuvõtva joonise üheks kokkuvõtvaks reaks rühma kohta.
  • ⚠️ NULL-lõks: AVG jagab ainult mitte-NULL ridade arvuga, seega puuduvad väärtused tõstavad keskmist märkamatult.

Mis on koondfunktsioonid MySQL?

An koondfunktsioon loeb ühe veeru mitu rida ja koondab need üheks väärtuseks. Koondfunktsioonide eesmärk on:

  • Arvutuste tegemine mitmel real
  • Tabeli ühest veerust
  • Ja ühe väärtuse tagastamine.

ISO standard defineerib viis (5) koondfunktsiooni, nimelt:

  1. COUNT
  2. SUM
  3. AVG
  4. MIN
  5. MAX

Kõigi viie puhul kehtib üks reegel: koondfunktsioonid ignoreerivad NULL-väärtusi. COUNT(*) on ainus erand ja me vaatame allpool, miks.

Miks kasutada koondfunktsioone

Erinevatel organisatsioonitasanditel on erinevad infovajadused. Tippjuhid on tavaliselt huvitatud tervikarvudest, mitte üksikutest detailidest.

Koondfunktsioonid võimaldavad meil hõlpsasti koostada meie andmebaasist kokkuvõtlikke andmeid.

Näiteks võib juhtkond meie myflixi andmebaasist vajada järgmisi aruandeid:

  • Kõige vähem laenutatud filme.
  • Enamik laenutatud filme.
  • Keskmine arv kordi, kui iga filmi kuus laenutatakse.

Kõik ülaltoodud aruanded pärinevad koondfunktsioonidest. Vaatleme igaüht neist lähemalt.

COUNT funktsioon

Funktsioon COUNT tagastab määratud väljal olevate väärtuste koguarvu nii numbriliste kui ka mittenumbriliste andmetüüpide korral. Nagu iga koondfunktsioon, välistab ka COUNT(veerg) NULL-väärtused.

COUNT(*) on erivorm, mis tagastab tabeli kõigi ridade arvu. See loendab ka NULL-id ja duplikaate, sest see loendab ridu, mitte väärtusi.

Movierentals tabel sisaldab järgmisi andmeid:

viite_number tehingu_kuupäev tagastamise_kuupäev liikme_number filmi_id film_ tagastatud
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

Oletame, et tahame teada, mitu korda on filmi ID-ga 2 välja laenutatud.

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

Selle elluviimine MySQL Workbench myflixdb vastu tagastab väärtuse 3, sest kolmel real on movie_id 2.

LOEND(`filmi_id`)
3

DISTINCT Märksõna

COUNT vastab küsimusele „kui palju“. Järgmine küsimus on tavaliselt „kui palju erinev „ones” ja selleks ongi DISTINCT loodud.

DISTINCT Märksõna

Märksõna DISTINCT jätab meie tulemustest välja duplikaadid grupi järgi.ping identsed väärtused koos, täpselt nagu ülaltoodud illustratsioon näitab.

Esmalt teostame lihtsa päringu.

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

Nüüd sama päring märksõnaga DISTINCT:

SELECT DISTINCT `movie_id` FROM `movierentals`;

DISTINCT jätab duplikaatkirjed välja:

filmi_id
1
2
3

COUNT vs COUNT(*) vs COUNT(DISTINCT): Kumba neist peaksite kasutama?

DISTINCT saab paigutada ka sees koondfunktsioon ja just siin kaotab enamik algajaid tracmillest k ridu tegelikult loendatakse. Kõik neli allolevat vormi töötavad sama viie reaga movierentals tabeli alusel, mida varem näidati, kuid need kõik ei tagasta sama arvu. Erinevus taandub kahele küsimusele: kas vorm loendab ridu või väärtusi ja kas see säilitab duplikaate?

vorm Mis see loeb Tulemus filmirentalites
LOEND(*) Iga rida, sealhulgas duplikaadid ja read, mis on täiesti NULL-väärtusega 5
LOEND(`filmi_id`) Iga mitte-NULL väärtus veerus, kaasa arvatud duplikaadid 5
LOEND(`tagastuskuupäev`) Ainult mitte-NULL väärtused – kaks NULL tagastuskuupäeva jäetakse vahele 3
LOEND(DISTINCT `filmi_id`) Ainult unikaalsed mitte-NULL väärtused 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡 Näpunäide: Reaarvu jaoks kasutage funktsiooni COUNT(*), NULL-i puhul COUNT(veerg) ja unikaalsete väärtuste jaoks funktsiooni COUNT(DISTINCT veerg). Funktsiooni DISTINCT vastand on ALL – vaikeväärtus, mida seetõttu harva välja kirjutatakse.

MIN funktsioon

Funktsioon MIN tagastab määratud tabelivälja väikseima väärtuse.

Oletame, et tahame teada aastat, mil ilmus meie raamatukogu vanim film. MySQLSelle annab meile funktsioon MIN.

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

Tulemus:

MIN(`väljalaske_aasta`)
2005

MAX funktsioon

Nagu nimigi ütleb, on MAX funktsioon MIN-funktsiooni vastand. See tagastab määratud tabelivälja suurima väärtuse.

Oletame, et tahame teada aastat, millal ilmus meie andmebaasis olev uusim film. Järgmine näide tagastab selle.

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

Tulemus:

MAX(`väljalaskeaasta`)
2012

SUM-funktsioon

MIN ja MAX valivad veerust olemasoleva väärtuse. SUM ja AVG Arvuta kogu veeru põhjal uus arv.

Oletame, et tahame teada seni tehtud maksete kogusummat. MySQL SUM funktsioon tagastab kõigi määratud veeru väärtuste summa. SUM töötab ainult numbriväljadelja NULL-väärtused jäetakse tulemusest välja.

Järgmises tabelis on näidatud maksete tabeli andmed.

makse_ id liikme_number makse_kuupäev kirjeldus summa_ makstud väline_ viite _number
1 1 23-07-2012 Filmi laenutuse tasumine 2500 11
2 1 25-07-2012 Filmi laenutuse tasumine 2000 12
3 3 30-07-2012 Filmi laenutuse tasumine 6000 NULL

Allolev päring saab kõik tehtud maksed ja summeerib need üheks tulemuseks: 2500 + 2000 + 6000 = 10500.

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

Tulemus:

SUM(`makstud_summa`)
10500

AVG funktsioon

. MySQL AVG funktsioon tagastab määratud veeru väärtuste keskmise. Nii nagu funktsioon SUM, see töötab ainult numbriliste andmetüüpidega.

Oletame, et tahame leida keskmise makstud summa. Selleks võime kasutada järgmist päringut, mis jagab summa 10500 kolme mitte-NULL maksereaga.

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

Tulemus:

AVG(`makstud_summa`)
3500

⚠️ Hoiatus: AVG jagab mitte-NULL ridade arvuga, mitte tabeli ridade arvuga. NULL-väärtus jäetakse vahele, mitte ei loeta seda nulliks, mis tõstab keskmist vaikselt üles. Kasutage AVG(IFNULL(`amou_paid`, 0)), kui puuduv väärtus tähendab nulli.

Praktiline näide: koondfunktsioonide kombineerimine funktsiooniga GROUP BY

Iga ülaltoodud funktsioon tagastas ühe arvu kogu tabeli kohta. A lisamine GROUP BY lause tagastab ühe numbri rühma kohta selle asemel – ja just nii luuaksegi päris aruandeid.

Järgmises näites rühmitatakse liikmed nime järgi ning seejärel loendatakse iga liikme maksete koguarv, keskmine maksesumma ja maksete kogusumma.

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`;

Ülaltoodud näite täitmine sisse MySQL Workbench annab meile järgmised tulemused.

AVG funktsioon, mida kasutatakse koos GROUP BY-ga

Päring ühendab kaks tabelit WHERE-klauslis – vanemas komaliitmisstiilis. Tänapäeva kood kirjutab sama loogikaga kui selgesõnaline SISEMINE LIITUMINE … SEESPane tähele ka seda, et iga SELECT-loendi mittekoondatud veerg peab ilmuma ka GROUP BY-s või MySQL 5.7 ja hilisemad versioonid lükkavad päringu tagasi ONLY_FULL_GROUP_BY alusel. Vaadake ametlik MySQL koondfunktsiooni viide.

KKK

. KUS klausel filtreerib üksikud read enne koondsumma arvutamist. HAVING filtreerib rühmitatud tulemused pärast, seega ainult HAVING saab viidata koondsummale, näiteks COUNT(*) või SUM(makstud_summa).

Jah. Ilma GROUP BY funktsioonita käsitleb agregaat kogu tulemuste komplekti ühe rühmana ja tagastab täpselt ühe rea. GROUP BY lisamine jagab tulemuse iga eraldi rühma väärtuse jaoks eraldi reale.

Jah. Erinevalt SUM-ist ja AVG, MIN ja MAX toimivad mis tahes võrreldava tüübi puhul. Tekstiveeru puhul tagastavad nad tähestikulises järjekorras esimese ja viimase väärtuse ning kuupäevaveeru puhul varaseima ja hiliseima kuupäeva.

Jah. Tekstist SQL-i teisendamise abilised tõlgivad sellised küsimused nagu „keskmine makse liikme kohta” GROUP BY päringuks. Käivitage genereeritud SQL-päring MySQL Workbench ja kontrollige enne numbrite usaldamist ridade arvu.

Tavaline põhjus on NULL-i käsitlemine ja dubleeritud liitmisread. Tehisintellekti mudel võib valida COUNT(*) asemel, kus COUNT(veerg) on ​​vajalik, või liita tabeli kaks korda, mis suurendab iga SUM-i. Kontrollige alati teadaoleva arvu suhtes.

Võta see postitus kokku järgmiselt: