SQL GROUP BY en HAVING-clausule met voorbeelden

Inhoudsopgave:

Anonim

Wat is de SQL Group by-clausule?

De GROUP BY-component is een SQL-opdracht die wordt gebruikt om rijen met dezelfde waarden te groeperen . De GROUP BY-component wordt gebruikt in de SELECT-instructie. Optioneel wordt het gebruikt in combinatie met geaggregeerde functies om samenvattingsrapporten van de database te produceren.

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

De query's die de GROUP BY-component 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, laten we eens kijken naar de syntaxis voor een basisgroep op query.

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

HIER

  • "SELECT-instructies ..." is de standaard SQL SELECT-opdrachtquery.
  • "[, column_name2,…]" is optioneel; vertegenwoordigt andere kolomnamen wanneer de groepering op meer dan één kolom wordt uitgevoerd.
  • "[HAVING condition]" 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 een enkele kolom

Laten we, om het effect van de SQL Group By-clausule te helpen begrijpen, een eenvoudige query uitvoeren die alle geslachtsitems 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 krijgen. We kunnen een volgende vraag gebruiken -

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

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

 
gender
Female
Male

Merk op dat er slechts twee resultaten zijn geretourneerd. Dit komt omdat we slechts twee geslachtstypen hebben, Man en Vrouw. De GROUP BY-component in SQL groepeerde alle "Male" -leden samen en retourneerde er slechts één rij voor. Het deed hetzelfde met de "vrouwelijke" leden.

Groeperen met behulp van meerdere kolommen

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

Laten we eens kijken naar de uitvoer van deze eenvoudige vraag

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 heeft veel duplicaten.

Laten we dezelfde query uitvoeren met 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 de volgende resultaten die hieronder worden 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 vrijgegeven jaar om unieke rijen in ons bovenstaande voorbeeld te identificeren .

Als de categorie-id hetzelfde is maar het vrijgegeven jaar anders, dan wordt een rij als uniek behandeld. 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.

Functies groeperen en aggregeren

Stel dat we het totale aantal mannen en vrouwen in onze database willen hebben. We kunnen het volgende onderstaande script gebruiken 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 de volgende resultaten.

 
gender COUNT('membership_number')
Female 3
Male 5

De resultaten die hieronder worden weergegeven, zijn gegroepeerd op elke unieke geslachtswaarde die is gepost en het aantal gegroepeerde rijen wordt geteld met behulp van de geaggregeerde functie COUNT.

Queryresultaten beperken met behulp van de HAVING- clausule

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

Stel dat we alle jaren van uitgave van filmcategorie id 8 willen weten. We zouden het volgende script gebruiken 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 de volgende resultaten die hieronder worden weergegeven.

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

Let op: alleen films met categorie-ID 8 vallen onder onze GROUP BY-clausule.

Overzicht

  • De GROUP BY-clausule SQL wordt gebruikt om rijen met dezelfde waarden te groeperen.
  • De GROUP BY-clausule wordt samen met de SQL SELECT-instructie gebruikt.
  • De SELECT-instructie die in de GROUP BY-clausule wordt gebruikt, kan alleen worden gebruikt om kolomnamen, geaggregeerde functies, constanten en uitdrukkingen te bevatten.
  • SQL Having-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 een of meer kolommen.