MySQL GROUP BY i HAVING klauzula s primjerima

โšก Pametni saลพetak

SQL klauzule GROUP BY i HAVING pretvaraju detaljne retke u saลพeta izvjeลกฤ‡a. GROUP BY saลพima retke koji dijele iste vrijednosti u jedan redak po grupi, dok HAVING filtrira te grupe nakon ลกto su primijenjene agregacijske funkcije poput COUNT.

  • ๐Ÿ“Š Osnovna svrha: GROUP BY grupira retke s identiฤnim vrijednostima i vraฤ‡a jedan redak za svaku grupiranu stavku.
  • ๐Ÿงฉ Grupa s jednim stupcemping: Grouping Tablica ฤlanova prema spolu saลพima devet redaka u dva, jedan za ลพenski i jedan za muลกki.
  • ๐Ÿ”— Viลกestruka grupa stupacaping: Grouping u dva stupca redak se tretira kao jedinstven kada se bilo koja vrijednost razlikuje, tako da se saลพimaju samo toฤni duplikati.
  • ๐Ÿงฎ Agregirano sparivanje: BROJ, ZBROJ, AVG, MIN i MAX izraฤunavaju jednu vrijednost po grupi, ลกto daje saลพetak izvjeลกฤ‡a.
  • ๐Ÿšฆ IMATI naspram GDJE: WHERE filtrira retke prije grupeping, HAVING naknadno filtrira grupe i samo HAVING prihvaฤ‡a agregirane rezultate.
  • โš ๏ธ Oprez u strogom naฤinu rada: Pod ONLY_FULL_GROUP_BY, svaki odabrani stupac mora biti grupiran ili omotan u agregacijsku funkciju.

SQL GROUP BY i HAVING klauzula

ล to je SQL GROUP BY klauzula?

Klauzula GROUP BY je SQL naredba koja se koristi za grupirati retke koji imaju iste vrijednostiNapisuje se unutar SELECT naredbe i obiฤno se koristi zajedno s agregacijskim funkcijama za izradu saลพetih izvjeลกฤ‡a iz baze podataka.

To je ono ลกto radi: to saลพima podatke pohranjenih u bazi podataka. Upiti koji sadrลพe klauzulu GROUP BY nazivaju se grupirani upiti i vraฤ‡aju jedan redak za svaku grupiranu stavku.

SQL GROUP BY Sintaksa

Sada kada je svrha klauzule jasna, pogledajte sintaksu osnovnog grupiranog upita.

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

OVDJE

  • "SELECT naredbeโ€ฆ"je standard" SQL SELECT upit naredbe.
  • "GROUP BY naziv_stupca1" je klauzula koja izvrลกava grupuping na temelju naziva_stupca1.
  • "[, naziv_stupca2, โ€ฆ]โ€ je opcionalno i predstavlja nazive drugih stupaca kada je grupaping se vrลกi na viลกe od jednog stupca.
  • "[STANJE IMA]โ€ je opcionalan i koristi se za ograniฤavanje redaka na koje utjeฤe klauzula GROUP BY. Sliฤan je WHERE klauzula, osim ลกto se nanosi nakon gruping.

Grouping Koriลกtenje jednog stupca

Najbrลพi naฤin da se vidi uฤinak SQL klauzule GROUP BY jest usporedba negrupiranog upita s grupiranim. Poฤnite s jednostavnim upitom koji vraฤ‡a svaki unos spola u tablici ฤlanova.

SELECT `gender` FROM `members`;
rod
ลพenski
ลพenski
Muลกki
ลพenski
Muลกki
Muลกki
Muลกki
Muลกki
Muลกki

Vraฤ‡a se devet redaka i svaka vrijednost se ponavlja. Pretpostavimo da umjesto toga ลพelimo jedinstvene vrijednosti za spol. Upit u nastavku dodaje klauzulu GROUP BY.

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

Izvrลกavanje gornje skripte u MySQL Radna tezga u odnosu na myflixdb daje nam sljedeฤ‡e rezultate.

rod
ลพenski
Muลกki

Imajte na umu da su vraฤ‡ena samo dva retka jer tablica sadrลพi samo dva tipa spola. Klauzula GROUP BY grupirala je sve ฤlanove "Muลกki" i vratila jedan redak za njih, a isto je uฤinila i sa ฤlanovima "ลฝenski".

Grouping Koriลกtenje viลกe stupaca

Grouping na jednom stupcu je ฤesto pregrubo za pravo izvjeลกฤ‡e. GROUP BY prihvaฤ‡a popis stupaca odvojen zarezima, a kombinacija njihovih vrijednosti definira svaku grupu.

Pretpostavimo da ลพelimo popis vrijednosti category_id filma i odgovarajuฤ‡e godine u kojima su filmovi objavljeni. Prvo promotrite izlaz ovog jednostavnog upita.

SELECT `category_id`, `year_released` FROM `movies`;
kategorija_id godina_izdana
1 2011
2 2008
NULL 2008
NULL 2010
8 2007
6 2007
6 2007
8 2005
NULL 2012
7 1920
8 NULL
8 1920

Istaknuti retci pokazuju da rezultat sadrลพi duplikate. Izvrลกavanje istog upita s GROUP BY ih uklanja.

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.

kategorija_id godina_izdana
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 category_id i na year_released kako bi identificirala jedinstveni retci. Dva duplicirana retka za kategoriju 6 u 2007. godini su se spojila u jedan.

Pravilo palca: Ako je ID kategorije isti, ali je godina izdavanja drugaฤija, redak se tretira kao jedinstven. Ako su ID kategorije i godina izdavanja isti za viลกe redaka, retci su duplikati i prikazuje se samo jedan od njih.

Grouping i agregacijske funkcije

Uklanjanje duplikata je korisno, ali prava moฤ‡ grupeping pojavljuje se kada je uparen s agregatne funkcijeAgregacijska funkcija izraฤunava jednu vrijednost za svaku grupu: COUNT broji retke, SUM zbraja vrijednosti i AVG, MIN i MAX opisuju rasprลกenost.

Pretpostavimo da ลพelimo ukupan broj muลกkih i ลพenskih ฤlanova u bazi podataka. Skript u nastavku to radi.

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

Izvrลกavanje gornje skripte u MySQL Workbench na myflixdb daje nam sljedeฤ‡e rezultate.

rod COUNT(`broj_ฤlanstva`)
ลพenski 3
Muลกki 6

Redci su grupirani prema svakoj jedinstvenoj vrijednosti spola, a broj redaka unutar svake grupe broji se pomoฤ‡u agregacijske funkcije COUNT. Devet zapisa ฤlanova saลพima se u dva saลพeta retka.

Ograniฤavanje rezultata upita pomoฤ‡u klauzule HAVING

Groupingnisu uvijek poลพeljni za svaki redak u tablici. Ponekad izvjeลกฤ‡e mora biti ograniฤeno na zadani kriterij, a to je zadatak klauzule HAVING.

Pretpostavimo da ลพelimo znati sve godine izlaska za filmsku kategoriju s ID-om 8. Skript u nastavku postiลพe taj rezultat.

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.

film_id naslov direktor godina_izdana kategorija_id
9 Honey moonERS John Schultz 2005 8
5 Tatine djevojฤice NULL 2007 8

Samo filmovi s ID-om kategorije 8 zadrลพani su uvjetom HAVING.

Upozorenje: MySQL Verzija 5.7 i novije omoguฤ‡uju naฤin rada ONLY_FULL_GROUP_BY prema zadanim postavkama, a u tom naฤinu rada SELECT * s klauzulom GROUP BY se odbija jer movie_id, title i director nisu ni grupirani ni agregirani. U produkciji, grupirane stupce eksplicitno imenujte, na primjer ODABERI category_id, year_leased FROM movies GROUP BY category_id, year_leased HAVING category_id = 8;

WHERE vs HAVING vs GROUP BY vs ORDER BY

Poฤetnici ฤesto mijeลกaju ove ฤetiri klauzule jer sve one oblikuju skup rezultata. Razlika leลพi u kada MySQL primjenjuje ih: WHERE se izvrลกava prije grupiranja redaka, HAVING se izvrลกava nakon toga, a ORDER BY se izvrลกava posljednji od svih.

Klauzula Ono ลกto se takoฤ‘er Kada se pokrene Prihvaฤ‡a agregacijske funkcije
GDJE Filtrira pojedinaฤne retke prije bilo koje grupeping. Prije GROUP BY Ne
GROUP BY Saลพima retke koji dijele iste vrijednosti u jedan redak po grupi. Nakon GDJE Nije primjenjivo
IMAJUฤ†I Filtrira grupe koje je proizvela naredba GROUP BY. Nakon GRUPIRA PO Da, na primjer HAVING COUNT(*) > 2
NARUฤŒITE PO Sortira retke koji preลพivljavaju prethodne reฤenice. Prezime Da, agregirani alias se moลพe sortirati

Praktiฤna posljedica je posljedica performansi. Filtriranje s WHERE uklanja retke prije grupeping rad poฤinje, pa uvjet koji ne ovisi o agregiranom rezultatu pripada u WHERE, a ne u HAVING.

Pitanja i odgovori

Da. GROUP BY samostalno vraฤ‡a jedan redak po jedinstvenoj vrijednosti, ลกto uklanja duplikate na gotovo isti naฤin kao i SELECT DISTINCT. Agregacijske funkcije su potrebne samo kada svaka grupa treba izraฤunatu brojku.

Greลกka se pojavljuje kada odabrani stupac nije naveden u GROUP BY niti je omotan agregacijskom funkcijom. MySQL ne moลพe odluฤiti koju vrijednost tog stupca prikazati za grupu, pa odbija upit.

COUNT(*) broji svaki redak u grupi. COUNT(stupac) broji samo retke u kojima taj stupac nije NULL, tako da se dvije brojke razlikuju kad god stupac sadrลพi nedostajuฤ‡e vrijednosti.

Da. AI asistenti unutar alata kao ลกto su MySQL Radna tezga prevedite zahtjev poput โ€žฤlanova po spoluโ€œ u grupirani upit. Provjerite grupuping stupce sami, jer pogreลกna grupaping daje ukupne iznose koji izgledaju uvjerljivo, ali su netoฤni.

ฤŒesto, da. Pomoฤ‡nici za upite umjetne inteligencije oznaฤavaju klasiฤne uzroke kao ลกto je PRIDRUลฝITE koji mnoลพi retke prije grupepingili filter postavljen u HAVING umjesto WHERE. Konaฤna procjena i dalje pripada osobi koja poznaje podatke.

Saลพmite ovu objavu uz: