Clauza SQL GROUP BY și HAVING cu exemple
Ce este SQL Group by Clause?
Clauza GROUP BY este o comandă SQL folosită pentru grupați rânduri care au aceleași valori. Clauza GROUP BY este utilizată în instrucțiunea SELECT. Opțional, este utilizat împreună cu funcțiile agregate pentru a produce rapoarte rezumative din baza de date.
Asta face, rezumarea datelor din baza de date.
Interogările care conțin clauza GROUP BY se numesc interogări grupate și returnează doar un singur rând pentru fiecare articol grupat.
SQL GROUP BY Sintaxă
Acum că știm ce este clauza SQL GROUP BY, să ne uităm la sintaxa unui grup de bază după interogare.
SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];
AICI
- „Instrucțiuni SELECT…” este interogarea standard de comandă SQL SELECT.
- A SE GRUPA CU nume_coloană1” este clauza care realizează gruparea pe baza nume_coloană1.
- „[,nume_coloană2,…]” este opțional; reprezintă alte nume de coloane atunci când gruparea se face pe mai multe coloane.
- „[HAVING condition]” este opțional; este folosit pentru a restricționa rândurile afectate de clauza GROUP BY. Este asemănător cu clauza WHERE.
Gruparea folosind a O singură coloană
Pentru a ajuta la înțelegerea efectului clauzei SQL Group By, să executăm o interogare simplă care returnează toate intrările de gen din tabelul de membri.
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
Să presupunem că vrem să obținem valorile unice pentru gen. Putem folosi următoarea interogare -
SELECT `gender` FROM `members` GROUP BY `gender`;
Executarea scriptului de mai sus în MySQL banc de lucru împotriva Myflixdb ne oferă următoarele rezultate.
gender |
---|
Female |
Male |
Rețineți că doar două rezultate au fost returnate. Acest lucru se datorează faptului că avem doar două tipuri de gen masculin și feminin. Clauza GROUP BY din SQL a grupat toți membrii „Bărbați” împreună și a returnat doar un singur rând pentru aceasta. La fel a procedat și cu membrii „femei”.
Gruparea folosind mai multe coloane
Să presupunem că vrem să obținem o listă de film category_id și anii corespunzători în care au fost lansate.
Să observăm rezultatul acestei interogări simple
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 |
Rezultatul de mai sus are multe duplicate.
Să executăm aceeași interogare folosind group by în SQL -
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Executarea scriptului de mai sus în MySQL Workbench împotriva myflixdb ne oferă următoarele rezultate prezentate mai jos.
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
Clauza GROUP BY operează atât pe ID-ul categoriei, cât și pe anul eliberat pentru identificare unic rânduri din exemplul nostru de mai sus.
Dacă id-ul categoriei este același, dar anul lansat este diferit, atunci un rând este tratat ca unul unic. Dacă id-ul categoriei și anul lansat sunt aceleași pentru mai mult de un rând, atunci este considerat un duplicat și doar un rând este arătat.
Gruparea și funcții agregate
Să presupunem că vrem un număr total de bărbați și femele în baza noastră de date. Putem folosi următorul script prezentat mai jos pentru a face asta.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Executarea scriptului de mai sus în MySQL Workbench împotriva myflixdb ne oferă următoarele rezultate.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Rezultatele afișate mai jos sunt grupate în funcție de fiecare valoare unică de gen postată, iar numărul de rânduri grupate este numărat folosind funcția de agregare COUNT.
Restricționarea rezultatelor interogării utilizând AVÂND clauză
Nu întotdeauna vom dori să realizăm grupări pe toate datele dintr-un tabel dat. Vor fi momente când vom dori să ne limităm rezultatele la un anumit criteriu dat. În astfel de cazuri, putem folosi clauza HAVING
Să presupunem că vrem să știm toți anii de lansare pentru categoria de film id 8. Am folosi următorul script pentru a obține rezultatele noastre.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Executarea scriptului de mai sus în MySQL Workbench împotriva Myflixdb ne oferă următoarele rezultate prezentate mai jos.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
Rețineți că numai filmele cu ID de categorie 8 au fost afectate de clauza noastră GROUP BY.
Rezumat
- Clauza SQL GROUP BY este folosită pentru a grupa rânduri cu aceleași valori.
- Clauza GROUP BY este utilizată împreună cu Instrucțiunea SQL SELECT.
- Instrucțiunea SELECT utilizată în clauza GROUP BY poate fi utilizată numai pentru a conține nume de coloane, funcții agregate, constante și expresii.
- Clauza SQL Having este folosită pentru a restricționa rezultatele returnate de clauza GROUP BY.
- Clauza MYSQL GROUP BY este utilizată pentru a colecta date din mai multe înregistrări și înregistrări returnate setate de una sau mai multe coloane.