MySQL Συναρτήσεις συνάθροισης: SUM, COUNT, AVG & ΜΕΓΙΣΤΟ

⚡ Έξυπνη Σύνοψη

Συγκεντρωτικές συναρτήσεις σε MySQL εκτελέστε έναν υπολογισμό σε πολλές γραμμές μιας μόνο στήλης και επιστρέψτε μία συνοπτική τιμή. Οι πέντε τυπικές συναρτήσεις ISO — COUNT, SUM, AVG, MIN και MAX — τροφοδοτούν σχεδόν κάθε αναφορά που παράγει μια βάση δεδομένων.

  • 🔢 COUNT Συμπεριφορά: Η συνάρτηση COUNT(στήλη) αγνοεί τις τιμές NULL, ενώ η συνάρτηση COUNT(*) μετράει κάθε γραμμή στον πίνακα, συμπεριλαμβανομένων των διπλότυπων και των NULL.
  • 🚫 ΞΕΧΩΡΙΣΤΗ λέξη-κλειδί: Η συνάρτηση DISTINCT αφαιρεί τις διπλότυπες τιμές πριν από την εκτέλεση του υπολογισμού. Η συνάρτηση ALL είναι η προεπιλεγμένη και τις διατηρεί.
  • 📉 ΕΛΑΧΙΣΤΗ και ΜΕΓΙΣΤΗ: Η συνάρτηση MIN επιστρέφει τη μικρότερη τιμή σε μια στήλη και η συνάρτηση MAX επιστρέφει τη μεγαλύτερη, τόσο σε αριθμητικούς τύπους, όσο και σε τύπους συμβολοσειράς και τύπους ημερομηνίας.
  • SUM και AVG: Και οι δύο λειτουργούν μόνο σε αριθμητικές στήλες και εξαιρούν τις NULL γραμμές από το αποτέλεσμα που επιστρέφεται.
  • 📊 ΟΜΑΔΟΠΟΙΗΣΗ ΜΕ Σύζευξη: Η προσθήκη GROUP BY μετατρέπει ένα μεμονωμένο συνοπτικό σχήμα σε μία γραμμή συνοπτικής περιγραφής ανά ομάδα.
  • ⚠️ NULL παγίδα: AVG διαιρεί μόνο με τον αριθμό των γραμμών που δεν είναι NULL, επομένως οι τιμές που λείπουν αυξάνουν σιωπηλά τον μέσο όρο.

Τι είναι οι συναρτήσεις συνάθροισης στο MySQL?

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

  • Εκτέλεση υπολογισμών σε πολλαπλές γραμμές
  • Μιας στήλης ενός πίνακα
  • Και επιστρέφοντας μια ενιαία τιμή.

Το πρότυπο ISO ορίζει πέντε (5) συναρτήσεις αθροίσματος, δηλαδή:

  1. COUNT
  2. ΑΘΡΟΙΣΜΑ
  3. AVG
  4. MIN
  5. MAX

Ένας κανόνας ισχύει και για τα πέντε: Οι συναρτήσεις συγκέντρωσης αγνοούν τις τιμές NULLΗ COUNT(*) είναι η μοναδική εξαίρεση και θα εξετάσουμε το γιατί παρακάτω.

Γιατί να χρησιμοποιήσετε συγκεντρωτικές συναρτήσεις

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

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

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

  • Ταινίες με λιγότερα νοικιασμένα.
  • Οι περισσότερες ενοικιαζόμενες ταινίες.
  • Ο μέσος αριθμός φορών που κάθε ταινία ενοικιάζεται σε έναν μήνα.

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

COUNT συνάρτηση

Η συνάρτηση COUNT επιστρέφει τον συνολικό αριθμό τιμών στο καθορισμένο πεδίο, τόσο σε αριθμητικούς όσο και σε μη αριθμητικούς τύπους δεδομένων. Όπως κάθε συνάρτηση συγκεντρωτικών αποτελεσμάτων, η συνάρτηση COUNT(στήλη) εξαιρεί τις τιμές NULL.

Η COUNT(*) είναι μια ειδική φόρμα που επιστρέφει τον αριθμό όλων των γραμμών σε έναν πίνακα. Επίσης, μετράει NULL και διπλότυπα, επειδή μετράει γραμμές και όχι τιμές.

Ο πίνακας movierentals περιέχει τα εξής δεδομένα:

αριθμός αναφοράς Ημερομηνία Συναλλαγής ημερομηνία επιστροφής αριθμός μέλους movie_id ταινία_ επέστρεψε
11 20-06-2012 Τιμή NULL 1 1 0
12 22-06-2012 25-06-2012 1 2 0
13 22-06-2012 25-06-2012 3 2 0
14 21-06-2012 24-06-2012 2 2 0
15 23-06-2012 Τιμή NULL 3 3 0

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

SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;

Εκτελώντας αυτό σε MySQL Πάγκος εργασίας Η συνάρτηση against myflixdb επιστρέφει 3, επειδή τρεις γραμμές φέρουν το movie_id 2.

COUNT(`ταινία_αναγνωριστικό`)
3

DISTINCT Λέξη-κλειδί

Η COUNT απαντά «πόσα». Η επόμενη ερώτηση είναι συνήθως «πόσα» διαφορετικές αυτά», και γι' αυτό υπάρχει το DISTINCT.

DISTINCT Λέξη-κλειδί

Η λέξη-κλειδί DISTINCT παραλείπει διπλότυπα από τα αποτελέσματά μας ανά ομάδαping ίδιες τιμές μαζί, ακριβώς όπως υποδηλώνει η παραπάνω εικόνα.

Αρχικά, ας εκτελέσουμε ένα απλό ερώτημα.

SELECT `movie_id` FROM `movierentals`;
movie_id
1
2
2
2
3

Τώρα το ίδιο ερώτημα με τη λέξη-κλειδί DISTINCT:

SELECT DISTINCT `movie_id` FROM `movierentals`;

Η συνάρτηση DISTINCT παραλείπει τις διπλότυπες εγγραφές:

movie_id
1
2
3

COUNT vs COUNT(*) vs COUNT(DISTINCT): Ποιο πρέπει να χρησιμοποιήσετε;

Μπορεί επίσης να τοποθετηθεί DISTINCT μέσα μια συγκεντρωτική συνάρτηση, και εδώ είναι που οι περισσότεροι αρχάριοι χάνουν track από τις οποίες οι γραμμές καταμετρώνται στην πραγματικότητα. Οι τέσσερις παρακάτω φόρμες εκτελούνται όλες στον ίδιο πίνακα πέντε γραμμών movierentals που παρουσιάστηκε νωρίτερα, ωστόσο δεν επιστρέφουν όλες τον ίδιο αριθμό. Η διαφορά καταλήγει σε δύο ερωτήματα: καταμετρά η φόρμα γραμμές ή τιμές και διατηρεί διπλότυπα;

Μορφή Τι μετράει Αποτέλεσμα στις ενοικιάσεις ταινιών
ΚΟΜΗΣ(*) Κάθε γραμμή, συμπεριλαμβανομένων των διπλότυπων και των γραμμών που είναι εντελώς NULL 5
COUNT(`ταινία_αναγνωριστικό`) Κάθε τιμή που δεν είναι NULL στη στήλη, συμπεριλαμβανομένων των διπλότυπων 5
COUNT(`ημερομηνία_επιστροφής`) Μόνο τιμές που δεν είναι NULL — οι δύο ημερομηνίες επιστροφής NULL παραλείπονται 3
COUNT(DISTINCT `ταινία_αναγνωριστικό`) Μόνο μοναδικές τιμές που δεν είναι NULL 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡 Συμβουλές: Χρησιμοποιήστε COUNT(*) για τον αριθμό γραμμών, COUNT(στήλη) όταν ένα NULL σημαίνει "δεν ισχύει" και COUNT(στήλη DISTINCT) για μοναδικές τιμές. Το αντίθετο του DISTINCT είναι το ALL — η προεπιλεγμένη τιμή και επομένως σπάνια γράφεται.

MIN

Η λειτουργία MIN επιστρέφει τη μικρότερη τιμή στο καθορισμένο πεδίο πίνακα.

Ας υποθέσουμε ότι θέλουμε το έτος κυκλοφορίας της παλαιότερης ταινίας στη βιβλιοθήκη μας. MySQLΗ συνάρτηση MIN μας το δίνει αυτό.

SELECT MIN(`year_released`) FROM `movies`;

Αποτέλεσμα:

MIN(`έτος_κυκλοφορίας`)
2005

MAX

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

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

SELECT MAX(`year_released`) FROM `movies`;

Αποτέλεσμα:

MAX(`έτος_κυκλοφορίας`)
2012

SUM λειτουργία

Τα MIN και MAX επιλέγουν μια υπάρχουσα τιμή από μια στήλη. Τα SUM και AVG Υπολογίστε έναν νέο αριθμό από ολόκληρη τη στήλη.

Ας υποθέσουμε ότι θέλουμε το συνολικό ποσό των πληρωμών που έχουν πραγματοποιηθεί μέχρι στιγμής. MySQL ΑΘΡΟΙΣΜΑ λειτουργία επιστρέφει το άθροισμα όλων των τιμών στην καθορισμένη στήλη. Το SUM λειτουργεί μόνο σε αριθμητικά πεδίακαι Οι τιμές NULL εξαιρούνται από το αποτέλεσμα.

Ο παρακάτω πίνακας δείχνει τα δεδομένα στον πίνακα πληρωμών.

πληρωμή_ id αριθμός μέλους ημερομηνία πληρωμής περιγραφή ποσό που καταβάλλεται εξωτερικό_αριθμός αναφοράς
1 1 23-07-2012 Πληρωμή ενοικίασης ταινίας 2500 11
2 1 25-07-2012 Πληρωμή ενοικίασης ταινίας 2000 12
3 3 30-07-2012 Πληρωμή ενοικίασης ταινίας 6000 Τιμή NULL

Το ερώτημα που εμφανίζεται παρακάτω λαμβάνει όλες τις πληρωμές που πραγματοποιήθηκαν και τις συνοψίζει σε ένα μόνο αποτέλεσμα: 2500 + 2000 + 6000 = 10500.

SELECT SUM(`amount_paid`) FROM `payments`;

Αποτέλεσμα:

SUM(`ποσό_πληρωτέο`)
10500

AVG λειτουργία

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

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

SELECT AVG(`amount_paid`) FROM `payments`;

Αποτέλεσμα:

AVG(`ποσό_πληρωτέο`)
3500

⚠️ Προειδοποίηση: AVG διαιρεί με τον αριθμό των μη NULL γραμμών, όχι με τον αριθμό γραμμών του πίνακα. Ένα NULL ποσό παραλείπεται αντί να μετριέται ως μηδέν, γεγονός που ανεβάζει αθόρυβα τον μέσο όρο. Χρησιμοποιήστε AVG(IFNULL(`amount_paid`, 0)) όταν μια τιμή που λείπει σημαίνει μηδέν.

Πρακτικό παράδειγμα: Συνδυασμός συναρτήσεων συνάθροισης με GROUP BY

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

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

SELECT m.`full_names`,
       COUNT(p.`payment_id`) AS `paymentscount`,
       AVG(p.`amount_paid`) AS `averagepaymentamount`,
       SUM(p.`amount_paid`) AS `totalpayments`
FROM members m, payments p
WHERE m.`membership_number` = p.`membership_number`
GROUP BY m.`full_names`;

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

AVG συνάρτηση που χρησιμοποιείται με GROUP BY

Το ερώτημα ενώνει τους δύο πίνακες στον όρο WHERE — το παλαιότερο στυλ ένωσης με κόμμα. Ο σύγχρονος κώδικας γράφει την ίδια λογική με έναν σαφή όρο. ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ … ΕΝΕΡΓΟΠΟΙΗΜΕΝΗΣημειώστε επίσης ότι κάθε μη συγκεντρωτική στήλη στη λίστα SELECT πρέπει να εμφανίζεται σε GROUP BY ή MySQL 5.7 και νεότερες εκδόσεις απορρίψτε το ερώτημα στην ενότητα ONLY_FULL_GROUP_BY. Δείτε το επίσημος ανώτερος υπάλληλος MySQL αναφορά συνάρτησης συγκέντρωσης.

Συχνές Ερωτήσεις

The ΟΤΙ ρήτρα Φιλτράρει μεμονωμένες γραμμές πριν υπολογιστεί το άθροισμα. Το HAVING φιλτράρει τα ομαδοποιημένα αποτελέσματα στη συνέχεια, επομένως μόνο το HAVING μπορεί να αναφερθεί σε ένα άθροισμα όπως COUNT(*) ή SUM(amount_paid).

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

Ναι. Σε αντίθεση με το SUM και το AVGΤα , MIN και MAX λειτουργούν σε οποιονδήποτε συγκρίσιμο τύπο. Σε μια στήλη κειμένου επιστρέφουν την πρώτη και την τελευταία τιμή με αλφαβητική σειρά, και σε μια στήλη ημερομηνίας την παλαιότερη και την πιο πρόσφατη ημερομηνία.

Ναι. Οι βοηθοί μετατροπής κειμένου σε SQL μεταφράζουν ερωτήσεις όπως η «μέση πληρωμή ανά μέλος» σε ένα ερώτημα GROUP BY. Εκτελέστε το δημιουργημένο SQL σε MySQL Πάγκος εργασίας και ελέγξτε τον αριθμό των γραμμών πριν εμπιστευτείτε τους αριθμούς.

Η συνήθης αιτία είναι ο χειρισμός NULL και οι διπλότυπες γραμμές σύνδεσης. Ένα μοντέλο AI μπορεί να επιλέξει COUNT(*) όπου απαιτείται COUNT(στήλη) ή να συνδέσει έναν πίνακα δύο φορές, γεγονός που διογκώνει κάθε SUM. Πάντα να επαληθεύετε με ένα γνωστό αριθμό.

Συνοψίστε αυτήν την ανάρτηση με: