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

Mi az SQL Group by Clause?

A GROUP BY záradék egy SQL-parancs, amelyhez szokott csoportosítsa az azonos értékkel rendelkező sorokat. A GROUP BY záradékot a SELECT utasítás használja. Opcionálisan az összesítő függvényekkel együtt használható összefoglaló jelentések készítésére az adatbázisból.

Ez az, amit csinál, összefoglaló adatokat az adatbázisból.

A GROUP BY záradékot tartalmazó lekérdezéseket csoportosított lekérdezéseknek nevezzük, és csak egyetlen sort adnak vissza minden csoportosított elemhez.

SQL GROUP BY Szintaxis

Most, hogy tudjuk, mi az SQL GROUP BY záradék, nézzük meg egy lekérdezés szerinti alapcsoport szintaxisát.

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

ITT

  • A „SELECT utasítások…” a szabványos SQL SELECT parancslekérdezés.
  • "CSOPORTOSÍT oszlop_neve1” az a záradék, amely az oszlopnév1 alapján végzi a csoportosítást.
  • „[,oszlop_neve2,…]” nem kötelező; más oszlopneveket jelöl, ha a csoportosítás egynél több oszlopon történik.
  • A „[HAVING feltétel]” nem kötelező; a GROUP BY záradék által érintett sorok korlátozására szolgál. Hasonló a WHERE záradék.

Csoportosítás segítségével a Egy oszlop

Az SQL Group By záradék hatásának megértése érdekében hajtsunk végre egy egyszerű lekérdezést, amely visszaadja az összes gender bejegyzést a Members táblából.

SELECT `gender` FROM `members` ;
gender
Female
Female
Male
Female
Male
Male
Male
Male
Male

Tegyük fel, hogy meg akarjuk kapni a nemek egyedi értékeit. A következő lekérdezést használhatjuk:

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

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

gender
Female
Male

Megjegyzendő, hogy csak két eredmény érkezett vissza. Ennek az az oka, hogy csak két nemünk van, férfi és nő. A GROUP BY záradék az SQL-ben az összes „férfi” tagot csoportosította, és csak egyetlen sort adott vissza. Ugyanezt tette a „női” tagokkal is.

Csoportosítás segítségével több oszlop

Tegyük fel, hogy szeretnénk kapni egy listát a film kategória_azonosítójáról és a megfelelő kiadási évekről.

Nézzük meg ennek az egyszerű lekérdezésnek a kimenetét

SELECT `category_id`,`year_released` FROM `movies` ;
category_id year_released
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 fenti eredménynek sok ismétlődése van.

Végezzük el ugyanazt a lekérdezést a group by használatával SQL-ben –

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

A fenti szkript végrehajtása MySQL munkapad a myflixdb-vel szemben a következő eredményeket adja az alábbiakban.

category_id year_released
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 kategóriaazonosítón, mind a kiadott éven működik az azonosítás érdekében egyedi sorokat a fenti példánkban.

Ha a kategóriaazonosító megegyezik, de a kiadás éve eltér, akkor a sor egyediként lesz kezelve. Ha a kategóriaazonosító és a kiadás éve egynél több sorban megegyezik, akkor az ismétlődőnek és csak egy sornak minősül. megmutatva.

Csoportosítás és összesített függvények

Tegyük fel, hogy az adatbázisunkban a hímek és a nőstények teljes számát szeretnénk. Ehhez az alább látható szkriptet használhatjuk.

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

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

gender COUNT('membership_number')
Female 3
Male 5

Az alább látható eredmények minden közzétett egyedi nemi érték szerint vannak csoportosítva, és a csoportosított sorok számát a COUNT összesítő függvény számolja.

A lekérdezési eredmények korlátozása a HOGY kikötés

Nem mindig akarunk csoportosítást végezni egy adott tábla összes adatán. Lesznek olyan esetek, amikor egy bizonyos kritériumra szeretnénk korlátozni az eredményeinket. Ilyen esetekben használhatjuk a HAVING záradékot

Tegyük fel, hogy tudni akarjuk a 8-as filmkategória összes megjelenési évét. Eredményeink eléréséhez a következő forgatókönyvet használnánk.

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

A fenti szkript végrehajtása MySQL munkapad a Myflixdb-vel szemben az alábbi eredményeket adja.

movie_id title director year_released category_id
9 Honey mooners John Schultz 2005 8
5 Daddy's Little Girls NULL 2007 8

Vegye figyelembe, hogy a GROUP BY záradék csak a 8-as kategóriaazonosítójú filmeket érinti.

Összegzésként

  • A GROUP BY Clause SQL az azonos értékű sorok csoportosítására szolgál.
  • A GROUP BY záradék a következővel együtt használatos SQL SELECT utasítás.
  • A GROUP BY záradékban használt SELECT utasítás csak oszlopneveket, összesítő függvényeket, konstansokat és kifejezéseket tartalmazhat.
  • Az SQL Having Clause a GROUP BY záradék által visszaadott eredmények korlátozására szolgál.
  • A MYSQL GROUP BY záradék több rekordból és egy vagy több oszlop által visszaadott rekordkészletből származó adatok gyűjtésére szolgál.