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

Τελευταία ενημέρωση: 19/07/2017

Η T-SQL χρησιμοποιεί τις προτάσεις GROUP BY και HAVING για να ομαδοποιήσει δεδομένα, χρησιμοποιώντας την ακόλουθη επίσημη σύνταξη:

ΕΠΙΛΟΓΗ στηλών ΑΠΟ τον πίνακα

ΟΜΑΔΑ ΑΠΟ

Ο όρος GROUP BY καθορίζει πώς θα ομαδοποιηθούν οι σειρές.

Για παράδειγμα, ας ομαδοποιήσουμε τα προϊόντα ανά κατασκευαστή

SELECT Κατασκευαστής, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer

Η πρώτη στήλη στη δήλωση SELECT - Manufacturer αντιπροσωπεύει το όνομα της ομάδας και η δεύτερη στήλη - ModelsCount αντιπροσωπεύει το αποτέλεσμα της συνάρτησης Count, η οποία υπολογίζει τον αριθμό των σειρών στην ομάδα.

Αξίζει να ληφθεί υπόψη ότι κάθε στήλη που χρησιμοποιείται σε μια πρόταση SELECT (χωρίς να υπολογίζονται οι στήλες που αποθηκεύουν το αποτέλεσμα συγκεντρωτικών συναρτήσεων) πρέπει να προσδιορίζεται μετά τον όρο GROUP BY. Έτσι, για παράδειγμα, στην παραπάνω περίπτωση, η στήλη Κατασκευαστής καθορίζεται και στις δύο ρήτρες SELECT και GROUP BY.

Και αν η πρόταση SELECT επιλέξει μία ή περισσότερες στήλες και χρησιμοποιεί επίσης συναρτήσεις συγκεντρωτικών στοιχείων, τότε πρέπει να χρησιμοποιήσετε την ρήτρα GROUP BY. Έτσι, το ακόλουθο παράδειγμα δεν θα λειτουργήσει επειδή δεν περιέχει έκφραση ομαδοποίησης:

SELECT Κατασκευαστής, COUNT(*) AS ModelsCount FROM Products

Ένα άλλο παράδειγμα, ας προσθέσουμε μια ομαδοποίηση με βάση τον αριθμό των προϊόντων:

SELECT Manufacturer, ProductCount, COUNT(*) AS ModelsCount FROM Products GROUP BY BY Manufacturer, ProductCount

Ο όρος GROUP BY μπορεί να ομαδοποιηθεί κατά πολλές στήλες.

Εάν η στήλη στην οποία ομαδοποιείτε περιέχει μια τιμή NULL, οι σειρές με την τιμή NULL θα σχηματίσουν μια ξεχωριστή ομάδα.

Σημειώστε ότι η ρήτρα GROUP BY πρέπει να έρχεται μετά την ρήτρα WHERE αλλά πριν από την ρήτρα ORDER BY:

SELECT Κατασκευαστής, COUNT(*) AS ModelsCount FROM Products WHERE Τιμή > 30000 ΟΜΑΔΑ ΑΝΑ Κατασκευαστή ΠΑΡΑΓΓΕΛΙΑ ΑΝΑ Μοντέλα Καταμέτρηση DESC

Φιλτράρισμα ομάδων. ΕΧΟΝΤΑΣ

Χειριστής ΕΧΟΝΤΑΣ καθορίζει ποιες ομάδες θα συμπεριληφθούν στο αποτέλεσμα εξόδου, δηλαδή φιλτράρει ομάδες.

Η χρήση του HAVING είναι από πολλές απόψεις παρόμοια με τη χρήση του WHERE. Μόνο WHERE χρησιμοποιείται για φιλτράρισμα σειρών, HAVING χρησιμοποιείται για φιλτράρισμα ομάδων.

Για παράδειγμα, ας βρούμε όλες τις ομάδες προϊόντων ανά κατασκευαστή για τις οποίες έχουν οριστεί περισσότερα από 1 μοντέλα:

SELECT Κατασκευαστής, COUNT(*) AS ModelsCount FROM Products GROUP BY BY Manufacturer HAVING COUNT(*) > 1

Σε αυτήν την περίπτωση, σε μία εντολή μπορούμε να χρησιμοποιήσουμε εκφράσεις WHERE και HAVING:

SELECT Κατασκευαστής, COUNT(*) AS ModelsCount FROM Products WHERE Τιμή * ProductCount > 80000 GROUP BY BY Manufacturer HAVING COUNT(*) > 1

Δηλαδή, σε αυτήν την περίπτωση, οι σειρές φιλτράρονται πρώτα: επιλέγονται τα προϊόντα των οποίων το συνολικό κόστος είναι μεγαλύτερο από 80.000. Στη συνέχεια, τα επιλεγμένα προϊόντα ομαδοποιούνται ανά κατασκευαστή. Και στη συνέχεια φιλτράρονται οι ίδιες οι ομάδες - επιλέγονται εκείνες οι ομάδες που περιέχουν περισσότερα από 1 μοντέλα.

Εάν είναι απαραίτητο να γίνει ταξινόμηση, τότε η έκφραση ORDER BY έρχεται μετά την έκφραση HAVING:

SELECT Manufacturer, COUNT(*) AS Models, SUM(ProductCount) AS Units FROM Products WHERE Τιμή * ProductCount > 80000 GROUP BY BY Manufacturer HAVING SUM(ProductCount) > 2 ORDER BY BY Units DESC

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

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

Οι περισσότερες πληροφορίες στις βάσεις δεδομένων αποθηκεύονται σε λεπτομερή μορφή. Ωστόσο, υπάρχει συχνά η ανάγκη λήψης εκθέσεων. Για παράδειγμα, μάθετε τον συνολικό αριθμό των σχολίων των χρηστών ή ίσως την ποσότητα των εμπορευμάτων στις αποθήκες. Υπάρχουν πολλές παρόμοιες εργασίες. Επομένως, η γλώσσα SQL παρέχει ειδικά για τέτοιες περιπτώσεις την ομάδα από και έχοντας κατασκευές, οι οποίες επιτρέπουν, αντίστοιχα, την ομαδοποίηση και το φιλτράρισμα των ομάδων δεδομένων που προκύπτουν.

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

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

Ας φανταστούμε ένα αφηρημένο παράδειγμα. Ας υποθέσουμε ότι έχετε έναν συνοπτικό πίνακα χρηστών του φόρουμ. Ας το ονομάσουμε userstat και μοιάζει με αυτό. Ένα σημαντικό σημείο, πιστεύουμε ότι ένας χρήστης μπορεί να ανήκει μόνο σε μία ομάδα.

όνομα_χρήστη - όνομα χρήστη

forum_group - όνομα ομάδας

mess_count - αριθμός μηνυμάτων

is_have_social_profile - εάν το προφίλ του φόρουμ περιέχει έναν σύνδεσμο προς μια σελίδα σε ένα κοινωνικό δίκτυο

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

Καθαρή ομαδοποίηση χρησιμοποιώντας group by

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

Πρώτον, μια σύντομη λεκτική περιγραφή για να γίνει ευκολότερη η κατανόηση του ερωτήματος SQL. Επομένως, πρέπει να βρείτε τις υπολογισμένες τιμές ανά ομάδες φόρουμ. Αντίστοιχα, πρέπει να διαιρέσετε όλες αυτές τις δέκα γραμμές σε τρεις διαφορετικές ομάδες: διαχειριστής, διαχειριστής, χρήστης. Για να το κάνετε αυτό, πρέπει να προσθέσετε μια ομαδοποίηση με βάση τις τιμές του πεδίου forum_group στο τέλος του αιτήματος. Επίσης, προσθέστε υπολογισμένες εκφράσεις για επιλογή χρησιμοποιώντας τις λεγόμενες συναρτήσεις συγκεντρωτικών στοιχείων.

Καθορισμός πεδίων και υπολογισμένων στηλών επιλέξτε forum_group, avg(raiting) ως avg_raiting, sum(mess_count) as total_mess_count -- Καθορίστε τον πίνακα από το userstat -- Καθορίστε την ομαδοποίηση ανά ομάδα πεδίων ανά ομάδα_forum

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

Χρησιμοποίησα επίσης δύο αθροιστικές συναρτήσεις. AVG - υπολογίζει τη μέση τιμή. Και SUM - υπολογίζει το άθροισμα.

forum_groupμέση_αξιολόγησηtotal_mess_count
διαχειριστής 4 50
μετριοπαθής 3 50
χρήστης 3 150

1. Αρχικά, όλες οι σειρές του πίνακα προέλευσης χωρίστηκαν σε τρεις ομάδες σύμφωνα με τις τιμές του πεδίου forum_group. Για παράδειγμα, υπήρχαν τρεις χρήστες στην ομάδα διαχειριστή. Υπάρχουν επίσης 3 γραμμές στο εσωτερικό του moder. Και μέσα στην ομάδα χρηστών υπήρχαν 4 γραμμές (τέσσερις χρήστες).

2. Στη συνέχεια εφαρμόστηκαν συγκεντρωτικές συναρτήσεις σε κάθε ομάδα. Για παράδειγμα, για την ομάδα διαχειριστών η μέση βαθμολογία υπολογίστηκε ως εξής (2 + 5 + 5)/3 = 4. Ο αριθμός των μηνυμάτων υπολογίστηκε ως (10 + 15 + 25) = 50.

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

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

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

Αρχικά, θα περιγράψουμε προφορικά τι πρέπει να γίνει στο ερώτημα SQL. Πρέπει να διαιρέσουμε όλες τις σειρές του αρχικού πίνακα userstat σύμφωνα με τα ακόλουθα κριτήρια: όνομα ομάδας και παρουσία κοινωνικού προφίλ. Συνεπώς, είναι απαραίτητο να ομαδοποιήσετε τα δεδομένα του πίνακα κατά τα πεδία forum_group και is_have_social_profile. Ωστόσο, δεν μας ενδιαφέρουν εκείνες οι ομάδες όπου υπάρχει μόνο ένα άτομο. Επομένως, τέτοιες ομάδες πρέπει να φιλτράρονται.

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

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

Έτσι θα μοιάζει το ερώτημα SQL

Καθορισμός πεδίων και υπολογισμένων στηλών επιλέξτε forum_group, is_have_social_profile, count(*) as total -- Καθορίστε τον πίνακα από το userstat -- Καθορίστε ομαδοποίηση πεδίων ανά ομάδα forum_group, is_have_social_profile -- Καθορίστε το φίλτρο ομάδας που έχει πλήθος(*) > 1

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

Ιδού το αποτέλεσμα:

forum_groupis_have_social_profileσύνολο
διαχειριστής 1 2
μετριοπαθής 1 2
χρήστης 0 3

Ας ρίξουμε μια ματιά βήμα προς βήμα στο πώς προέκυψε αυτό το αποτέλεσμα.

1. Αρχικά, ελήφθησαν 6 ομάδες. Κάθε ομάδα forum_group χωρίστηκε σε δύο υποομάδες με βάση τις τιμές του πεδίου is_have_social_profile. Με άλλα λόγια, ομάδες: , , , , , .

Σημείωση: Παρεμπιπτόντως, δεν θα υπήρχαν απαραίτητα 6 ομάδες Έτσι, για παράδειγμα, εάν όλοι οι διαχειριστές συμπλήρωναν ένα προφίλ, τότε θα υπήρχαν 5 ομάδες, αφού το πεδίο is_have_social_profile θα είχε μόνο μία τιμή για τους χρήστες της ομάδας διαχειριστή.

2. Στη συνέχεια εφαρμόστηκε η συνθήκη του φίλτρου σε κάθε ομάδα. Επομένως, αποκλείστηκαν οι ακόλουθες ομάδες: , , . Δεδομένου ότι μέσα σε κάθε τέτοια ομάδα υπήρχε μόνο μία σειρά του πίνακα προέλευσης.

3. Μετά από αυτό, υπολογίστηκαν τα απαραίτητα στοιχεία και προέκυψε το αποτέλεσμα.

Όπως μπορείτε να δείτε, δεν υπάρχει τίποτα δύσκολο στη χρήση.

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

Τώρα, ξέρετε πώς να ομαδοποιείτε τα δεδομένα με την ομάδα κατά, καθώς και πώς να φιλτράρετε ομάδες χρησιμοποιώντας το έχοντας.


Εάν υπάρχει μια ενότητα στην παράσταση του πίνακα ΟΜΑΔΑ ΚΑΤΑ SQL, τότε εκτελείται το εξής ΟΜΑΔΑ ΑΠΟ.

Αν συμβολίσουμε με R τον πίνακα που είναι το αποτέλεσμα της προηγούμενης ενότητας ( ΑΠΟή ΟΠΟΥ), μετά το αποτέλεσμα της ενότητας ΟΜΑΔΑ ΑΠΟείναι ένα διαμέρισμα του R σε ένα σύνολο ομάδων σειρών που αποτελείται από τον ελάχιστο αριθμό ομάδων έτσι ώστε για κάθε στήλη από τη λίστα στηλών της ενότητας ΟΜΑΔΑ ΑΠΟσε όλες τις σειρές κάθε ομάδας που περιέχει περισσότερες από μία γραμμές, οι τιμές αυτής της στήλης είναι ίσες. Για να υποδείξετε το αποτέλεσμα μιας ενότητας ΟΜΑΔΑ ΑΠΟτο πρότυπο χρησιμοποιεί τον όρο " ομαδοποιημένος πίνακας”.

Αν η δήλωση ΕΠΙΛΕΓΩπεριέχει μια πρόταση ΟΜΑΔΑ ΑΠΟ(ΕΠΙΛΟΓΗ ΟΜΑΔΑΣ ΑΠΟ), η λίστα επιλογής μπορεί να περιέχει μόνο τα ακόλουθα τύπους έκφρασης:

  • Σταθερές.
  • Συγκεντρωτικές συναρτήσεις.
  • Λειτουργίες USER, UID και SYSDATE.
  • Εκφράσεις, αντίστοιχες με αυτές που αναφέρονται στην πρόταση ΟΜΑΔΑ ΑΠΟ.
  • Εκφράσεις, συμπεριλαμβανομένων των παραπάνω εκφράσεων.

Παράδειγμα 1.Υπολογίστε τον συνολικό όγκο αγορών για κάθε προϊόν:

ΕΠΙΛΕΓΩστοκ, ΑΘΡΟΙΣΜΑ(ποσότητα) ΑΠΟορδπώληση ΟΜΑΔΑ ΑΠΟστοκ;

Φράση ΟΜΑΔΑ ΑΠΟδεν περιλαμβάνει παραγγελία χορδών. Για να οργανώσετε το αποτέλεσμα αυτού του παραδείγματος κατά κωδικούς προϊόντων, θα πρέπει να τοποθετήσετε τη φράση ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑαπόθεμα μετά τη φράση ΟΜΑΔΑ ΑΠΟ.

Παράδειγμα 2.Μπορείτε να χρησιμοποιήσετε ομαδοποιήσεις δεδομένων ΟΜΑΔΑ ΑΠΟμαζί με την προϋπόθεση. Για παράδειγμα, για κάθε προϊόν που αγοράσατε, επιλέξτε τον κωδικό του και τον συνολικό όγκο αγορών, με εξαίρεση τις αγορές πελατών με κωδικό 23:

ΕΠΙΛΕΓΩστοκ, ΑΘΡΟΙΣΜΑ(ποσότητα) ΑΠΟορδπώληση ΟΠΟΥπελάτης αρ<>23 ΟΜΑΔΑ ΑΠΟστοκ;

Γραμμές που δεν ικανοποιούν την προϋπόθεση ΟΠΟΥ, εξαιρούνται πριν από την ομαδοποίηση των δεδομένων.

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

Ας πούμε ότι υπάρχει μια εργασία για τον υπολογισμό της ποσότητας ενός προϊόντος. Ο προμηθευτής μας προμηθεύει προϊόντα σε συγκεκριμένη τιμή. Ας υπολογίσουμε τη συνολική ποσότητα κάθε προϊόντος. Η GROUP BY θα μας βοηθήσει σε αυτό. Το αποτέλεσμα της εργασίας θα είναι ένας πίνακας που αποτελείται από πολλές στήλες. Οι παραδόσεις θα ομαδοποιηθούν κατά PR. Η διάταξη εμφανίζεται σε ομάδες, η οποία εκκινείται από το Group By SQL. Θα πρέπει να σημειωθεί ότι αυτή η φράση προϋποθέτει τη χρήση της φράσης Select, η οποία με τη σειρά της ορίζει μια ενιαία τιμή για κάθε έκφραση της ομάδας που σχηματίζεται. Υπάρχουν τρεις περιπτώσεις για μια δεδομένη έκφραση: παίρνει μια αριθμητική τιμή, γίνεται μια συνάρτηση SQL που θα μειώσει όλες τις τιμές μιας στήλης σε ένα άθροισμα ή άλλη καθορισμένη τιμή ή η παράσταση μπορεί να γίνει σταθερά. Οι σειρές πίνακα δεν χρειάζεται να ομαδοποιούνται αυστηρά, μπορούν να ομαδοποιηθούν με οποιοδήποτε συνδυασμό στηλών του πίνακα. Πρέπει να ληφθεί υπόψη ότι η παραγγελία αιτημάτων μέσω PR είναι δυνατή εάν υποβληθεί το κατάλληλο αίτημα.

Μεταφράζει ένα ερώτημα SELECT σε ένα εσωτερικό σχέδιο εκτέλεσης ("σχέδιο ερωτήματος"), το οποίο μπορεί να διαφέρει ακόμη και για συντακτικά πανομοιότυπα ερωτήματα και από ένα συγκεκριμένο DBMS.

Η δήλωση SELECT αποτελείται από πολλές ρήτρες (ενότητες):

  • Το SELECT ορίζει μια λίστα επιστρεφόμενων στηλών (υπάρχουσες και υπολογιζόμενες), τα ονόματά τους, περιορισμούς στη μοναδικότητα των γραμμών στο επιστρεφόμενο σύνολο, περιορισμούς στον αριθμό των γραμμών στο επιστρεφόμενο σύνολο.
  • Το FROM καθορίζει μια έκφραση πίνακα που ορίζει το υποκείμενο σύνολο δεδομένων για την εφαρμογή των πράξεων που ορίζονται σε άλλες ρήτρες δηλώσεων.
  • Το WHERE καθορίζει έναν περιορισμό στις σειρές της παράστασης του πίνακα από τον όρο FROM.
  • Το GROUP BY συνδυάζει σειρές που έχουν την ίδια ιδιότητα χρησιμοποιώντας αθροιστικές συναρτήσεις
  • HAVING επιλέγει μεταξύ των ομάδων που ορίζονται από την παράμετρο GROUP BY
  • ORDER BY καθορίζει κριτήρια ταξινόμησης σειρών. οι ταξινομημένες σειρές μεταβιβάζονται στο σημείο κλήσης.

Δομή δήλωσης

Η δήλωση SELECT έχει την ακόλουθη δομή:

ΕΠΙΛΟΓΗ [ DISTINCT | ΔΙΑΚΡΙΤΙΚΟ | ALL ] select_expression,... FROM table_references [ WHERE where_definition ] [ GROUP BY ( unsigned_integer | col_name | formula ) ] [ HAVING where_definition ] [ ORDER BY ( unsigned_integer | col_name | formula ) [ ASC | DESC ], ...]

Επιλογές χειριστή

ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ

ORDER BY - προαιρετική (προαιρετική) παράμετρος χειριστή ΕΠΙΛΕΓΩκαι ΕΝΩΣΗ , που σημαίνει ότι οι χειριστές ΕΠΙΛΕΓΩ, UNION επιστρέφει ένα σύνολο γραμμών ταξινομημένων με βάση τις τιμές μιας ή περισσότερων στηλών. Μπορεί να εφαρμοστεί τόσο σε αριθμητικές στήλες όσο και σε στήλες συμβολοσειρών. Στην τελευταία περίπτωση, η ταξινόμηση θα γίνει αλφαβητικά.

Η χρήση της ρήτρας ORDER BY είναι ο μόνος τρόπος για να ταξινομήσετε το σύνολο αποτελεσμάτων των σειρών. Χωρίς αυτήν την ρήτρα, το DBMS μπορεί να επιστρέψει σειρές με οποιαδήποτε σειρά. Εάν η παραγγελία είναι απαραίτητη, το ORDER BY πρέπει να υπάρχει στο SELECT , UNION .

Η ταξινόμηση μπορεί να γίνει είτε με αύξουσα είτε με φθίνουσα σειρά τιμών.

  • Η επιλογή ASC (προεπιλογή) ορίζει τη σειρά ταξινόμησης σε αύξουσα σειρά, από τις μικρότερες προς τις μεγαλύτερες τιμές.
  • Η παράμετρος DESC ορίζει τη σειρά ταξινόμησης σε φθίνουσα σειρά, από τις μεγαλύτερες προς τις μικρότερες τιμές.

Παραδείγματα

SELECT * FROM T ;

Γ1 Γ2
1 ένα
2 σι
Γ1 Γ2
1 ένα
2 σι

ΕΠΙΛΕΞΤΕ C1 ΑΠΟ T ;

Γ1
1
2
Γ1 Γ2
1 ένα
2 σι
Γ1 Γ2
1 ένα
Γ1 Γ2
1 ένα
2 σι
Γ1 Γ2
2 σι
1 ένα

Για ερώτημα πίνακα Τ

SELECT * FROM T ;

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

ΕΠΙΛΕΞΤΕ C1 ΑΠΟ T ;

θα επιστρέψει τις τιμές της στήλης C1 όλων των σειρών του πίνακα - από την άποψη της σχεσιακής άλγεβρας προβολή. Για το ίδιο ερώτημα πίνακα

θα επιστρέψει τις τιμές όλων των στηλών όλων των σειρών του πίνακα για τις οποίες η τιμή του πεδίου C1 είναι ίση με "1" - από την άποψη της σχεσιακής άλγεβρας μπορούμε να πούμε ότι το δείγμα, αφού υπάρχει η λέξη-κλειδί WHERE. Τελευταίο αίτημα

ΕΠΙΛΟΓΗ * ΑΠΟ ΤΑΞΗ ΚΑΤΑ C1 DESC ;

θα επιστρέψει τις ίδιες σειρές με την πρώτη, ωστόσο το αποτέλεσμα θα ταξινομηθεί με αντίστροφη σειρά (Ζ-Α) λόγω της χρήσης της λέξης-κλειδιού ORDER BY με το πεδίο C1 ως πεδίο ταξινόμησης. Αυτό το ερώτημα δεν περιέχει τη λέξη-κλειδί WHERE, επομένως θα επιστρέψει τα πάντα στον πίνακα. Πολλαπλά στοιχεία ORDER BY μπορούν να καθοριστούν διαχωρισμένα με κόμμα [π.χ. ORDER BY C1 ASC, C2 DESC] για πιο ακριβή ταξινόμηση.

Επιλέγει όλες τις σειρές όπου το πεδίο στήλη_όνομα είναι ίσο με μία από τις αναφερόμενες τιμές τιμή1, τιμή2,...

Επιστρέφει μια λίστα με αναγνωριστικά τμημάτων που είχαν πωλήσεις μεγαλύτερες από 1.000 $ την 1η Ιανουαρίου 2000, μαζί με τα ποσά πωλήσεων για εκείνη την ημέρα:

Ο περιορισμός των σειρών επέστρεψε

Σύμφωνα με το ISO SQL:2003, το σύνολο δεδομένων που επιστρέφεται μπορεί να περιοριστεί χρησιμοποιώντας:

  • εισαγωγή λειτουργίες παραθύρουστη δήλωση SELECT

Συνάρτηση παραθύρου ROW_NUMBER()

Υπάρχουν διάφορα λειτουργίες παραθύρου. Το ROW_NUMBER() OVER μπορεί να χρησιμοποιηθεί για απλός περιορισμόςαριθμός σειρών που επιστράφηκαν. Για παράδειγμα, για να επιστρέψετε όχι περισσότερες από δέκα σειρές:

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

Συνάρτηση παραθύρου RANK()

Η συνάρτηση RANK() OVER λειτουργεί σχεδόν το ίδιο με το ROW_NUMBER, αλλά μπορεί να επιστρέψει περισσότερα από nγραμμές υπό ορισμένες προϋποθέσεις. Για παράδειγμα, για να βρείτε τα 10 κορυφαία νεότερα άτομα:

Αυτός ο κωδικός μπορεί να επιστρέψει περισσότερες από 10 γραμμές. Για παράδειγμα, εάν υπάρχουν δύο άτομα με την ίδια ηλικία, θα επιστρέψει 11 σειρές.

Μη τυπική σύνταξη

Δεν υποστηρίζουν όλα τα DBMS τις παραπάνω λειτουργίες παραθύρου. Ωστόσο, πολλοί έχουν μη τυπική σύνταξη για την επίλυση των ίδιων προβλημάτων. Παρακάτω είναι οι επιλογές απλός περιορισμόςδείγματα για διάφορα DBMS:

Κατασκευαστής/DBMS Σύνταξη περιορισμών
DB2 (Υποστηρίζει στάνταρ ξεκινώντας από την DB2 Έκδοση 6)
mob_info