SQL GROUP BY i HAVING klauzula s primjerima
Što je klauzula SQL Group by?
Klauzula GROUP BY je SQL naredba koja se koristi za grupirati retke koji imaju iste vrijednosti. Klauzula GROUP BY koristi se u naredbi SELECT. Po izboru se koristi u kombinaciji s agregatnim funkcijama za izradu sažetih izvješća iz baze podataka.
To je ono što radi, sažimanje podataka iz baze podataka.
Upiti koji sadrže klauzulu GROUP BY nazivaju se grupirani upiti i vraćaju samo jedan red za svaku grupiranu stavku.
SQL GROUP BY Sintaksa
Sada kada znamo što je klauzula SQL GROUP BY, pogledajmo sintaksu za osnovnu grupu po upitu.
SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];
OVDJE
- “SELECT naredbe…” je standardni SQL upit naredbe SELECT.
- "GROUP BY naziv_stupca1” je klauzula koja izvodi grupiranje na temelju column_name1.
- “[,column_name2,…]” nije obavezan; predstavlja druga imena stupaca kada se grupiranje vrši na više od jednog stupca.
- “[IMA uvjet]” nije obavezan; koristi se za ograničavanje redaka na koje utječe klauzula GROUP BY. Slično je WHERE klauzula.
Grupiranje pomoću a Jedan stupac
Kako bismo lakše razumjeli učinak klauzule SQL Group By, izvršimo jednostavan upit koji vraća sve unose roda 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 koristiti sljedeći upit –
SELECT `gender` FROM `members` GROUP BY `gender`;
Izvršavanje gornje skripte u MySQL radna tezga u odnosu na Myflixdb daje nam sljedeće rezultate.
gender |
---|
Female |
Male |
Napominjemo da su vraćena samo dva rezultata. To je zato što imamo samo dvije vrste spolova, muški i ženski. Klauzula GROUP BY u SQL-u grupirala je sve "muške" članove zajedno i vratila samo jedan red za njih. Isto je učinjeno i sa “ženskim” članicama.
Grupiranje pomoću više stupaca
Pretpostavimo da želimo dobiti popis kategorija_id filmova i odgovarajućih godina u kojima su objavljeni.
Promotrimo 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 workbench u odnosu na 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 za identifikaciju jedinstveni redaka u našem gornjem primjeru.
Ako je ID kategorije isti, ali je godina izdanja drugačija, tada se red tretira kao jedinstven. Ako su ID kategorije i godina izdanja isti za više od jednog retka, tada se to smatra duplikatom i samo jednim redom je prikazano.
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šavanje gornje skripte u MySQL workbench u odnosu na myflixdb daje nam sljedeće rezultate.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Rezultati prikazani u nastavku grupirani su prema svakoj objavljenoj jedinstvenoj vrijednosti spola, a broj grupiranih redaka broji se pomoću agregatne funkcije COUNT.
Ograničavanje rezultata upita pomoću IMAJUĆI klauzula
Ne želimo uvijek grupirati sve podatke u danoj tablici. Bit će trenutaka kada ćemo željeti ograničiti svoje rezultate na određene kriterije. U takvim slučajevima možemo koristiti klauzulu HAVING
Pretpostavimo da želimo znati sve godine izdanja za kategoriju filma id 8. Koristili bismo sljedeću skriptu da postignemo naše rezultate.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Izvršavanje gornje skripte u MySQL workbench u odnosu na 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 samo filmovi s kategorijom id 8 podliježu klauzuli GROUP BY.
rezime
- SQL klauzula GROUP BY koristi se za grupiranje redaka s istim vrijednostima.
- Klauzula GROUP BY koristi se zajedno s SQL SELECT naredba.
- Izjava SELECT koja se koristi u klauzuli GROUP BY može se koristiti samo za nazive stupaca, agregatne funkcije, konstante i izraze.
- SQL Having klauzula koristi se za ograničavanje rezultata koje vraća klauzula GROUP BY.
- MYSQL GROUP BY klauzula koristi se za prikupljanje podataka iz višestrukih zapisa i vraćenih zapisa postavljenih jednim ili više stupaca.