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.

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 |
|---|
| nő |
| nő |
| férfi |
| nő |
| 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 |
|---|
| nő |
| 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`) |
|---|---|
| nő | 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.
