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.