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

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

Τι κάνει ο όρος GROUP BY;

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

Το παρακάτω είναι μια πολύ απλή βάση δεδομένων με δύο πίνακες που αντιπροσωπεύουν δίσκους άλμπουμ. Μπορείτε να δημιουργήσετε μια τέτοια βάση δεδομένων έως

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

++++++
| αναγνωριστικό | όνομα | καλλιτέχνης_id | κυκλοφορία_έτος | πωλήσεις |
++++++
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | Η σκοτεινή πλευρά της Σελήνης | 2 | 1973 | 24 |
| 3 | Φήμες | 3 | 1977 | 28 |
| 4 | Δεν πειράζει | 4 | 1991 | 17 |
| 5 | Ζώα | 2 | 1977 | 6 |
| 6 | Αντίο Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Bat Out of Hell | 7 | 1977 | 28 |
++++++

ο καλλιτέχνες το τραπέζι είναι ακόμα πιο απλό. Έχει επτά σειρές με στήλες ταυτότητας και ονόματος:

+++
| αναγνωριστικό | όνομα |
+++
| 1 | Οι Beatles |
| 2 | Ροζ Floyd |
| 3 | Fleetwood Mac |
| 4 | Νιρβάνα |
| 5 | Έλτον Τζον |
| 6 | Adele |
| 7 | Φραντζόλα κρέατος |
+++

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

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

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

SELECT artist_id ΑΠΟ άλμπουμ

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

++
| καλλιτέχνης_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
++

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

SELECT artist_id ΑΠΟ άλμπουμ GROUP BY artist_id

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

++
| καλλιτέχνης_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
++

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

SELECT καλλιτέχνη_id, COUNT (*)
ΑΠΟ άλμπουμ
GROUP BY καλλιτέχνης_id
+++
| καλλιτέχνης_id | COUNT (*) |
+++
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+++

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

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

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

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

ΕΠΙΛΕΞΤΕ COUNT (*) ΑΠΟ άλμπουμ
++
| COUNT (*) |
++
| 9 |
++

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

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

SELECT artist_id, SUM (πωλήσεις)
ΑΠΟ άλμπουμ
GROUP BY καλλιτέχνης_id
+++
| καλλιτέχνης_id | SUM (πωλήσεις) |
+++
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+++

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

SELECT καλλιτέχνης_id, πωλήσεις
ΑΠΟ άλμπουμ
ΠΟΥ καλλιτέχνης_id IN (2, 6)
+++
| καλλιτέχνης_id | πωλήσεις |
+++
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+++

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

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

SELECT Release_year, sales, count (*)
ΑΠΟ άλμπουμ
GROUP BY Release_year, πωλήσεις

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

++++
| κυκλοφορία_έτος | πωλήσεις | μέτρηση (*) |
++++
| 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 ().

Μπορείτε επίσης να χρησιμοποιήσετε αυτές τις συναρτήσεις χωρίς ρήτρα GROUP:

ΕΠΙΛΕΞΤΕ AVG (πωλήσεις) ΑΠΟ άλμπουμ
++
| AVG (πωλήσεις) |
++
| 19.1111 |
++

Χρήση του GROUP BY με ρήτρα WHERE

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

SELECT καλλιτέχνη_id, COUNT (*)
ΑΠΟ άλμπουμ
WHERE release_year> 1990
GROUP BY καλλιτέχνης_id
+++
| καλλιτέχνης_id | COUNT (*) |
+++
| 4 | 1 |
| 6 | 2 |
+++

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

SELECT r.name, COUNT (*) ως άλμπουμ
ΑΠΟ τα άλμπουμ l, καλλιτέχνες r
WHERE artist_id = r.id
ΚΑΙ κυκλοφορία_έτος> 1990
GROUP BY καλλιτέχνης_id
+++
| όνομα | άλμπουμ |
+++
| Νιρβάνα | 1 |
| Adele | 2 |
+++

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

SELECT r.name, COUNT (*) ως άλμπουμ
ΑΠΟ τα άλμπουμ l, καλλιτέχνες r
WHERE artist_id = r.id
ΚΑΙ άλμπουμ> 2
GROUP BY artist_id;

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

ΣΦΑΛΜΑ 1054 (42S22): Άγνωστη στήλη «άλμπουμ» στο «όπου ρήτρα»

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

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

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

SELECT r.name, COUNT (*) ως άλμπουμ
ΑΠΟ τα άλμπουμ l, καλλιτέχνες r
WHERE artist_id = r.id
GROUP BY καλλιτέχνης_id
ΕΧΟΥΝ άλμπουμ> 1;

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

+++
| όνομα | άλμπουμ |
+++
| Ροζ Floyd | 2 |
| Adele | 2 |
+++

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

SELECT r.name, COUNT (*) ως άλμπουμ
ΑΠΟ τα άλμπουμ l, καλλιτέχνες r
WHERE artist_id = r.id
ΚΑΙ κυκλοφορία_έτος> 1990
GROUP BY καλλιτέχνης_id
ΕΧΟΥΝ άλμπουμ> 1;

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

+++
| όνομα | άλμπουμ |
+++
| Adele | 2 |
+++

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

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

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

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

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

Σχετικά θέματα
  • Προγραμματισμός
  • SQL
Σχετικά με τον Συγγραφέα
Μπόμπι Τζακ (Δημοσιεύθηκαν 28 άρθρα)

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

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

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

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

Ένα ακόμη βήμα…!

Επιβεβαιώστε τη διεύθυνση email σας στο email που μόλις σας στείλαμε.

.