SQL GROUP BY en HAVING-clausule met voorbeelden

Wat is de SQL-groep per clausule?

De GROUP BY-clausule is een SQL-opdracht die wordt gebruikt groepeer rijen die dezelfde waarden hebben. De GROUP BY-clausule wordt gebruikt in de SELECT-instructie. Optioneel wordt het gebruikt in combinatie met aggregatiefuncties om samenvattende rapporten uit de database te produceren.

Dat is wat het doet, gegevens samenvatten uit de databank.

De query's die de GROUP BY-clausule bevatten, worden gegroepeerde query's genoemd en retourneren slechts één rij voor elk gegroepeerd item.

SQL GROUP BY-syntaxis

Nu we weten wat de SQL GROUP BY-clausule is, gaan we kijken naar de syntaxis voor een eenvoudige group by query.

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

HIER

  • "SELECT-instructies..." is de standaard SQL SELECT-opdrachtquery.
  • "GROEP DOOR kolomnaam1” is de clausule die de groepering uitvoert op basis van kolomnaam1.
  • “[,kolomnaam2,…]” is optioneel; vertegenwoordigt andere kolomnamen wanneer de groepering op meer dan één kolom wordt uitgevoerd.
  • “[HAVING-voorwaarde]” is optioneel; het wordt gebruikt om de rijen te beperken die worden beïnvloed door de GROUP BY-clausule. Het is vergelijkbaar met de WHERE-clausule.

Groeperen met behulp van een Single Column

Om het effect van de SQL Group By-clausule te helpen begrijpen, gaan we een eenvoudige query uitvoeren die alle geslachtsgegevens uit de ledentabel retourneert.

SELECT `gender` FROM `members` ;
gender
Female
Female
Male
Female
Male
Male
Male
Male
Male

Stel dat we de unieke waarden voor geslachten willen achterhalen. We kunnen wel een follo gebruikenwing vraag -

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

Voer het bovenstaande script uit in MySQL-werkbank tegen de Myflixdb geeft ons de volgende informatiewing resultaten.

gender
Female
Male

Let op: er zijn slechts twee resultaten geretourneerd. Dit komt omdat we slechts twee geslachtstypen hebben, mannelijk en vrouwelijk. De GROUP BY-clausule in SQL groepeerde alle “mannelijke” leden samen en retourneerde er slechts één enkele rij voor. Hetzelfde gebeurde met de ‘vrouwelijke’ leden.

Groeperen met behulp van meerdere kolommen

Stel dat we een lijst willen krijgen met filmcategorie_id en de bijbehorende jaren waarin ze zijn uitgebracht.

Laten we de uitvoer van deze eenvoudige query bekijken

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

Het bovenstaande resultaat bevat veel duplicaten.

Laten we dezelfde query uitvoeren met behulp van group by in SQL –

SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;

Het uitvoeren van het bovenstaande script in MySQL-workbench tegen de myflixdb geeft ons het volgendewing resultaten hieronder weergegeven.

category_id year_released
NULL 2008
NULL 2010
NULL 2012
1 2011
2 2008
6 2007
7 1920
8 1920
8 2005
8 2007

De GROUP BY-clausule werkt op zowel de categorie-ID als het jaar dat ter identificatie is vrijgegeven unieke rijen in ons bovenstaande voorbeeld.

Als de categorie-ID hetzelfde is, maar het vrijgegeven jaar verschillend is, wordt een rij als uniek beschouwd. Als de categorie-ID en het vrijgegeven jaar hetzelfde zijn voor meer dan één rij, wordt deze beschouwd als een duplicaat en slechts één rij wordt getoond.

Groeperen en geaggregeerde functies

Stel dat we het totale aantal mannen en vrouwen in onze database willen hebben. We kunnen het volgende gebruikenwing het onderstaande script om dat te doen.

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

Het uitvoeren van het bovenstaande script in MySQL-workbench tegen de myflixdb geeft ons het volgendewing resultaten.

gender COUNT('membership_number')
Female 3
Male 5

De hieronder weergegeven resultaten zijn gegroepeerd op elke unieke geposte geslachtswaarde en het aantal gegroepeerde rijen wordt geteld met behulp van de aggregatiefunctie AANTAL.

Queryresultaten beperken met behulp van de HEBBEN clausule

Het is niet altijd zo dat we groeperingen willen uitvoeren op alle gegevens in een bepaalde tabel. Er zullen momenten zijn waarop we onze resultaten willen beperken tot bepaalde criteria. In dergelijke gevallen kunnen we de HAVING-clausule gebruiken

Stel dat we alle releasejaren willen weten voor filmcategorie id 8. We zouden de follo gebruikenwing script om onze resultaten te bereiken.

SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;

Het uitvoeren van het bovenstaande script in MySQL-workbench tegen de Myflixdb geeft ons het volgendewing resultaten hieronder weergegeven.

movie_id title director year_released category_id
9 Honey mooners John Schultz 2005 8
5 Daddy's Little Girls NULL 2007 8

Houd er rekening mee dat alleen films met categorie-id 8 onder onze GROUP BY-clausule vallen.

Samengevat

  • De GROUP BY-clausule SQL wordt gebruikt om rijen met dezelfde waarden te groeperen.
  • De GROUP BY-clausule wordt gebruikt in combinatie met de SQL SELECT-instructie.
  • De SELECT-instructie die in de GROUP BY-clausule wordt gebruikt, kan alleen kolomnamen, aggregatiefuncties, constanten en expressies bevatten.
  • SQL-clausule wordt gebruikt om de resultaten te beperken die worden geretourneerd door de GROUP BY-clausule.
  • MYSQL GROUP BY-clausule wordt gebruikt om gegevens te verzamelen uit meerdere records en geretourneerde records die zijn ingesteld op basis van een of meer kolommen.