MySQL GROUP BY és HAVING záradék példákkal

⚡ Okos összefoglaló

Az SQL GROUP BY és HAVING záradékok részletes sorokat készítenek összefoglaló jelentésekké. A GROUP BY a közös értékű sorokat csoportonként egy sorba csukja össze, míg a HAVING a COUNT-hoz hasonló összesítő függvények alkalmazása után szűri ezeket a csoportokat.

  • 📊 Fő cél: A GROUP BY függvény az azonos értékű sorokat csoportosítja, és minden csoportosított elemhez egyetlen sort ad vissza.
  • 🧩 Egy oszlopos csoportping: Grouping A nemekre vonatkozó tagok táblázata kilenc sort kettőre csuk össze, egyet a nőknek és egyet a férfiaknak.
  • 🔗 Több oszlop csoportping: Grouping két oszlopon a függvény egyediként kezeli a sort, ha bármelyik érték eltér, így csak a pontos ismétlődések omlanak össze.
  • 🧮 Összesített párosítás: DARAB, SZUM, AVGA , MIN és MAX függvények csoportonként egy értéket számítanak ki, amelyből az összegző jelentés készül.
  • 🚦 HASZNÁLAT kontra HOL: A WHERE a grou előtti sorokat szűripingA HAVING utána szűri a csoportokat, és csak a HAVING fogadja el az összesített eredményeket.
  • ⚠️ Szigorú üzemmód figyelmeztetés: Az ONLY_FULL_GROUP_BY függvény alatt minden kiválasztott oszlopot csoportosítani vagy egy összesítő függvénybe kell csomagolni.

SQL GROUP BY és HAVING záradék

Mi az SQL GROUP BY záradék?

A GROUP BY záradék egy SQL-parancs, amelyhez szokott csoportosítsa az azonos értékkel rendelkező sorokatA SELECT utasításon belül íródik, és általában összesítő függvényekkel együtt használják összefoglaló jelentések készítéséhez az adatbázisból.

Ezt teszi: azt összegzi az adatokat az adatbázisban tárolva. A GROUP BY záradékot tartalmazó lekérdezéseket csoportosított lekérdezéseknek nevezzük, és minden csoportosított elemhez egyetlen sort adnak vissza.

SQL GROUP BY Szintaxis

Most, hogy a záradék célja világos, nézzük meg egy alapvető csoportosított lekérdezés szintaxisát.

SELECT statements... GROUP BY column_name1[, column_name2, ...] [HAVING condition];

ITT

  • "SELECT utasítások…„ez a szabvány” SQL SELECT parancs lekérdezés.
  • "CSOPORTOSÍT oszlop_neve1„az a záradék, amely végrehajtja az alapértéket”ping az 1. oszlopnév alapján.
  • "[, oszlop_neve2, …]A „” opcionális, és más oszlopneveket jelöl, amikor a csoportping egynél több oszlopon történik.
  • "[ÁLLAPOTBAN VAN]A „” opcionális, és a GROUP BY záradék által érintett sorok korlátozására szolgál. Hasonló a következőhöz: WHERE záradék, azzal a különbséggel, hogy a talaj után alkalmazzákping.

Grouping Egyetlen oszlop használata

Az SQL GROUP BY záradék hatásának leggyorsabb vizsgálati módja egy csoportosítatlan és egy csoportosított lekérdezés összehasonlítása. Kezdjünk egy egyszerű lekérdezéssel, amely a tagok táblában található összes nemre vonatkozó bejegyzést visszaadja.

SELECT `gender` FROM `members`;
nemek
férfi
férfi
férfi
férfi
férfi
férfi

Kilenc sort ad vissza a rendszer, és minden érték ismétlődik. Tegyük fel, hogy a nemhez tartozó egyedi értékekre van szükségünk. Az alábbi lekérdezés hozzáadja a GROUP BY záradékot.

SELECT `gender` FROM `members` GROUP BY `gender`;

A fenti szkript végrehajtása MySQL Workbench A myflixdb ellen a következő eredményeket kapjuk.

nemek
férfi

Megjegyzendő, hogy csak két sor került visszaadásra, mivel a tábla csak két nemtípust tartalmaz. A GROUP BY záradék az összes „Férfi” tagot egy csoportba sorolta, és egyetlen sort adott vissza számukra, ugyanezt tette a „Nő” tagokkal is.

Grouping Több oszlop használata

Grouping Az egyetlen oszlopon alapuló meghatározás gyakran túl durva egy valódi jelentéshez. A GROUP BY vesszővel elválasztott oszloplistát fogad el, és az értékeik kombinációja határozza meg az egyes csoportokat.

Tegyük fel, hogy egy listát szeretnénk a filmek category_id értékeiről és a filmek megjelenési éveinek megfelelő évéről. Először figyeljük meg ennek az egyszerű lekérdezésnek a kimenetét.

SELECT `category_id`, `year_released` FROM `movies`;
kategória_azonosítója év_megjelent
1 2011
2 2008
NULL 2008
NULL 2010
8 2007
6 2007
6 2007
8 2005
NULL 2012
7 1920
8 NULL
8 1920

A kiemelt sorok azt mutatják, hogy az eredmény ismétlődő elemeket tartalmaz. Ugyanazon lekérdezés GROUP BY függvénnyel történő végrehajtása eltávolítja ezeket.

SELECT `category_id`, `year_released` FROM `movies` GROUP BY `category_id`, `year_released`;

A fenti szkript végrehajtása MySQL A Workbench és a myflixdb összehasonlítása az alábbi eredményeket adja.

kategória_azonosítója év_megjelent
NULL 2008
NULL 2010
NULL 2012
1 2011
2 2008
6 2007
7 1920
8 1920
8 2005
8 2007

A GROUP BY záradék mind a category_id, mind a year_released azonosítókkal azonosítja a egyedi sorok. A 6. kategóriához tartozó két ismétlődő sor 2007-ben egybeolvadt.

Ökölszabály: Ha a kategóriaazonosító ugyanaz, de a kiadás éve eltérő, akkor a sort egyediként kezeli a rendszer. Ha a kategóriaazonosító és a kiadás éve egynél több sorban is megegyezik, akkor a sorok ismétlődnek, és csak az egyik jelenik meg.

Grouping és aggregált függvények

A duplikátumok eltávolítása hasznos, de a csoportosulás igazi ereje...ping akkor jelenik meg, ha párosítva van a következővel: összesített függvényekEgy összesítő függvény minden csoporthoz egy értéket számít ki: a COUNT megszámolja a sorokat, a SUM összeadja az értékeket, és AVGA , MIN és MAX értékek a spreadet írják le.

Tegyük fel, hogy meg akarjuk tudni az adatbázisban lévő férfi és női tagok teljes számát. Az alábbi szkript ezt teszi meg.

SELECT `gender`, COUNT(`membership_number`) FROM `members` GROUP BY `gender`;

A fenti szkript végrehajtása MySQL A Workbench és a myflixdb összehasonlítása a következő eredményeket adja.

nemek DARAB(`tagsági_szám`)
3
férfi 6

A sorok minden egyedi nemérték szerint vannak csoportosítva, és az egyes csoportokon belüli sorok számát a COUNT összesítő függvény számolja. A kilenc tagrekord két összesítő sorra omlik össze.

Lekérdezési eredmények korlátozása a HAVING záradék használatával

GroupingNem mindig szükségesek az s függvények egy táblázat minden sorához. Előfordul, hogy a jelentést egy adott kritériumra kell korlátozni, és ez a HAVING záradék feladata.

Tegyük fel, hogy a 8-as kategóriaazonosítójú film összes megjelenési évét szeretnénk tudni. Az alábbi szkript ezt az eredményt éri el.

SELECT * FROM `movies` GROUP BY `category_id`, `year_released` HAVING `category_id` = 8;

A fenti szkript végrehajtása MySQL A Workbench és a myflixdb összehasonlítása az alábbi eredményeket adja.

film_id cím rendező év_megjelent kategória_azonosítója
9 Honey moonERS Schultz János 2005 8
5 Apa kislányai NULL 2007 8

A HAVING feltétel csak a 8-as kategóriaazonosítójú filmeket tartotta meg.

Figyelmeztetés: MySQL Az 5.7-es és újabb verziók alapértelmezés szerint engedélyezik az ONLY_FULL_GROUP_BY módot, és ebben a módban a GROUP BY záradékkal ellátott SELECT * elutasításra kerül, mivel a movie_id, a title és a director nem csoportosított és nem összesített. Éles környezetben a csoportosított oszlopokat explicit módon kell elnevezni, például SELECT kategória_id, megjelenési_év FROM filmek GROUP BY kategória_id, megjelenési_év HAVING kategória_id = 8;

WHERE vs HAVING vs GROUP BY vs ORDER BY

A kezdők gyakran keverik ezt a négy záradékot, mivel mindegyik befolyásolja az eredményhalmazt. A különbség abban rejlik, hogy amikor MySQL alkalmazza őket: a WHERE a sorok csoportosítása előtt, a HAVING utána, az ORDER BY pedig utoljára fut.

Kikötés Mit csinál Amikor fut Összesítő függvényeket fogad el
AHOL Szűri az egyes sorokat bármely csoport előttping. GROUP BY előtt Nem
CSOPORTOSÍT Az azonos értékeket megosztó sorokat csoportonként egy sorba csukja össze. Miután HOL Nem alkalmazható
HOGY Szűri a GROUP BY által létrehozott csoportokat. GROUP BY után Igen, például HAVING COUNT(*) > 2
RENDEZÉS Rendezi azokat a sorokat, amelyek túlélik az előző záradékokat. keresztnév Igen, egy összesített alias rendezhető

A gyakorlati következmény a teljesítményre vonatkozik. A WHERE szűrés eltávolítja a csoport előtti sorokat.ping A munka elkezdődik, tehát egy olyan feltétel, amely nem függ egy összesített eredménytől, a WHERE-be tartozik, a HAVING helyett.

GYIK

Igen. A GROUP BY önmagában egy sort ad vissza egyedi értékenként, ami a SELECT DISTINCT-hez hasonlóan eltávolítja az ismétlődő elemeket. Az összesítő függvényekre csak akkor van szükség, ha minden csoportnak számított értékre van szüksége.

A hiba akkor jelenik meg, ha egy kiválasztott oszlop nem szerepel a GROUP BY listában, és nem is tartozik összesítő függvénybe. MySQL nem tudja eldönteni, hogy az oszlop melyik értékét jelenítse meg a csoportnál, ezért elutasítja a lekérdezést.

A COUNT(*) függvény a csoport összes sorát megszámolja. A COUNT(oszlop) függvény csak azokat a sorokat számolja, ahol az adott oszlop nem szerepel. NULL, tehát a két érték mindig eltér, ha az oszlop hiányzó értékeket tartalmaz.

Igen. Mesterséges intelligencia asszisztensek olyan eszközökben, mint például MySQL Workbench Fordítson le egy olyan kérést, mint például a „tagok nemenként”, csoportosított lekérdezéssé. Ellenőrizze a csoportotping oszlopok magad, mert rossz alaponping olyan összesítéseket eredményez, amelyek hihetőnek tűnnek, de helytelenek.

Gyakran igen. A mesterséges intelligencia által vezérelt lekérdezés-asszisztensek klasszikus okokat jelölnek meg, például egy JOIN amely a csoport előtti sorokat szorozzaping, vagy egy szűrőt, amelyet a HAVING-ba helyezünk a WHERE helyett. A végső döntés továbbra is azé a személyé, aki ismeri az adatokat.

Foglald össze ezt a bejegyzést a következőképpen: