Όλα όσα πρέπει να γνωρίζετε για τη δήλωση SQL GROUP BY

Όλα όσα πρέπει να γνωρίζετε για τη δήλωση SQL GROUP BY

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





Η ομαδοποίηση σας επιτρέπει να εξαγάγετε συνοπτικές πληροφορίες από μια βάση δεδομένων. Σας επιτρέπει να συνδυάσετε αποτελέσματα για να δημιουργήσετε χρήσιμα στατιστικά δεδομένα. Η ομαδοποίηση σας εξοικονομεί από την εγγραφή κώδικα για συνηθισμένες περιπτώσεις, όπως ο μέσος όρος λιστών αριθμών. Και μπορεί να κάνει πιο αποτελεσματικά συστήματα.





Τι κάνει το GROUP BY Clause;

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





πώς να πείτε αν κάποιος σας αποκλείει στο snapchat

Το παρακάτω είναι μια πολύ απλή βάση δεδομένων με δύο πίνακες που αντιπροσωπεύουν δίσκους δίσκων. Μπορείτε να δημιουργήσετε μια τέτοια βάση δεδομένων από γράφοντας ένα βασικό σχήμα για το σύστημα βάσης δεδομένων που έχετε επιλέξει. ο άλμπουμ Ο πίνακας έχει εννέα σειρές με κύριο κλειδί ταυτότητα στήλη και στήλες για όνομα, καλλιτέχνη, έτος κυκλοφορίας και πωλήσεις:

+----+---------------------------+-----------+--------------+-------+
| id | name | artist_id | release_year | sales |
+----+---------------------------+-----------+--------------+-------+
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | The Dark Side of the Moon | 2 | 1973 | 24 |
| 3 | Rumours | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Animals | 2 | 1977 | 6 |
| 6 | Goodbye Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Bat Out of Hell | 7 | 1977 | 28 |
+----+---------------------------+-----------+--------------+-------+

ο καλλιτέχνες ο πίνακας είναι ακόμα πιο απλός. Έχει επτά σειρές με στήλες αναγνωριστικού και ονόματος:



+----+---------------+
| id | name |
+----+---------------+
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Meat Loaf |
+----+---------------+

Μπορείτε να κατανοήσετε διάφορες πτυχές του GROUP BY με ένα απλό σύνολο δεδομένων όπως αυτό. Φυσικά, ένα σύνολο δεδομένων πραγματικής ζωής θα έχει πολλές, πολλές περισσότερες σειρές, αλλά οι αρχές παραμένουν οι ίδιες.

Ομαδοποίηση κατά μία στήλη

Ας υποθέσουμε ότι θέλουμε να μάθουμε πόσα άλμπουμ έχουμε για κάθε καλλιτέχνη. Ξεκινήστε με ένα τυπικό ΕΠΙΛΕΓΩ ερώτημα για λήψη της στήλης artist_id:





SELECT artist_id FROM albums

Αυτό επιστρέφει και τις εννέα σειρές, όπως αναμενόταν:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
+-----------+

Για να ομαδοποιήσετε αυτά τα αποτελέσματα από τον καλλιτέχνη, προσθέστε τη φράση GROUP BY artist_id :





SELECT artist_id FROM albums GROUP BY artist_id

Το οποίο δίνει τα ακόλουθα αποτελέσματα:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+-----------+

Υπάρχουν επτά σειρές στο σύνολο αποτελεσμάτων, μειωμένες από τις συνολικές εννέα στο άλμπουμ τραπέζι. Το καθένα μοναδικό artist_id έχει μία μόνο σειρά. Τέλος, για να λάβετε τις πραγματικές μετρήσεις, προσθέστε ΜΕΤΡΩ(*) στις επιλεγμένες στήλες:

SELECT artist_id, COUNT(*)
FROM albums
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+-----------+----------+

Τα αποτελέσματα ομαδοποιούν δύο ζεύγη σειρών για τους καλλιτέχνες με αναγνωριστικά 2 και 6 Το Το καθένα έχει δύο άλμπουμ στη βάση δεδομένων μας.

Σχετίζεται με: Το Essential SQL Commands Cheat Sheet για αρχάριους

Πώς να αποκτήσετε πρόσβαση σε ομαδοποιημένα δεδομένα με μια συνολική συνάρτηση

Μπορεί να έχετε χρησιμοποιήσει το ΜΕΤΡΩ λειτουργία πριν, ιδιαίτερα στο ΜΕΤΡΩ(*) μορφή όπως φαίνεται παραπάνω. Παίρνει τον αριθμό των αποτελεσμάτων σε ένα σύνολο. Μπορείτε να το χρησιμοποιήσετε για να λάβετε τον συνολικό αριθμό εγγραφών σε έναν πίνακα:

SELECT COUNT(*) FROM albums
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+

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

Αντί να μετράμε μόνο τον αριθμό των γραμμών, μπορούμε να εφαρμόσουμε μια συνάρτηση συνάθροισης σε ομαδοποιημένες τιμές:

SELECT artist_id, SUM(sales)
FROM albums
GROUP BY artist_id
+-----------+------------+
| artist_id | SUM(sales) |
+-----------+------------+
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+-----------+------------+

Οι συνολικές πωλήσεις που εμφανίζονται παραπάνω για τους καλλιτέχνες 2 και 6 είναι οι πωλήσεις πολλαπλών άλμπουμ τους σε συνδυασμό:

SELECT artist_id, sales
FROM albums
WHERE artist_id IN (2, 6)
+-----------+-------+
| artist_id | sales |
+-----------+-------+
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+-----------+-------+

Ομαδοποίηση κατά πολλαπλές στήλες

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

SELECT release_year, sales, count(*)
FROM albums
GROUP BY release_year, sales

Αυτό συνήθως παράγει περισσότερα αποτελέσματα από την ομαδοποίηση κατά μία στήλη:

+--------------+-------+----------+
| release_year | sales | count(*) |
+--------------+-------+----------+
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
+--------------+-------+----------+

Σημειώστε ότι, στο μικρό μας παράδειγμα, μόνο δύο άλμπουμ έχουν τον ίδιο χρόνο κυκλοφορίας και τον αριθμό πωλήσεων (28 το 1977).

Χρήσιμες συναρτήσεις συναθροίσεων

Εκτός από COUNT, αρκετές συναρτήσεις λειτουργούν καλά με το GROUP. Κάθε συνάρτηση επιστρέφει μια τιμή με βάση τις εγγραφές που ανήκουν σε κάθε ομάδα αποτελεσμάτων.

  • COUNT () επιστρέφει τον συνολικό αριθμό εγγραφών που ταιριάζουν.
  • SUM () επιστρέφει το σύνολο όλων των τιμών στη δεδομένη στήλη που προστίθεται.
  • MIN () επιστρέφει τη μικρότερη τιμή σε μια δεδομένη στήλη.
  • MAX () επιστρέφει τη μεγαλύτερη τιμή σε μια δεδομένη στήλη.
  • Το AVG () επιστρέφει τον μέσο όρο. Είναι το ισοδύναμο του SUM () / COUNT ().

Μπορείτε επίσης να χρησιμοποιήσετε αυτές τις λειτουργίες χωρίς ρήτρα ΟΜΑΔΑΣ:

διαφημίσεις στο facebook που εμφανίζονται στο τηλέφωνο
SELECT AVG(sales) FROM albums
+------------+
| AVG(sales) |
+------------+
| 19.1111 |
+------------+

Χρήση του GROUP BY With WHERE Clause

Ακριβώς όπως με μια κανονική επιλογή, μπορείτε ακόμα να χρησιμοποιήσετε WHERE για να φιλτράρετε το σύνολο αποτελεσμάτων:

SELECT artist_id, COUNT(*)
FROM albums
WHERE release_year > 1990
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 4 | 1 |
| 6 | 2 |
+-----------+----------+

Τώρα έχετε μόνο εκείνα τα άλμπουμ που κυκλοφόρησαν μετά το 1990, ομαδοποιημένα κατά καλλιτέχνη. Μπορείτε επίσης να χρησιμοποιήσετε μια ένωση με τη ρήτρα WHERE, ανεξάρτητα από το GROUP BY:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
+---------+--------+
| name | albums |
+---------+--------+
| Nirvana | 1 |
| Adele | 2 |
+---------+--------+

Σημειώστε, ωστόσο, ότι εάν προσπαθήσετε να φιλτράρετε με βάση μια συγκεντρωτική στήλη:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND albums > 2
GROUP BY artist_id;

Θα λάβετε ένα σφάλμα:

ERROR 1054 (42S22): Unknown column 'albums' in 'where clause'

Οι στήλες που βασίζονται σε συγκεντρωτικά δεδομένα δεν είναι διαθέσιμες στη ρήτρα WHERE.

Χρησιμοποιώντας τη ρήτρα HAVING

Λοιπόν, πώς φιλτράρετε το σύνολο αποτελεσμάτων μετά την πραγματοποίηση μιας ομαδοποίησης; ο ΕΧΟΝΤΑΣ η ρήτρα αφορά αυτήν την ανάγκη:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
GROUP BY artist_id
HAVING albums > 1;

Σημειώστε ότι η ρήτρα HAVING έρχεται μετά το GROUP BY. Διαφορετικά, είναι ουσιαστικά μια απλή αντικατάσταση του WHERE με το HAVING. Τα αποτελέσματα είναι:

+------------+--------+
| name | albums |
+------------+--------+
| Pink Floyd | 2 |
| Adele | 2 |
+------------+--------+

Μπορείτε ακόμα να χρησιμοποιήσετε μια συνθήκη WHERE για να φιλτράρετε τα αποτελέσματα πριν από την ομαδοποίηση. Θα συνεργαστεί με μια ρήτρα HAVING για φιλτράρισμα μετά την ομαδοποίηση:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
HAVING albums > 1;

Μόνο ένας καλλιτέχνης στη βάση δεδομένων μας κυκλοφόρησε περισσότερα από ένα άλμπουμ μετά το 1990:

+-------+--------+
| name | albums |
+-------+--------+
| Adele | 2 |
+-------+--------+

Συνδυασμός αποτελεσμάτων με GROUP BY

Η δήλωση GROUP BY είναι ένα απίστευτα χρήσιμο μέρος της γλώσσας SQL. Μπορεί να παρέχει συνοπτικές πληροφορίες δεδομένων, για μια σελίδα περιεχομένου, για παράδειγμα. Είναι μια εξαιρετική εναλλακτική λύση για τη λήψη μεγάλων ποσοτήτων δεδομένων. Η βάση δεδομένων χειρίζεται καλά αυτόν τον επιπλέον φόρτο εργασίας, καθώς ο ίδιος ο σχεδιασμός της την καθιστά ιδανική για τη δουλειά.

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

Μερίδιο Μερίδιο Τιτίβισμα ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ Πώς να κάνετε ερώτηση πολλαπλών πινάκων βάσεων δεδομένων ταυτόχρονα με συμμετοχές SQL

Μάθετε πώς να χρησιμοποιείτε τις συμμετοχές SQL για να βελτιστοποιήσετε τα ερωτήματα, να εξοικονομήσετε χρόνο και να αισθανθείτε σαν ένας χρήστης SQL power.

πώς να αλλάξετε το εικονίδιο αρχείου Windows 10
Διαβάστε Επόμενο Σχετικά θέματα
  • Προγραμματισμός
  • SQL
Σχετικά με τον Συγγραφέα Μπόμπι Τζακ(Δημοσιεύθηκαν 58 άρθρα)

Ο Bobby είναι λάτρης της τεχνολογίας που εργάστηκε ως προγραμματιστής λογισμικού για περισσότερες από δύο δεκαετίες. Είναι παθιασμένος με το gaming, εργάζεται ως Reviews Editor στο Switch Player Magazine και είναι βυθισμένος σε όλες τις πτυχές της διαδικτυακής δημοσίευσης και ανάπτυξης ιστού.

Περισσότερα από τον Bobby Jack

Εγγραφείτε στο newsletter μας

Εγγραφείτε στο ενημερωτικό μας δελτίο για τεχνικές συμβουλές, κριτικές, δωρεάν ebooks και αποκλειστικές προσφορές!

Κάντε κλικ εδώ για εγγραφή