Što je klauzula SQL Group by Clause?
Klauzula GROUP BY je SQL naredba koja se koristi za grupiranje redaka koji imaju iste vrijednosti . Klauzula GROUP BY koristi se u naredbi SELECT. Po želji se koristi zajedno s skupnim funkcijama za izradu sažetkih izvještaja iz baze podataka.
To čini, sažimajući podatke iz baze podataka.
Upiti koji sadrže klauzulu GROUP BY nazivaju se grupiranim upitima i vraćaju samo jedan redak za svaku grupiranu stavku.
SQL GRUPA PO Sintaksi
Sad kad znamo što je klauzula SQL GROUP BY, pogledajmo sintaksu osnovne grupe prema upitu.
SELECT statements… GROUP BY column_name1[,column_name2,… ] [HAVING condition];
OVDJE
- "SELECT naredbe ..." standardni je SQL naredbeni upit naredbe.
- " GROUP BY stupac_ime1" je klauzula koja izvodi grupiranje na temelju stupca_ime1.
- "[, ime_stupca2, ...]" nije obavezno; predstavlja druga imena stupaca kada se grupiranje vrši na više stupaca.
- "[HAVING condition]" nije obavezno; koristi se za ograničavanje redaka na koje utječe klauzula GROUP BY. Slična je klauzuli WHERE.
Grupiranje pomoću jednog stupca
Da bismo lakše razumjeli učinak klauzule SQL Group By, izvršimo jednostavan upit koji vraća sve rodne unose iz tablice članova.
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
Pretpostavimo da želimo dobiti jedinstvene vrijednosti za spolove. Možemo upotrijebiti sljedeći upit -
SELECT `gender` FROM `members` GROUP BY `gender`;
Izvršavanje gornje skripte u MySQL radnom stolu protiv Myflixdb daje nam sljedeće rezultate.
gender |
---|
Female |
Male |
Imajte na umu da su vraćena samo dva rezultata. To je zato što imamo samo dvije rodne vrste muški i ženski. Klauzula GROUP BY u SQL grupirala je sve članove "Muški" i za to vratila samo jedan redak. Isto je učinilo i sa "Ženskim" članovima.
Grupiranje pomoću više stupaca
Pretpostavimo da želimo dobiti popis filmova category_id i odgovarajuće godine u kojima su objavljeni.
Promatrajmo izlaz ovog jednostavnog upita
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 |
Gornji rezultat ima mnogo duplikata.
Izvršimo isti upit koristeći group by u SQL-u -
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Izvršavanje gornje skripte u MySQL radnom stolu protiv myflixdb daje nam sljedeće rezultate prikazane u nastavku.
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
Klauzula GROUP BY djeluje i na id kategorije i na godinu objavljenu kako bi identificirala jedinstvene retke u našem gornjem primjeru.
Ako je identifikator kategorije isti, ali godina izdavanja je različita, tada se redak tretira kao jedinstveni. Ako su ID kategorije i godina objavljivanja jednaki za više redaka, tada se smatra duplikatom i samo jednim redom je prikazan.
Grupiranje i agregatne funkcije
Pretpostavimo da želimo ukupan broj muškaraca i žena u našoj bazi podataka. Za to možemo koristiti sljedeću skriptu prikazanu u nastavku.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Izvršenje gornje skripte u MySQL radnom stolu protiv myflixdb daje nam sljedeće rezultate.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Rezultati prikazani u nastavku grupirani su prema svakoj objavljenoj jedinstvenoj spolnoj vrijednosti, a broj grupiranih redaka broji se pomoću funkcije ZBIRANJA COUNT.
Ograničavanje rezultata upita upotrebom klauzule HAVING
Nije uvijek da ćemo htjeti izvršiti grupiranje svih podataka u datoj tablici. Bit će trenutaka kada ćemo svoje rezultate željeti ograničiti na određene zadane kriterije. U takvim slučajevima možemo koristiti klauzulu HAVING
Pretpostavimo da želimo znati sve godine izdavanja za kategoriju 8. filma. Koristili bismo sljedeću skriptu za postizanje naših rezultata.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Izvršavanje gornje skripte u MySQL radnom stolu protiv Myflixdb daje nam sljedeće rezultate prikazane u nastavku.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
Napominjemo da je klauzula GROUP BY utjecala samo na filmove s ID-om kategorije 8.
Sažetak
- Klauzula GROUP BY koristi se za grupiranje redaka s istim vrijednostima.
- Klauzula GROUP BY koristi se zajedno s SQL SELECT izrazom.
- Izraz SELECT koji se koristi u klauzuli GROUP BY može se koristiti samo sadrži nazive stupaca, agregatne funkcije, konstante i izraze.
- Klauzula o SQL-u koristi se za ograničavanje rezultata koje vraća klauzula GROUP BY.
- Klauzula MYSQL GROUP BY koristi se za prikupljanje podataka iz više zapisa i vraćenih zapisa postavljenih jednim ili više stupaca.