SQL GROUP BY και HAVING ρήτρα με παραδείγματα

Τι είναι το SQL Group by Clause;

Ο όρος GROUP BY είναι μια εντολή SQL που χρησιμοποιείται ομαδοποιήστε σειρές που έχουν τις ίδιες τιμές. Ο όρος GROUP BY χρησιμοποιείται στην πρόταση SELECT. Προαιρετικά χρησιμοποιείται σε συνδυασμό με συναρτήσεις συγκεντρωτικών για την παραγωγή συνοπτικών αναφορών από τη βάση δεδομένων.

Αυτό κάνει, συνοψίζοντας δεδομένα από τη βάση δεδομένων.

Τα ερωτήματα που περιέχουν τον όρο GROUP BY ονομάζονται ομαδοποιημένα ερωτήματα και επιστρέφουν μόνο μία γραμμή για κάθε ομαδοποιημένο στοιχείο.

SQL GROUP BY Syntax

Τώρα που ξέρουμε τι είναι ο όρος SQL GROUP BY, ας δούμε τη σύνταξη για μια βασική ομάδα ανά ερώτημα.

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

ΕΔΩ

  • Το "SELECT statements..." είναι το τυπικό ερώτημα εντολής SQL SELECT.
  • "GROUP BY στήλη_όνομα1” είναι η ρήτρα που εκτελεί την ομαδοποίηση με βάση τη στήλη_όνομα1.
  • Το "[,column_name2,…]" είναι προαιρετικό. αντιπροσωπεύει άλλα ονόματα στηλών όταν η ομαδοποίηση γίνεται σε περισσότερες από μία στήλες.
  • Το "[HAVING condition]" είναι προαιρετικό. χρησιμοποιείται για τον περιορισμό των σειρών που επηρεάζονται από τον όρο GROUP BY. Είναι παρόμοιο με το ΟΤΙ ρήτρα.

Ομαδοποίηση με χρήση α Ενιαία στήλη

Για να κατανοήσουμε την επίδραση της ρήτρας SQL Group By, ας εκτελέσουμε ένα απλό ερώτημα που επιστρέφει όλες τις καταχωρήσεις φύλου από τον πίνακα μελών.

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

Ας υποθέσουμε ότι θέλουμε να λάβουμε τις μοναδικές αξίες για τα φύλα. Μπορούμε να χρησιμοποιήσουμε το ακόλουθο ερώτημα -

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

Εκτέλεση του παραπάνω σεναρίου στο MySQL πάγκος εργασίας ενάντια στο Myflixdb μας δίνει τα ακόλουθα αποτελέσματα.

gender
Female
Male

Σημειώστε ότι έχουν επιστραφεί μόνο δύο αποτελέσματα. Αυτό συμβαίνει επειδή έχουμε μόνο δύο τύπους φύλου Άνδρας και Θηλυκός. Η ρήτρα GROUP BY στην SQL ομαδοποίησε όλα τα μέλη "Άρσεν" και επέστρεψε μόνο μία γραμμή για αυτήν. Το ίδιο έκανε και με τα «Γυναίκα» μέλη.

Ομαδοποίηση χρησιμοποιώντας πολλαπλές στήλες

Ας υποθέσουμε ότι θέλουμε να λάβουμε μια λίστα με την κατηγορία_αναγνωριστικό ταινιών και τα αντίστοιχα έτη στα οποία κυκλοφόρησαν.

Ας παρατηρήσουμε την έξοδο αυτού του απλού ερωτήματος

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

Το παραπάνω αποτέλεσμα έχει πολλά διπλότυπα.

Ας εκτελέσουμε το ίδιο ερώτημα χρησιμοποιώντας group by στο SQL –

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

Εκτέλεση του παραπάνω σεναρίου στο MySQL Ο πάγκος εργασίας έναντι του myflixdb μας δίνει τα ακόλουθα αποτελέσματα που φαίνονται παρακάτω.

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

Η ρήτρα GROUP BY λειτουργεί τόσο στο αναγνωριστικό κατηγορίας όσο και στο έτος που κυκλοφόρησε για αναγνώριση μοναδικός σειρές στο παραπάνω παράδειγμά μας.

Εάν το αναγνωριστικό κατηγορίας είναι το ίδιο αλλά το έτος που κυκλοφόρησε είναι διαφορετικό, τότε μια σειρά αντιμετωπίζεται ως μοναδική. Εάν το αναγνωριστικό κατηγορίας και το έτος που κυκλοφόρησε είναι το ίδιο για περισσότερες από μία σειρές, τότε θεωρείται διπλότυπο και μόνο μία σειρά φαίνεται.

Ομαδοποίηση και αθροιστικές συναρτήσεις

Ας υποθέσουμε ότι θέλουμε τον συνολικό αριθμό ανδρών και θηλυκών στη βάση δεδομένων μας. Μπορούμε να χρησιμοποιήσουμε το ακόλουθο σενάριο που φαίνεται παρακάτω για να το κάνουμε αυτό.

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

Εκτέλεση του παραπάνω σεναρίου στο MySQL Ο πάγκος εργασίας έναντι του myflixdb μας δίνει τα ακόλουθα αποτελέσματα.

gender COUNT('membership_number')
Female 3
Male 5

Τα αποτελέσματα που εμφανίζονται παρακάτω ομαδοποιούνται με κάθε μοναδική τιμή φύλου που δημοσιεύεται και ο αριθμός των ομαδοποιημένων σειρών μετράται χρησιμοποιώντας τη συνάρτηση συγκεντρωτικών COUNT.

Περιορισμός αποτελεσμάτων ερωτήματος χρησιμοποιώντας το HAVING ρήτρα

Δεν είναι πάντα ότι θέλουμε να κάνουμε ομαδοποιήσεις σε όλα τα δεδομένα σε έναν δεδομένο πίνακα. Θα υπάρξουν στιγμές που θα θέλουμε να περιορίσουμε τα αποτελέσματά μας σε συγκεκριμένα δεδομένα. Σε τέτοιες περιπτώσεις, μπορούμε να χρησιμοποιήσουμε την ρήτρα HAVING

Ας υποθέσουμε ότι θέλουμε να γνωρίζουμε όλα τα χρόνια κυκλοφορίας για την κατηγορία ταινίας id 8. Θα χρησιμοποιούσαμε το παρακάτω σενάριο για να επιτύχουμε τα αποτελέσματά μας.

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

Εκτέλεση του παραπάνω σεναρίου στο MySQL Ο πάγκος εργασίας έναντι του Myflixdb μας δίνει τα ακόλουθα αποτελέσματα που φαίνονται παρακάτω.

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

Σημειώστε ότι μόνο οι ταινίες με κατηγορία id 8 έχουν επηρεαστεί από την ρήτρα GROUP BY.

Σύνοψη

  • Η ρήτρα GROUP BY SQL χρησιμοποιείται για την ομαδοποίηση σειρών με τις ίδιες τιμές.
  • Η ρήτρα GROUP BY χρησιμοποιείται μαζί με το Δήλωση SQL SELECT.
  • Η πρόταση SELECT που χρησιμοποιείται στον όρο GROUP BY μπορεί να χρησιμοποιηθεί και περιέχει μόνο ονόματα στηλών, συναρτήσεις συγκεντρωτικών στοιχείων, σταθερές και εκφράσεις.
  • Το SQL Having Clause χρησιμοποιείται για τον περιορισμό των αποτελεσμάτων που επιστρέφονται από τον όρο GROUP BY.
  • Η ρήτρα MYSQL GROUP BY χρησιμοποιείται για τη συλλογή δεδομένων από πολλαπλές εγγραφές και επιστρεφόμενη εγγραφή που ορίζεται από μία ή περισσότερες στήλες.