MySQL Koostefunktiot: SUMMA, LASKU, AVG & MAKSIMI

⚡ Älykäs yhteenveto

Kokoonpanofunktiot sisään MySQL suorittaa laskutoimituksen yhden sarakkeen useilla riveillä ja palauttaa yhden yhteenlasketun arvon. Viisi ISO-standardifunktiota — COUNT, SUM, AVG, MIN ja MAX — tukevat lähes kaikkia tietokannan tuottamia raportteja.

  • 🔢 COUNT-käyttäytyminen: COUNT(sarake) jättää NULL-arvot huomiotta, kun taas COUNT(*) laskee kaikki taulukon rivit, mukaan lukien kaksoiskappaleet ja NULL-arvot.
  • 🚫 DISTINCT-avainsana: DISTINCT poistaa kaksoiskappaleet ennen laskutoimituksen suorittamista; oletusarvo on ALL, ja se säilyttää ne.
  • 📉 MIN ja MAX: MIN palauttaa sarakkeen pienimmän arvon ja MAX suurimman sekä numeerisissa että merkkijono- ja päivämäärätyypeissä.
  • SUMMA ja AVG: Molemmat käsittelevät vain numeerisia sarakkeita ja molemmat jättävät pois palautetusta tuloksesta NULL-rivit.
  • 📊 RYHMÄ Pariliitos: GROUP BY -funktion lisääminen muuttaa yhden yhteenvetokuvan yhdeksi yhteenvetoriviksi ryhmää kohden.
  • ⚠️ NULL-ansa: AVG jakaa vain ei-NULL-rivien lukumäärällä, joten puuttuvat arvot nostavat keskiarvoa huomaamattomasti.

Mitä ovat aggregaattifunktiot MySQL?

An aggregaattitoiminto lukee yhden sarakkeen useita rivejä ja kutistaa ne yhdeksi arvoksi. Kokonaisfunktiot tarkoittavat:

  • Laskelmien suorittaminen useilla riveillä
  • Taulukon yhdestä sarakkeesta
  • Ja palauttaa yhden arvon.

ISO-standardi määrittelee viisi (5) aggregaattifunktiota, nimittäin:

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

Yksi sääntö pätee kaikkiin viiteen: koostefunktiot jättävät huomiotta NULL-arvot. COUNT(*) on ainoa poikkeus, ja tarkastelemme miksi alla.

Miksi käyttää aggregaattifunktioita

Eri organisaatiotasoilla on erilaiset tiedontarpeet. Ylin johto on yleensä kiinnostunut kokonaisluvuista, ei yksittäisistä yksityiskohdista.

Aggregaattitoimintojen avulla voimme helposti tuottaa yhteenvetotietoja tietokannastamme.

Esimerkiksi myflix-tietokannastamme johto voi tarvita seuraavia raportteja:

  • Vähiten vuokratut elokuvat.
  • Useimmat vuokratut elokuvat.
  • Elokuvan vuokrauskertojen keskimääräinen määrä kuukaudessa.

Kaikki yllä olevat raportit ovat peräisin koostefunktioista. Tarkastellaan kutakin yksityiskohtaisesti.

COUNT-toiminto

LASKU-funktio palauttaa määritetyn kentän arvojen kokonaismäärän sekä numeerisissa että ei-numeerisissa tietotyypeissä. Kuten kaikki koostefunktiot, COUNT(sarake) jättää pois NULL-arvot.

COUNT(*) on erikoismuoto, joka palauttaa taulukon kaikkien rivien lukumäärän. Se laskee myös NULLeja ja kaksoiskappaleita, koska se laskee rivejä arvojen sijaan.

Movierentals-taulukko sisältää seuraavat tiedot:

viitenumero tapahtuma_päivä palautuspäivä jäsennumero elokuvan_tunnus elokuva_ palasi
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

Oletetaan, että haluamme selvittää, kuinka monta kertaa elokuva, jonka id on 2, on vuokrattu.

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

Tämän toteuttaminen MySQL Työpöytä myflixdb-funktio palauttaa arvon 3, koska kolmella rivillä on movie_id 2.

LASKU(`elokuvan_id`)
3

DISTINCT Avainsana

COUNT vastaa ”kuinka monta”. Seuraava kysymys on yleensä ”kuinka monta” eri ykkösiä”, ja sitä varten DISTINCT on olemassa.

DISTINCT Avainsana

DISTINCT-avainsana jättää pois kaksoiskappaleet tuloksistamme ryhmän mukaan.ping identtiset arvot yhdessä, täsmälleen kuten yllä oleva kuva antaa ymmärtää.

Suoritetaan ensin yksinkertainen kysely.

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

Nyt sama kysely DISTINCT-avainsanalla:

SELECT DISTINCT `movie_id` FROM `movierentals`;

DISTINCT jättää pois kaksoiskappaleet:

elokuvan_tunnus
1
2
3

COUNT vs. COUNT(*) vs. COUNT(DISTINCT): Kumpaa kannattaa käyttää?

DISTINCT voidaan sijoittaa myös sisällä koostefunktio, ja tässä useimmat aloittelijat häviävät tracjoista k riviä itse asiassa lasketaan. Kaikki neljä alla olevaa lomaketta suorittavat saman aiemmin esitetyn viisirivisen movierentals-taulukon, mutta ne eivät kaikki palauta samaa lukua. Ero tiivistyy kahteen kysymykseen: laskeeko lomake rivejä vai arvoja ja säilyttääkö se kaksoiskappaleet?

muoto Mitä sillä on merkitystä Tulos elokuvavuokraamoissa
LASKEA(*) Jokainen rivi, mukaan lukien kaksoiskappaleet ja rivit, jotka ovat kokonaan NULL-arvoisia 5
LASKU(`elokuvan_id`) Jokainen sarakkeen ei-NULL-arvo, kaksoiskappaleet mukaan lukien 5
LASKU(`palautuspäivä`) Vain ei-NULL-arvot — kaksi NULL-palautuspäivämäärää ohitetaan 3
LASKU(DISTINCT `elokuvan_id`) Vain yksilölliset, ei-NULL-arvot 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡 Vinkki: Käytä COUNT(*)-funktiota rivien lukumäärän laskemiseen, COUNT(sarake)-funktiota, kun NULL-arvon tulisi tarkoittaa "ei sovelleta", ja COUNT(DISTINCT-sarake)-funktiota yksilöllisten arvojen laskemiseen. DISTINCT-funktion vastakohta on ALL — oletusarvo, jota siksi harvoin kirjoitetaan.

MIN-toiminto

MIN-toiminto palauttaa pienimmän arvon määritetyssä taulukkokentässä.

Oletetaan, että haluamme vuoden, jolloin kirjastomme vanhin elokuva julkaistiin. MySQLn MIN-funktio antaa meille sen.

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

Tulos:

MIN(`julkaisuvuosi`)
2005

MAX-toiminto

Kuten nimestä voi päätellä, MAX-toiminto on MIN-funktion vastakohta. Se palauttaa suurimman arvon määritetystä taulukkokentästä.

Oletetaan, että haluamme vuoden, jolloin tietokannassamme oleva uusin elokuva julkaistiin. Seuraava esimerkki palauttaa sen.

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

Tulos:

MAX(`julkaisuvuosi`)
2012

SUM-toiminto

MIN ja MAX valitsevat olemassa olevan arvon sarakkeesta. SUMMA ja AVG Laske uusi luku koko sarakkeesta.

Oletetaan, että haluamme tähän mennessä suoritettujen maksujen kokonaismäärän. MySQL SUMMA toiminto palauttaa kaikkien määritetyn sarakkeen arvojen summan. SUM toimii vain numeerisissa kentissäja NULL-arvot jätetään pois tuloksesta.

Seuraavassa taulukossa näkyvät maksutaulukon tiedot.

maksu_tunnus jäsennumero maksupäivä kuvaus maksettu summa ulkoinen_ viite _numero
1 1 23-07-2012 Elokuvan vuokran maksu 2500 11
2 1 25-07-2012 Elokuvan vuokran maksu 2000 12
3 3 30-07-2012 Elokuvan vuokran maksu 6000 NULL

Alla oleva kysely hakee kaikki suoritetut maksut ja summaa ne yhdeksi tulokseksi: 2500 + 2000 + 6000 = 10500.

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

Tulos:

SUMMA(`maksettu_summa`)
10500

AVG toiminto

MySQL AVG toiminto palauttaa määritetyn sarakkeen arvojen keskiarvon. Aivan kuten SUM-funktio, se toimii vain numeerisilla tietotyypeillä.

Oletetaan, että haluamme selvittää keskimääräisen maksetun summan. Voimme käyttää seuraavaa kyselyä, joka jakaa kokonaissumman 10500 kolmella ei-NULL-maksurivillä.

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

Tulos:

AVG(`maksettu_summa`)
3500

⚠️ Varoitus: AVG jakaa ei-NULL-rivien lukumäärällä, ei taulukon rivien lukumäärällä. NULL-määrä ohitetaan nollan sijaan, mikä nostaa keskiarvoa hiljaa ylöspäin. Käytä AVG(IFNULL(`amount_paid`, 0)), kun puuttuva arvo tarkoittaa nollaa.

Käytännön esimerkki: Koostefunktioiden yhdistäminen GROUP BY -funktion kanssa

Jokainen yllä oleva funktio palautti yhden luvun koko taulukosta. Lisäämällä GROUP BY lauseke palauttaa yhden luvun ryhmää kohden sen sijaan – ja näin oikeat raportit rakennetaan.

Seuraavassa esimerkissä jäsenet ryhmitellään nimen mukaan ja lasketaan sitten kunkin jäsenen maksujen kokonaismäärä, keskimääräinen maksusumma ja maksujen kokonaissumma.

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

Suorita yllä oleva esimerkki sisään MySQL Workbench antaa meille seuraavat tulokset.

AVG GROUP BY -funktion kanssa käytetty funktio

Kysely yhdistää kaksi taulukkoa WHERE-lausekkeessa — vanhemmassa pilkkuliitostyylissä. Nykyaikainen koodi kirjoittaa saman logiikan kuin eksplisiittinen SISÄINEN LIITTYMINEN … PÄÄLLÄHuomaa myös, että jokaisen SELECT-luettelon ei-aggregoidun sarakkeen on oltava GROUP BY -luettelossa. MySQL 5.7 ja uudemmat hylkäävät kyselyn ONLY_FULL_GROUP_BY-kohdassa. Katso virallinen MySQL koostefunktion viite.

UKK

WHERE-lauseke suodattaa yksittäiset rivit ennen koosteen laskemista. HAVING suodattaa ryhmitellyt tulokset jälkikäteen, joten vain HAVING voi viitata koosteeseen, kuten COUNT(*) tai SUM(maksettu_summa).

Kyllä. Ilman GROUP BY -funktiota kooste käsittelee koko tulosjoukkoa yhtenä ryhmänä ja palauttaa täsmälleen yhden rivin. GROUP BY -funktion lisääminen jakaa tuloksen yhdeksi riviksi kutakin erillistä ryhmäarvoa kohden.

Kyllä. Toisin kuin SUMMA ja AVG, MIN ja MAX toimivat kaikilla vastaavilla tyypeillä. Tekstisarakkeessa ne palauttavat aakkosjärjestyksessä ensimmäisen ja viimeisen arvon ja päivämääräsarakkeessa aikaisimman ja myöhäisimmän päivämäärän.

Kyllä. Text-to-SQL-avustajat kääntävät kysymykset, kuten "jäsenkohtainen keskimääräinen maksu", GROUP BY -kyselyksi. Suorita luotu SQL-kysely MySQL Työpöytä ja tarkista rivien määrä ennen kuin luotat lukuihin.

Yleinen syy on NULL-käsittely ja kahdentuneet liitosrivit. Tekoälymalli saattaa valita COUNT(*)-funktion, kun COUNT(sarake)-funktiota tarvitaan, tai liittää taulukon kahdesti, mikä kasvattaa jokaista SUMMA-funktiota. Tarkista aina tunnettua lukua vasten.

Tiivistä tämä viesti seuraavasti: