Συναρτήσεις συγκεντρωτικών γλωσσών SQL. Χρήση συναρτήσεων συγκέντρωσης SQL



  • Συγκεντρωτικές συναρτήσειςχρησιμοποιούνται παρόμοια με τα ονόματα πεδίων σε μια πρόταση SELECT, με μία εξαίρεση: λαμβάνουν το όνομα πεδίου ως όρισμα. Με λειτουργίες ΠΟΣΟΚαι AVGΜπορούν να χρησιμοποιηθούν μόνο αριθμητικά πεδία. Με λειτουργίες COUNT, MAX και MINΜπορούν να χρησιμοποιηθούν τόσο αριθμητικά όσο και πεδία χαρακτήρων. Όταν χρησιμοποιείται με πεδία χαρακτήρων ΜΕΓΚαι MINθα τα μεταφράσει σε ισοδύναμο κώδικα ASCII και θα τα επεξεργαστεί αλφαβητική σειρά. Ορισμένα DBMS επιτρέπουν τη χρήση ένθετων συγκεντρωτικών στοιχείων, αλλά αυτό αποτελεί απόκλιση από το πρότυπο ANSI με όλες τις επακόλουθες συνέπειες.


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

ΕΠΙΛΟΓΗ R1. Πειθαρχία, COUNT(*)

GROUP BY R1.Discipline;

Αποτέλεσμα:


SELECT R1.Discipline, COUNT (*)

ΠΟΥ R1. Η αξιολόγηση ΔΕΝ ΕΙΝΑΙ ΜΗΧΑΝΗ

GROUP BY R1.Discipline;

Αποτέλεσμα:


δεν θα συμπεριληφθεί στο σύνολο των πλειάδων πριν από την ομαδοποίηση, επομένως ο αριθμός των πλειάδων στην ομάδα για τον κλάδο «Θεωρία πληροφοριών» θα είναι 1 λιγότερος.

Ένα παρόμοιο αποτέλεσμα μπορεί να ληφθεί εάν γράψετε το ερώτημα με τον ακόλουθο τρόπο:

ΕΠΙΛΟΓΗ R1. Πειθαρχία, COUNT (R1. Βαθμολογία)

ΟΜΑΔΑ ΑΠΟ R1. Πειθαρχία;

Λειτουργία COUNT (ΧΑΡΑΚΤΗΡΙΣΤΙΚΟ ΟΝΟΜΑ)μετράει τον αριθμό των συγκεκριμένων τιμών σε μια ομάδα, σε αντίθεση με μια συνάρτηση ΚΟΜΗΣ(*),που μετράει τον αριθμό των σειρών σε μια ομάδα. Πράγματι, σε μια ομάδα με τον κλάδο «Θεωρία πληροφοριών» θα υπάρχουν 4 γραμμές, αλλά μόνο 3 συγκεκριμένες τιμές για το χαρακτηριστικό «Αξιολόγηση».


Κανόνες χειρισμού τιμών NULL σε συγκεντρωτικές συναρτήσεις

Εάν κάποιες τιμές στη στήλη είναι ίσες ΑΚΥΡΟΣΚατά τον υπολογισμό του αποτελέσματος της συνάρτησης, εξαιρούνται.

Αν όλες οι τιμές σε μια στήλη είναι ίσες ΑΚΥΡΟΣ, Αυτό Μέγ. Ελάχ. Άθροισμα Μέσο = NULL καταμέτρηση = 0 (μηδέν).

Εάν ο πίνακας είναι άδειος, count(*) = 0 .

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

Κανόνες ερμηνείας συγκεντρωτικών συναρτήσεων

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

SELECT MAX (Αξιολόγηση) από το R1θα δώσει τη μέγιστη αξιολόγηση κατά τη διάρκεια της συνεδρίας.

ΕΠΙΛΕΞΤΕ ΣΥΝΟΛΟ (Βαθμολογία) από το R1θα δώσει το άθροισμα όλων των βαθμών για τη συνεδρία.

ΕΠΙΛΟΓΗ AVG(Βαθμολογία) από το R1θα δώσει μια μέση βαθμολογία για ολόκληρη τη συνεδρία.


2; Αποτέλεσμα: " width="640"

Γυρνώντας ξανά στη βάση δεδομένων «Συνεδρία» (πίνακας R1), βρίσκουμε τον αριθμό των εξετάσεων που πέρασαν επιτυχώς:

SELECT COUNT(*) As Παραδόθηκε _ εξετάσεις

WHERE Βαθμολογία 2;

Αποτέλεσμα:


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

SELECT R1.Discipline, COUNT (DISTINCT R1.Evaluation)

ΠΟΥ R1. Η αξιολόγηση ΔΕΝ ΕΙΝΑΙ ΜΗΧΑΝΗ

GROUP BY R1.Discipline;

Αποτέλεσμα:


Το ίδιο αποτέλεσμα προκύπτει εάν εξαιρέσουμε τη ρητή συνθήκη στο τμήμα WHERE, οπότε το ερώτημα θα μοιάζει με αυτό:

ΕΠΙΛΟΓΗ R1. Πειθαρχία, COUNT (DISTINCT R1. Αξιολόγηση)

ΟΜΑΔΑ ΑΠΟ R1. Πειθαρχία;

Λειτουργία COUNT (DISTINCT R1.Evaluation)μετράει μόνο σίγουρο διάφοροςνοήματα.

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


2 Ομάδα κατά R2. Ομάδα, R1. Πειθαρχία; Εδώ, η συνάρτηση CAST() μετατρέπει τη στήλη Βαθμολογία σε έγκυρο τύπο δεδομένων. "width="640"

Επιλέξτε R2.Group, R1.Discipline,Count(*) ως Total, AVG(cast(Score as δεκαδικό(3,1))) ως Average_score

Από R1, R2

όπου R1. Πλήρες όνομα = R2. Πλήρες όνομα και R1. Η βαθμολογία δεν είναι μηδενική

και R1. Βαθμολογία 2

Ομάδα κατά R2. Ομάδα, R1. Πειθαρχία;

Εδώ είναι η λειτουργία ΕΚΜΑΓΕΙΟ()Μετατρέπει τη στήλη Βαθμολογία σε έγκυρο τύπο δεδομένων.


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

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

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


1; Αποτέλεσμα: " width="640"

ΕΠΙΛΟΓΗ R2. Ομάδα

ΑΠΟ R1, R2

ΠΟΥ R1. Πλήρες όνομα = R2. Πλήρες όνομα ΚΑΙ

R1.Βαθμολογία = 2

GROUP BY R2.Group, R1.Discipline

ΕΧΟΝΤΑΣ μέτρηση(*) 1;

Αποτέλεσμα:


Έχουμε μια βάση δεδομένων «Τράπεζα», που αποτελείται από έναν πίνακα F, ο οποίος αποθηκεύει τη σχέση F που περιέχει πληροφορίες για λογαριασμούς σε υποκαταστήματα μιας συγκεκριμένης τράπεζας:

Βρείτε το συνολικό υπόλοιπο σε λογαριασμούς σε υποκαταστήματα. Μπορείτε να κάνετε ένα ξεχωριστό ερώτημα για καθένα από αυτά επιλέγοντας SUM (Remaining) από τον πίνακα για κάθε κλάδο, αλλά η λειτουργία GROUP BY θα σας επιτρέψει να τα βάλετε όλα σε μία εντολή:

ΕΠΙΛΕΓΩ Υποκατάστημα , SUM( Υπόλοιπο )

ΟΜΑΔΑ ΑΝΑ Υποκατάστημα;

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


5.000; Τα επιχειρήματα σε μια πρόταση HAVING ακολουθούν τους ίδιους κανόνες όπως σε μια πρόταση SELECT που χρησιμοποιεί GROUP BY. Πρέπει να έχουν μία τιμή ανά ομάδα εξόδου. "width="640"

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

Η σωστή εντολή θα ήταν:

SELECT Branch, SUM (Υπόλοιπο)

ΟΜΑΔΑ ΑΠΟ Υποκατάστημα

ΕΧΟΝΤΑΣ ΠΟΣΟ ( Υπόλοιπο ) 5 000;

Επιχειρήματα σε μια πρόταση ΕΧΟΝΤΑΣυπακούουν στους ίδιους κανόνες όπως στην πρόταση ΕΠΙΛΕΓΩόπου χρησιμοποιείται ΟΜΑΔΑ ΑΠΟ. Πρέπει να έχουν μία τιμή ανά ομάδα εξόδου.


Η ακόλουθη εντολή θα απαγορευτεί:

SELECT Branch,SUM(Υπόλοιπο)

ΟΜΑΔΑ ΑΝΑ Υποκατάστημα

HHAING Ημερομηνία Έναρξης = 27/12/2004 ;

Πεδίο Ημερομηνία έναρξης λειτουργίαςδεν μπορεί να χρησιμοποιηθεί σε πρόταση ΕΧΟΝΤΑΣ, γιατί μπορεί να έχει περισσότερες από μία τιμές ανά ομάδα εξόδου. Για να αποφευχθεί μια τέτοια κατάσταση, η πρόταση ΕΧΟΝΤΑΣθα πρέπει να αναφέρεται μόνο στα συγκεντρωτικά στοιχεία και τα επιλεγμένα πεδία ΟΜΑΔΑ ΑΠΟ. Υπάρχει ένας σωστός τρόπος για να κάνετε το παραπάνω ερώτημα:

SELECT Branch,SUM(Υπόλοιπο)

WHEREOpenDate = '27/12/2004'

ΟΜΑΔΑ ΑΝΑ Υποκατάστημα;


Η έννοια αυτού του ερωτήματος είναι η εξής: βρείτε το άθροισμα των υπολοίπων για κάθε κλάδο λογαριασμών που άνοιξε στις 27 Δεκεμβρίου 2004.

Όπως αναφέρθηκε προηγουμένως, το HAVING μπορεί να λάβει μόνο ορίσματα που έχουν μία τιμή ανά ομάδα εξόδου. Στην πράξη, οι αναφορές σε συναρτήσεις συγκεντρωτικών στοιχείων είναι οι πιο συνηθισμένες, αλλά τα πεδία που επιλέγονται με χρήση GROUP BY είναι επίσης έγκυρα. Για παράδειγμα, θέλουμε να δούμε τα συνολικά υπόλοιπα στους λογαριασμούς των υποκαταστημάτων στην Αγία Πετρούπολη, το Pskov και το Uryupinsk:

SELECT Branch, SUM (Υπόλοιπο)

ΑΠΟ F,Q

ΠΟΥ ΣΤ. Κλάδος = Π. Κλάδος

ΟΜΑΔΑ ΑΝΑ Υποκατάστημα

HAVING Branch IN («St. Petersburg», «Pskov», «Uryupinsk»);

100.000; Εάν το συνολικό υπόλοιπο είναι μεγαλύτερο από 100.000 $, τότε θα το δούμε στη σχέση που προκύπτει, διαφορετικά θα λάβουμε μια κενή σχέση. "width="640"

Επομένως, μόνο οι προδιαγραφές των στηλών που προσδιορίζονται ως ομαδοποιούμενες στήλες στην πρόταση GROUP BY μπορούν να χρησιμοποιηθούν απευθείας σε αριθμητικές εκφράσεις κατηγορήματος που περιλαμβάνονται στον όρο επιλογής του όρου HAVING. Οι υπόλοιπες στήλες μπορούν να καθοριστούν μόνο εντός των προδιαγραφών των συγκεντρωτικών συναρτήσεων COUNT, SUM, AVG, MIN και MAX, οι οποίες σε αυτήν την περίπτωση υπολογίζουν κάποια συγκεντρωτική τιμή για ολόκληρη την ομάδα σειρών. Το αποτέλεσμα της εκτέλεσης της ενότητας HAVING είναι ένας ομαδοποιημένος πίνακας που περιέχει μόνο εκείνες τις ομάδες σειρών για τις οποίες το αποτέλεσμα του υπολογισμού της συνθήκης επιλογής στην ενότητα HAVING είναι TRUE. Συγκεκριμένα, εάν υπάρχει όρος HAVING σε ένα ερώτημα που δεν περιέχει GROUP BY, τότε το αποτέλεσμα της εκτέλεσής του θα είναι είτε ένας κενός πίνακας είτε το αποτέλεσμα της εκτέλεσης προηγούμενων ενοτήτων έκφραση πίνακα, αντιμετωπίζεται ως μία ομάδα χωρίς ομαδοποίηση στηλών. Ας δούμε ένα παράδειγμα. Ας πούμε ότι θέλουμε να βγούμε συνολικό ποσότα υπόλοιπα για όλα τα υποκαταστήματα, αλλά μόνο εάν είναι περισσότερα από 100.000 $ Σε αυτήν την περίπτωση, το ερώτημά μας δεν θα περιέχει λειτουργίες ομαδοποίησης, αλλά θα περιέχει μια ενότητα HAVING και θα μοιάζει με αυτό:

ΕΠΙΛΟΓΗ ΑΠΟΣΟΛΟΥ( Υπόλοιπο )

ΕΧΟΝΤΑΣ ΠΟΣΟ( Υπόλοιπο ) 100 000;

Εάν το συνολικό υπόλοιπο είναι μεγαλύτερο από 100.000 $, τότε θα το δούμε στη σχέση που προκύπτει, διαφορετικά θα λάβουμε μια κενή σχέση.


με την τιμή της στήλης Πειθαρχία. Θα λάβουμε 4 ομάδες για τις οποίες μπορούμε να υπολογίσουμε κάποιες τιμές ομάδας, όπως τον αριθμό των πλειάδων στην ομάδα, τη μέγιστη ή την ελάχιστη τιμή της στήλης Βαθμολογία. Πίνακας 5.7. Συγκεντρωτικές συναρτήσεις
Λειτουργία Αποτέλεσμα
ΚΟΜΗΣ Αριθμός σειρών ή μη κενών τιμών πεδίων που επέλεξε το ερώτημα
ΠΟΣΟ Το άθροισμα όλων των επιλεγμένων τιμών για αυτό το πεδίο
AVG Ο αριθμητικός μέσος όρος όλων των επιλεγμένων τιμών για αυτό το πεδίο
MIN Η μικρότερη από όλες τις επιλεγμένες τιμές για αυτό το πεδίο
ΜΕΓ Η μεγαλύτερη από όλες τις επιλεγμένες τιμές για αυτό το πεδίο
R1
Ονοματεπώνυμο Πειθαρχία Βαθμός
Ομάδα 1 Petrov F.I. Βάσεις δεδομένων 5
Sidorov K.A. Βάσεις δεδομένων 4
Mironov A.V. Βάσεις δεδομένων 2
Stepanova K. E. Βάσεις δεδομένων 2
Krylova T. S. Βάσεις δεδομένων 5
Vladimirov V. A. Βάσεις δεδομένων 5
Ομάδα 2 Sidorov K.A. Θεωρία πληροφοριών 4
Stepanova K. E. Θεωρία πληροφοριών 2
Krylova T. S. Θεωρία πληροφοριών 5
Mironov A.V. Θεωρία πληροφοριών Ακυρος
Ομάδα 3 Trofimov P. A. Δίκτυα και τηλεπικοινωνίες 4
Ivanova E. A. Δίκτυα και τηλεπικοινωνίες 5
Utkina N.V. Δίκτυα και τηλεπικοινωνίες 5
Ομάδα 4 Vladimirov V. A. Αγγλική γλώσσα 4
Trofimov P. A. Αγγλική γλώσσα 5
Ivanova E. A. Αγγλική γλώσσα 3
Petrov F.I. Αγγλική γλώσσα 5

Συγκεντρωτικές συναρτήσειςχρησιμοποιούνται παρόμοια με τα ονόματα πεδίων σε μια πρόταση SELECT, αλλά με μια εξαίρεση: λαμβάνουν το όνομα πεδίου ως όρισμα. Μόνο αριθμητικά πεδία μπορούν να χρησιμοποιηθούν με τις συναρτήσεις SUM και AVG. Τόσο τα αριθμητικά όσο και τα πεδία χαρακτήρων μπορούν να χρησιμοποιηθούν με τις συναρτήσεις COUNT , MAX και MIN. Όταν χρησιμοποιούνται με πεδία χαρακτήρων, τα MAX και MIN θα τα μεταφράσουν στον ισοδύναμο κωδικό ASCII και θα τα επεξεργαστούν με αλφαβητική σειρά. Ορισμένα DBMS επιτρέπουν τη χρήση ένθετων συγκεντρωτικών στοιχείων, αλλά αυτό αποτελεί απόκλιση από το πρότυπο ANSI με όλες τις επακόλουθες συνέπειες.

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

ΕΠΙΛΟΓΗ R1.Discipline, COUNT(*) FROM R1 GROUP BY R1.Discipline

Αποτέλεσμα:

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

Παίρνουμε το αποτέλεσμα:

Σε αυτή την περίπτωση, η γραμμή με τον μαθητή

Mironov A.V. Θεωρία πληροφοριών Ακυρος

δεν θα εμπίπτει στο σύνολο των πλειάδων πριν από την ομαδοποίηση, επομένως ο αριθμός των πλειάδων στην ομάδα για πειθαρχία " Θεωρία πληροφοριών"θα είναι 1 λιγότερο.

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

Γυρίζοντας ξανά στη βάση δεδομένων «Περίοδος» (πίνακες R1, R2, R3), βρίσκουμε τον αριθμό των επιτυχώς επιτυχών εξετάσεων:

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

Αποτέλεσμα:

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

Αποτέλεσμα:

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

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

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

Στο μέλλον, για παράδειγμα, δεν θα εργαστούμε με τη βάση δεδομένων "Session", αλλά με τη βάση δεδομένων "Bank", που αποτελείται από έναν πίνακα F, ο οποίος αποθηκεύει τη σχέση F που περιέχει πληροφορίες σχετικά με λογαριασμούς σε υποκαταστήματα μιας συγκεκριμένης τράπεζας:

F = (N, Ονοματεπώνυμο, Υποκατάστημα, Ημερομηνία ανοίγματος, Ημερομηνία κλεισίματος, Υπόλοιπο); Q = (Κλάδος, Πόλη);

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

Για παράδειγμα, ας υποθέσουμε ότι θέλουμε να βρούμε το συνολικό υπόλοιπο των τραπεζικών λογαριασμών. Μπορείτε να κάνετε ξεχωριστό ερώτημα για καθένα από αυτά επιλέγοντας SUM(Balance) από τον πίνακα για κάθε κλάδο. Ωστόσο, το GROUP BY θα σας επιτρέψει να τα βάλετε όλα σε μία εντολή:

SELECT Branch, SUM(Remaining) FROM F GROUP BY BY Branch;

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

Το πρότυπο ISO ορίζει τα ακόλουθα πέντε συναρτήσεις συνάθροισης:

ΚΟΜΗΣ– επιστρέφει τον αριθμό των τιμών στην καθορισμένη στήλη.

ΠΟΣΟ- επιστρέφει το άθροισμα των τιμών στην καθορισμένη στήλη.

AVG– επιστρέφει τη μέση τιμή στην καθορισμένη στήλη.

MIN– επιστρέφει την ελάχιστη τιμή στην καθορισμένη στήλη.

ΜΕΓ– επιστρέφει τη μέγιστη τιμή στην καθορισμένη στήλη.

Όλες αυτές οι συναρτήσεις λειτουργούν σε τιμές σε μια στήλη μεμονωμένου πίνακα και επιστρέφουν μια ενιαία τιμή. Οι συναρτήσεις COUNT, MIN και MAX ισχύουν τόσο για αριθμητικά όσο και για μη αριθμητικά πεδία, ενώ οι συναρτήσεις SUM και AVG μπορούν να χρησιμοποιηθούν μόνο για αριθμητικά πεδία. Με εξαίρεση το COUNT(*), κατά την αξιολόγηση των αποτελεσμάτων οποιασδήποτε συνάρτησης, πρώτα απαλείφονται όλες οι μηδενικές τιμές και, στη συνέχεια, η απαιτούμενη λειτουργία εφαρμόζεται μόνο στις υπόλοιπες μη κενές τιμές στη στήλη. Η επιλογή COUNT(*) είναι μια ειδική χρήση της συνάρτησης COUNT—ο σκοπός της είναι να μετρήσει όλες τις σειρές σε έναν πίνακα, ανεξάρτητα από το αν περιέχει null, διπλότυπα ή άλλες τιμές. Εάν θέλετε να εξαιρέσετε διπλότυπες τιμές πριν χρησιμοποιήσετε μια συνάρτηση συγκέντρωσης, πρέπει να προηγηθεί το όνομα της στήλης στον ορισμό της συνάρτησης με τη λέξη-κλειδί DISTINCT. Το πρότυπο ISO επιτρέπει στη χρήση της λέξης-κλειδιού ALL να υποδηλώνει ρητά ότι δεν απαιτείται εξαίρεση διπλότυπης τιμής, αν και αυτή η λέξη-κλειδί υπονοείται από προεπιλογή εάν δεν καθορίζεται άλλος προσδιοριστής. Η λέξη-κλειδί DISTINCT δεν έχει καμία σημασία για τις συναρτήσεις MIN και MAX. Ωστόσο, η χρήση του μπορεί να επηρεάσει τα αποτελέσματα των λειτουργιών SUM και AVG, επομένως θα πρέπει να εξετάσετε εκ των προτέρων εάν θα πρέπει να υπάρχει σε κάθε συγκεκριμένη περίπτωση. Επιπλέον, η λέξη-κλειδί DISTINCT μπορεί να καθοριστεί μόνο μία φορά σε κάθε αίτημα.

Θα πρέπει να σημειωθεί ότι οι συναρτήσεις συγκέντρωσης μπορούν να χρησιμοποιηθούν μόνο στη λίστα SELECT και στον όρο HAVING (βλ. Ενότητα 5.3.4). Σε όλες τις άλλες περιπτώσεις, η χρήση αυτών των λειτουργιών είναι απαράδεκτη. Εάν η λίστα SELECT περιέχει μια συνάρτηση συνάθροισης και το σώμα του ερωτήματος δεν περιέχει όρο GROUP BY για να επιτρέπεται η ομαδοποίηση των δεδομένων, τότε κανένα στοιχείο στη λίστα SELECT δεν μπορεί να περιλαμβάνει αναφορές στηλών εκτός εάν η στήλη χρησιμοποιείται ως παράμετρος συνάρτησης συγκέντρωσης. Για παράδειγμα, το ακόλουθο ερώτημα είναι λανθασμένο:

ΕΠΙΛΕΓΩπροσωπικό Όχι,ΚΟΜΗΣ (μισθός)

ΑΠΟΠροσωπικό;

Το λάθος είναι ότι σε αυτό το αίτημαλείπει σχέδιο ΟΜΑΔΑ ΑΠΟ, και η στήλη staffNo στη λίστα SELECT είναι προσβάσιμη χωρίς τη χρήση συνάρτησης συνάθροισης.

Παράδειγμα 13: Χρήση της συνάρτησης COUNT(*).Προσδιορίστε πόσα ενοικιαζόμενα ακίνητα έχουν ενοίκιο άνω των 350 £ το μήνα,

ΕΠΙΛΟΓΗ COUNT(*) AS καταμέτρηση

ΑΠΟPropertyFor Rent

ΟΠΟΥενοίκιο > 350;

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

Πίνακας 23

κόμης

Παράδειγμα 14. Χρησιμοποιώντας τη συνάρτηση COUNT(DISTINCT).Προσδιορίστε πόσα διαφορετικά ενοικιαζόμενα ακίνητα είδαν οι πελάτες τον Μάιο του 2001.

ΕΠΙΛΟΓΗ ΑΡΙΘΜΟΥ (ΔΙΑΚΡΙΤαρ. ιδιοκτησίας) AS μέτρηση

ΑΠΟΠροβολή

Και πάλι, ο περιορισμός των αποτελεσμάτων του ερωτήματος μόνο σε εκείνα τα ενοικιαζόμενα ακίνητα που επιθεωρήθηκαν τον Μάιο του 2001 επιτυγχάνεται με τη χρήση της ρήτρας WHERE. Ο συνολικός αριθμός των αντικειμένων που εξετάστηκαν και πληρούν την καθορισμένη συνθήκη μπορεί να προσδιοριστεί χρησιμοποιώντας τη συνάρτηση συγκέντρωσης COUNT. Ωστόσο, αφού το ίδιο αντικείμενο μπορεί να επιθεωρηθεί διάφορους πελάτεςαρκετές φορές, είναι απαραίτητο να προσδιορίσετε τη λέξη-κλειδί DISTINCT στον ορισμό της συνάρτησης - αυτό θα επιτρέψει την εξαίρεση διπλών τιμών από τον υπολογισμό. Τα αποτελέσματα του ερωτήματος παρουσιάζονται στον πίνακα. 24.

Πίνακας 24

Παράδειγμα 16. Χρήση των συναρτήσεων MIN, MAXnAVG.Υπολογίστε τους κατώτατους, μέγιστους και μέσους μισθούς.

ΕΠΙΛΟΓΗ ΕΛΑΧ(μισθός) ΩΣ min, ΜΕΓ(μισθός) ΩΣμέγιστο, AVG(μισθός) ΩΣμέσος όρος

ΑΠΟΠροσωπικό;

Σε αυτό το παράδειγμα, πρέπει να επεξεργαστείτε πληροφορίες για όλο το προσωπικό της εταιρείας, επομένως δεν χρειάζεται να χρησιμοποιήσετε την ρήτρα WHERE. Οι απαιτούμενες τιμές μπορούν να υπολογιστούν χρησιμοποιώντας τις συναρτήσεις MIN, MAX και AVG που εφαρμόζονται στη στήλη μισθών του πίνακα Προσωπικού. Τα αποτελέσματα του ερωτήματος παρουσιάζονται στον πίνακα. 26.

Πίνακας 26.

Αποτέλεσμα της αίτησης

ελάχ μέγ μέσος όρος
9000.00 30000.00 17000.00

Ομαδοποίηση αποτελεσμάτων (κατασκευή GROUP BY).Τα παραπάνω παραδείγματα συνοπτικών δεδομένων είναι παρόμοια με τις γραμμές σύνοψης που βρίσκονται συνήθως στο τέλος των αναφορών. Ως αποτέλεσμα, όλα τα λεπτομερή δεδομένα αναφοράς συμπιέζονται σε μία γραμμή σύνοψης. Ωστόσο, πολύ συχνά στις αναφορές είναι απαραίτητο να δημιουργείται και υποσύνολα. Μια πρόταση GROUP BY μπορεί να καθοριστεί σε μια δήλωση SELECT για αυτό το σκοπό. Καλείται ένα ερώτημα που περιέχει μια πρόταση GROUP BY αίτημα ομαδοποίησης,επειδή ομαδοποιεί τα δεδομένα που προκύπτουν από μια λειτουργία SELECT και στη συνέχεια δημιουργεί μια ενιαία συνολική σειρά για κάθε μεμονωμένη ομάδα. Οι στήλες που παρατίθενται στον όρο GROUP BY καλούνται ομαδοποιημένες στήλες.Το πρότυπο ISO απαιτεί οι ρήτρες SELECT και GROUP BY να συνδέονται στενά. Όταν χρησιμοποιείτε τον όρο GROUP BY σε μια πρόταση SELECT, κάθε στοιχείο λίστας στη λίστα SELECT πρέπει να έχει το μόνο νόημα για όλη την ομάδα.Επιπλέον, η ρήτρα SELECT μπορεί να περιλαμβάνει μόνο τους ακόλουθους τύπους στοιχείων:

Ονόματα στηλών.

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

Σταθερές;

Εκφράσεις που περιλαμβάνουν συνδυασμούς των στοιχείων που αναφέρονται παραπάνω.

Όλα τα ονόματα στηλών που εμφανίζονται στη λίστα SELECT πρέπει επίσης να εμφανίζονται στον όρο GROUP BY, εκτός εάν το όνομα της στήλης χρησιμοποιείται μόνο σε μια συνάρτηση συγκέντρωσης. Το αντίθετο δεν ισχύει πάντα - η πρόταση GROUP BY μπορεί να περιέχει ονόματα στηλών που δεν βρίσκονται στη λίστα SELECT. Εάν η ρήτρα WHERE χρησιμοποιείται σε συνδυασμό με την πρόταση GROUP BY, υποβάλλεται σε επεξεργασία πρώτα και ομαδοποιούνται μόνο εκείνες οι σειρές που ικανοποιούν τη συνθήκη αναζήτησης. Το πρότυπο ISO ορίζει ότι κατά την ομαδοποίηση, όλες οι τιμές που λείπουν αντιμετωπίζονται ως ίσες. Εάν δύο σειρές πίνακα στην ίδια στήλη ομαδοποίησης περιέχουν NULL τιμέςκαι πανομοιότυπες τιμές σε όλες τις άλλες μη κενές ομαδοποιημένες στήλες, τοποθετούνται στην ίδια ομάδα.

Παράδειγμα 17: Χρήση της κατασκευής GROUP BY.Προσδιορίστε τον αριθμό του προσωπικού που εργάζεται σε κάθε τμήμα της εταιρείας, καθώς και τους συνολικούς μισθούς τους.

ΕΠΙΛΕΓΩυποκατάστημα Όχι, ΚΟΜΗΣ(αριθμός προσωπικού) ΩΣκόμης, ΠΟΣΟ(μισθός) ΩΣποσό

ΑΠΟΠροσωπικό

ΟΜΑΔΑ ΑΠΟυποκατάστημα αρ

ΠΑΡΑΓΓΕΛΙΑ ΑΠΟΑρ. κλάδου;

Δεν χρειάζεται να συμπεριλάβετε τα ονόματα στηλών staffNo και μισθού στη λίστα στοιχείων GROUP BY επειδή εμφανίζονται μόνο σε μια λίστα SELECT με συναρτήσεις συγκέντρωσης. Ταυτόχρονα, η στήλη branchNo στη λίστα της ρήτρας SELECT δεν συσχετίζεται με καμία συνάρτηση συνάθροισης και για το λόγο αυτό πρέπει να καθοριστεί στον όρο GROUP BY. Τα αποτελέσματα του ερωτήματος παρουσιάζονται στον πίνακα. 27.

Πίνακας 27

Αποτέλεσμα της αίτησης

υποκατάστημα αρ Κόμης Ποσό
B003 54000.00
B005 39000.00
B007 9000.00

Εννοιολογικά, κατά την επεξεργασία αυτού του αιτήματος, εκτελούνται οι ακόλουθες ενέργειες:

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

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

3. Οι προκύπτουσες σειρές του πίνακα που προκύπτει ταξινομούνται με αύξουσα σειρά του αριθμού διακλάδωσης που καθορίζεται στη στήλη "No branch".

υποκατάστημα αρ προσωπικού Αρ Μισθός
В00З SG37 12000.00
В00З SG14 18000.00
В00З SG5 24000.00
B005 SL21 30000.00
B005 SL41 9000.00
B007 SA9 9000.00
COUNT (αριθμός προσωπικού) ΠΟΣΟ (μισθός)
54000.00
39000.00
9000.00

Ρύζι. 1. Τρεις ομάδες εγγραφών που δημιουργούνται όταν εκτελείται ένα ερώτημα

Το πρότυπο SQL επιτρέπει την τοποθέτηση ένθετων ερωτημάτων σε μια λίστα SELECT. Έτσι το παραπάνω ερώτημα μπορεί επίσης να αναπαρασταθεί ως εξής:

ΕΠΙΛΕΓΩΌχι κλάδου, (ΕΠΙΛΟΓΗ COUNT(Αριθμός προσωπικού)ΩΣ κόμης

ΑΠΟΠροσωπικό s

ΟΠΟΥs.branchNo = b.branchNo),

(ΕΠΙΛΕΞΤΕ ΠΟΣΟ (μισθός) ΩΣ άθροισμα

ΑΠΟΠροσωπικό s

ΟΠΟΥs.branchNo = b.branchNo)

ΑΠΟΚλάδος β

ΠΑΡΑΓΓΕΛΙΑ ΑΠΟΑρ. κλάδου;

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

Περιορισμοί στην εκτέλεση ομαδοποίησης (κατασκευή HAVING).Η ρήτρα HAVING προορίζεται να χρησιμοποιηθεί σε συνδυασμό με την ρήτρα GROUP BY για τον καθορισμό περιορισμών που καθορίζονται για την επιλογή αυτών ομάδες,το οποίο θα τοποθετηθεί στον πίνακα ερωτημάτων που προκύπτει. Αν και οι προτάσεις HAVING και WHERE έχουν παρόμοια σύνταξη, οι σκοποί τους είναι διαφορετικοί. Ο όρος WHERE χρησιμοποιείται για την επιλογή μεμονωμένων σειρών για τη συμπλήρωση του πίνακα ερωτήματος που προκύπτει και ο όρος HAVING χρησιμοποιείται για την επιλογή ομάδες,τοποθετείται στον πίνακα ερωτημάτων που προκύπτει. Το πρότυπο ISO απαιτεί τα ονόματα στηλών που χρησιμοποιούνται στον όρο HAVING να εμφανίζονται στη λίστα GROUP BY στοιχείων ή να χρησιμοποιούνται σε συναρτήσεις συγκέντρωσης. Στην πράξη, οι όροι αναζήτησης σε μια ρήτρα HAVING περιλαμβάνουν πάντα τουλάχιστον μία συνάρτηση συγκέντρωσης. Διαφορετικά, αυτοί οι όροι αναζήτησης πρέπει να τοποθετηθούν σε μια ρήτρα WHERE και να χρησιμοποιηθούν για την επιλογή μεμονωμένων σειρών. (Να θυμάστε ότι οι συναρτήσεις συγκέντρωσης δεν μπορούν να χρησιμοποιηθούν σε μια πρόταση WHERE.) Η ρήτρα HAVING δεν είναι απαραίτητο μέρος του Γλώσσα SQL– κάθε ερώτημα που γράφεται χρησιμοποιώντας την κατασκευή HAVING μπορεί να παρουσιαστεί σε άλλη μορφή, χωρίς τη χρήση της.

Παράδειγμα 18. Χρησιμοποιώντας την κατασκευή HAVING.Για κάθε υποκατάστημα μιας εταιρείας με περισσότερα από ένα άτομα, καθορίστε τον αριθμό των εργαζομένων και το ύψος των αποδοχών τους.

ΕΠΙΛΕΓΩυποκατάστημα Όχι, ΚΟΥΜ T (αριθμός προσωπικού) ΩΣκόμης, ΠΟΣΟ(μισθός) ΩΣποσό

ΑΠΟΠροσωπικό

ΟΜΑΔΑ ΑΠΟυποκατάστημα αρ

ΕΧΟΝΤΑΣ ΜΕΤΡΗΣΗ(Αριθμός προσωπικού) > 1

ΠΑΡΑΓΓΕΛΙΑ ΑΠΟΑρ. κλάδου;

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

Πίνακας 28

κλάδος Χωρίς άθροισμα καταμέτρησης
В00З 3 54000,00
В005 2 39000,00

Υποερωτήματα.Σε αυτήν την ενότητα, θα συζητήσουμε τη χρήση πλήρων εντολών SELECT που είναι ενσωματωμένες στο σώμα μιας άλλης πρότασης SELECT. ΕξωτερικόςΗ (δεύτερη) πρόταση SELECT χρησιμοποιεί το αποτέλεσμα της εκτέλεσης εσωτερικός(πρώτος) ο χειριστής για να καθορίσει το περιεχόμενο του τελικού αποτελέσματος ολόκληρης της λειτουργίας. Τα εσωτερικά ερωτήματα μπορούν να βρεθούν στις ρήτρες WHERE και HAVING της εξωτερικής πρότασης SELECT - σε αυτήν την περίπτωση ονομάζονται υποερωτήματα,ή ένθετα ερωτήματα.Επιπλέον, οι εσωτερικές δηλώσεις SELECT μπορούν να χρησιμοποιηθούν σε δηλώσεις INSERT, UPDATE και DELETE . Υπάρχουν τρεις τύποι υποερωτημάτων.

Scalar υποερώτημαεπιστρέφει την τιμή που έχει επιλεγεί από την τομή μιας στήλης με μια γραμμή, δηλ. το μόνο νόημα. Κατ' αρχήν, ένα βαθμωτό υποερώτημα μπορεί να χρησιμοποιηθεί όπου απαιτείται μία μόνο τιμή. Παραλλαγές βαθμωτών υποερωτημάτων δίνονται στα παραδείγματα 13 και 14.

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

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

Παράδειγμα 19: Χρήση υποερωτήματος με τεστ ισότητας.Συνθέτω κατάλογος του προσωπικού που εργάζεται στο υποκατάστημα της εταιρείας που βρίσκεται στην οδό 463 Main St1.

ΕΠΙΛΕΓΩ

ΑΠΟΠροσωπικό

ΟΠΟΥΑριθμός κλάδου = (ΕΠΙΛΟΓΗ αρ. κλάδου

ΑΠΟΥποκατάστημα

ΟΠΟΥstreet = "163 Main St" ) ;

Η εσωτερική δήλωση SELECT (SELECT branchNo FROM Branch ...) προορίζεται για τον προσδιορισμό του αριθμού του υποκαταστήματος της εταιρείας που βρίσκεται στη διεύθυνση "163 Main St". (Υπάρχει μόνο ένα τέτοιο υποκατάστημα εταιρείας, επομένως αυτό το παράδειγμα είναι ένα παράδειγμα κλιμακωτή υποερώτημα.) Μετά τη λήψη του απαιτούμενου αριθμού υποκαταστήματος, εκτελείται ένα εξωτερικό υποερώτημα για επιλογή λεπτομερείς πληροφορίεςγια τους υπαλλήλους αυτού του τμήματος. Με άλλα λόγια, η εσωτερική δήλωση SELECT επιστρέφει έναν πίνακα που αποτελείται από μια ενιαία τιμή "BOOV". Ως αποτέλεσμα, η εξωτερική πρόταση SELECT παίρνει την ακόλουθη μορφή:

ΕΠΙΛΕΓΩstaffNo, fName, IName, θέση

ΑΠΟΠροσωπικό

ΟΠΟΥbranchNo = "B0031;

Τα αποτελέσματα αυτής της ερώτησης παρουσιάζονται στον πίνακα. 29.

Πίνακας 29

Αποτέλεσμα της αίτησης

προσωπικού Αρ fName IName θέση
SG37 Άννα Φηγός Βοηθός
SG14 Δαβίδ Πέρασμα Επόπτης
SG5 Σούζαν Μάρκα Διευθυντής

Ένα δευτερεύον ερώτημα είναι ένα εργαλείο για τη δημιουργία ενός προσωρινού πίνακα του οποίου τα περιεχόμενα ανακτώνται και υποβάλλονται σε επεξεργασία από έναν εξωτερικό χειριστή. Ένα υποερώτημα μπορεί να καθοριστεί απευθείας μετά από τελεστές σύγκρισης (δηλ. τελεστές =,<, >, <=, >=, <>) στην ρήτρα WHERE ή HAVING. Το κείμενο του δευτερεύοντος ερωτήματος πρέπει να περικλείεται σε παρένθεση.

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

ΕΠΙΛΕΓΩπροσωπικό Όχι, fName, IName, θέση, μισθός - ( ΕΠΙΛΟΓΗ Μ.Ο(μισθός) ΑΠΟΠροσωπικό) ΩΣ salDiff

ΑΠΟΠροσωπικό

ΟΠΟΥμισθός > ( ΕΠΙΛΟΓΗ Μ.Ο(μισθός) ΑΠΟ S t a f f) ;

Θα πρέπει να σημειωθεί ότι δεν μπορείτε άμεσασυμπεριλάβω σε έκφραση ερωτήματος"WHERE μισθός > AVG (μισθός)", δεδομένου ότι για να χρησιμοποιήσετε τη συγκέντρωσηοι λειτουργίες της ρήτρας WHERE απαγορεύονται. Για να επιτύχετε το επιθυμητό αποτέλεσμα, θα πρέπει να δημιουργήσετε ένα δευτερεύον ερώτημα που υπολογίζει τον μέσο ετήσιο μισθό και, στη συνέχεια, να το χρησιμοποιήσετε σε μια εξωτερική δήλωση SELECT που ανακτά πληροφορίες σχετικά με τους υπαλλήλους της εταιρείας των οποίων ο μισθός υπερβαίνει αυτόν τον μέσο όρο. Με άλλα λόγια, το υποερώτημα επιστρέφει τον μέσο μισθό για την εταιρεία ανά έτος ίσο με £17.000.

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

ΕΠΙΛΕΓΩstaffNo, fName, IName, θέση, μισθός - 17000 Ως salDiff

ΑΠΟΠροσωπικό

ΟΠΟΥμισθός > 17000?

Τα αποτελέσματα του ερωτήματος παρουσιάζονται στον πίνακα. 30.

Πίνακας 30.

Αποτέλεσμα της αίτησης

προσωπικού Αρ fName IName θέση salDiff
SL21 Γιάννης Λευκό Διευθυντής 13000.00
SG14 Δαβίδ Πέρασμα Επόπτης 1000.00
SG5 Σούζαν Μάρκα Διευθυντής 7000.00

Ισχύει για υποερωτήματαακολουθώντας τους κανόνες και περιορισμούς.

1. Τα δευτερεύοντα ερωτήματα δεν πρέπει να χρησιμοποιούν την κατασκευή ORDER BY, αν και μπορεί να υπάρχει στην εξωτερική πρόταση SELECT.

2. Η λίστα SELECT ενός υποερωτήματος πρέπει να αποτελείται από τα ονόματα μεμονωμένων στηλών ή εκφράσεων που αποτελούνται από αυτές, εκτός από τις περιπτώσεις που η λέξη-κλειδί ΥΠΑΡΧΕΙ χρησιμοποιείται στο υποερώτημα.

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

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

ΕΠΙΛΕΓΩ

ΑΠΟΠροσωπικό

ΟΠΟΥ(ΕΠΙΛΕΞΤΕ Μ.Ο.(μισθός) ΑΠΟ Προσωπικό)< salary;

Παράδειγμα 21. Ένθετα υποερωτήματα και η χρήση του κατηγορήματος IN. Κάντε μια λίστα με τα ενοικιαζόμενα ακίνητα για τα οποία είναι υπεύθυνοι υπάλληλοι του υποκαταστήματος της εταιρείας που βρίσκεται στην οδό 163 Main st1.

ΕΠΙΛΕΓΩιδιοκτησία Όχι, δρόμος, πόλη, ταχυδρομικός κώδικας, τύπος, δωμάτια, ενοικίαση

ΑΠΟPropertyFor Rent

Κεφάλαιο 5. Γλώσσα SQL: χειρισμός δεδομένων 189

ΟΠΟΥΠροσωπικό Όχι ΕΙΣΟΔΟΣ (ΕΠΙΛΟΓΗ προσωπικού Αρ

ΑΠΟΠροσωπικό

ΟΠΟΥbrancliNo = (ΕΠΙΛΟΓΗ αρ. κλάδου

ΑΠΟΥποκατάστημα

ΟΠΟΥstreet = "163 Main S t "));

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

Πίνακας 31

Αποτέλεσμα της αίτησης

ακίνητο αρ δρόμος πόλη ταχυδρομικός τομέας τύπος δωμάτια ενοίκιο
PG16 5 Novar Dr Γλασκώβη G129AX Επίπεδα
PG36 2 Manor Road Γλασκώβη G324QX Επίπεδα
PG21 18 Dale Rd Γλασκώβη G12 Σπίτι

Λέξεις-κλειδιά ΟΠΟΙΟΣΔΗΠΟΤΕ και ΟΛΟΙ.Οι λέξεις-κλειδιά ANY και ALL μπορούν να χρησιμοποιηθούν με δευτερεύοντα ερωτήματα που επιστρέφουν μια στήλη αριθμών. Εάν πριν από το υποερώτημα προηγείται η λέξη-κλειδί ALL, η συνθήκη σύγκρισης ικανοποιείται μόνο εάν ισχύει για όλες τις τιμές στη στήλη αποτελεσμάτων του υποερωτήματος. Εάν πριν από το κείμενο του υποερωτήματος προηγείται η λέξη-κλειδί ΟΠΟΙΑΔΗΠΟΤΕ, τότε η συνθήκη σύγκρισης θα θεωρείται ότι ικανοποιείται εάν ικανοποιείται για τουλάχιστον ορισμένες (μία ή περισσότερες) τιμές στη στήλη του υποερωτήματος που προκύπτει. Εάν το αποτέλεσμα της εκτέλεσης ενός δευτερεύοντος ερωτήματος είναι: κενή τιμή, τότε για τη λέξη-κλειδί ALL η συνθήκη σύγκρισης θα θεωρείται ότι πληρούται και για την ΟΠΟΙΑΔΗΠΟΤΕ λέξη-κλειδί θα θεωρείται μη εκπληρωμένη. Σύμφωνα με το πρότυπο ISO, μπορείτε επιπλέον να χρησιμοποιήσετε τη λέξη-κλειδί SOME, η οποία είναι συνώνυμη για τη λέξη-κλειδί ΟΠΟΙΑΔΗΠΟΤΕ.

Παράδειγμα 22.Χρησιμοποιώντας τις λέξεις-κλειδιά ANY και SOME. Βρείτε όλους τους εργαζόμενους των οποίων ο μισθός υπερβαίνει τουλάχιστον τον μισθόένας υπάλληλος του υποκαταστήματος της εταιρείας με τον αριθμό «booz».

ΕΠΙΛΕΓΩstaffNo, fName, IName, θέση, μισθός

ΑΠΟΠροσωπικό

ΟΠΟΥμισθός > SOME(ΕΠΙΛΟΓΗ μισθού

ΑΠΟΠροσωπικό

ΟΠΟΥbranchNo = "B003");

Αν και αυτό το ερώτημα θα μπορούσε να γραφτεί χρησιμοποιώντας ένα δευτερεύον ερώτημα που καθορίζει τον ελάχιστο μισθό για τον αριθμό του προσωπικού του τμήματος "BOHO", μετά το οποίο το εξωτερικό δευτερεύον ερώτημα θα μπορούσε να επιλέξει πληροφορίες για όλο το προσωπικό της εταιρείας των οποίων ο μισθός υπερβαίνει αυτήν την τιμή (βλ. παράδειγμα 20), είναι δυνατή μια άλλη προσέγγιση. που συνίσταται στη χρήση των λέξεων-κλειδιών ΟΡΙΣΜΕΝΕΣ/ΟΠΟΙΑΔΗΠΟΤΕ. Σε αυτήν την περίπτωση, το εσωτερικό υποερώτημα δημιουργεί ένα σύνολο τιμών (12000, 18000, 24000) και το εξωτερικό ερώτημα επιλέγει πληροφορίες για εκείνους τους υπαλλήλους των οποίων ο μισθός είναι μεγαλύτερος από οποιαδήποτε από τις τιμές σε αυτό

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

Πίνακας 32

Αποτέλεσμα της αίτησης

προσωπικού Αρ fName IName θέση μισθός
SL21 Γιάννης Λευκό Διευθυντής 30000.00
SG14 Δαβίδ Πέρασμα Επόπτης 18000.00
SG5 Σούζαν Μάρκα Διευθυντής 24000.00

Παράδειγμα 23.Χρησιμοποιώντας τη λέξη-κλειδί ALL. Βρείτε όλους τους υπαλλήλους των οποίων οι μισθοί είναι μεγαλύτεροι από τους μισθούς οποιουδήποτε υπαλλήλου στον αριθμό υποκαταστήματος της εταιρείας «booz».

ΕΠΙΛΕΓΩstaffNo, fName, INarae, θέση, μισθός

ΑΠΟΠροσωπικό

ΟΠΟΥμισθός > ΟΛΟΙ(ΕΠΙΛΟΓΗ μισθού

ΑΠΟΠροσωπικό

ΟΠΟΥbranchNo = "BOG3");

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

Πίνακας 33

Αποτέλεσμα της αίτησης

προσωπικού Αρ IName fName θέση μισθός
SL21 Λευκό Γιάννης Διευθυντής 30000,00

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

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

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

ΕΠΙΛΕΓΩc.clientNo, fName, IName, ιδιοκτησία Όχι, σχόλιο

ΑΠΟΠελάτης c, Προβολή v

ΟΠΟΥc.clientNo = v.clientNo;

Αυτή η αναφορά απαιτεί πληροφορίες τόσο από τον πίνακα πελάτη όσο και από τον πίνακα προβολής, επομένως θα χρησιμοποιήσουμε έναν μηχανισμό ένωσης πίνακα για τη δημιουργία του ερωτήματος. Ο όρος SELECT παραθέτει όλες τις στήλες που πρέπει να τοποθετηθούν στον πίνακα ερωτημάτων που προκύπτει. Σημειώστε ότι η στήλη clientNo απαιτεί πιστοποίηση, επειδή η στήλη μπορεί επίσης να υπάρχει σε άλλον πίνακα που συμμετέχει στην ένωση. Επομένως, είναι απαραίτητο να αναφέρουμε ρητά ποιες τιμές πίνακα μας ενδιαφέρουν. (Σε αυτό το παράδειγμα, θα μπορούσατε να έχετε επιλέξει εξίσου εύκολα τις τιμές της στήλης clientNo από τον πίνακα Προβολή.) Το όνομα καθορίζεται καθορίζοντας το όνομα του αντίστοιχου πίνακα (ή το ψευδώνυμό του) ως πρόθεμα πριν από το όνομα της στήλης. Το παράδειγμά μας χρησιμοποιεί την τιμή "c" που καθορίζεται ως ψευδώνυμο για τον πίνακα Client. Για τη δημιουργία των γραμμών που προκύπτουν, χρησιμοποιούνται εκείνες οι σειρές των πινάκων προέλευσης που έχουν την ίδια τιμή στη στήλη clientNo. Αυτή η συνθήκη καθορίζεται με τον καθορισμό της συνθήκης αναζήτησης με.clientNo=v.clientNo. Ονομάζονται παρόμοιες στήλες πινάκων πηγής αντίστοιχες στήλες.Η περιγραφόμενη λειτουργία είναι ισοδύναμη με τη λειτουργία συνδέσεις με ισότητασχεσιακή άλγεβρα. Τα αποτελέσματα του ερωτήματος παρουσιάζονται στον πίνακα. 34.

Πίνακας 34

Αποτέλεσμα της αίτησης

πελάτη Αρ fName IName ακίνητο αρ σχόλιο
CR56 Aline Στιούαρτ PG36
CR56 Aline Στιούαρτ PA14 πολύ μικρό
CR56 Aline Στιούαρτ PG4
CR62 Μαρία Tregear PA14 δεν υπάρχει τραπεζαρία
CR76 Γιάννης Κέι PG4 πολύ απομακρυσμένο

Τις περισσότερες φορές, τα ερωτήματα πολλών πινάκων εκτελούνται σε δύο πίνακες που συνδέονται με μια σχέση ένα προς πολλά (1:*) ή γονέα-παιδιού. Στο παραπάνω παράδειγμα, που περιλαμβάνει την πρόσβαση στους πίνακες Client και Viewing, οι τελευταίοι συνδέονται με μια τέτοια σχέση. Κάθε γραμμή του πίνακα Προβολή (παιδικό) συσχετίζεται μόνο με μια γραμμή του πίνακα πελάτη (γονέας), ενώ η ίδια γραμμή του πίνακα πελάτη (γονέας) μπορεί να συσχετιστεί

με πολλές σειρές του πίνακα Προβολή (παιδικό). Τα ζεύγη γραμμών που δημιουργούνται όταν εκτελείται ένα ερώτημα είναι το αποτέλεσμα όλων των έγκυρων συνδυασμών σειρών στους πίνακες θυγατρικών και γονικών. Η ενότητα 3.2.5 περιγράφει πώς, σε μια σχεσιακή βάση δεδομένων, το πρωτεύον και το ξένο κλειδί των πινάκων δημιουργούν μια σχέση γονέα-παιδιού. Ένας πίνακας που περιέχει ένα ξένο κλειδί είναι συνήθως θυγατρικός, ενώ ένας πίνακας που περιέχει ένα πρωτεύον κλειδί θα είναι πάντα γονέας. Για να χρησιμοποιήσετε μια σχέση γονέα-παιδιού σε ένα ερώτημα SQL, πρέπει να καθορίσετε μια συνθήκη αναζήτησης που συγκρίνει το ξένο κλειδί και το πρωτεύον κλειδί. Το Παράδειγμα 24 συγκρίνει το πρωτεύον κλειδί του πίνακα Client (γ. clientNo) με ξένο κλειδίΠροβολή πινάκων (v. clientNo).

Το πρότυπο SQL παρέχει επιπλέον τους ακόλουθους τρόπους ορισμού αυτής της σύνδεσης:

ΑΠΟΠελάτης με ΕΝΩΝΩΠροβολή v ΕΠΙ c.clientNo = v.clientNo

ΑΠΟΠελάτης J OINΠροβολή ΧΡΗΣΗπελάτη Αρ

ΑΠΟΠελάτης ΦΥΣΙΚΗ ΣΥΝΔΕΣΗΠροβολή

Σε κάθε περίπτωση, η κατασκευή FROM αντικαθιστά πρωτότυπα σχέδιαΑΠΟ και ΠΟΥ. Ωστόσο, η πρώτη επιλογή δημιουργεί έναν πίνακα με δύο ίδιες στήλες clientNo, ενώ στις άλλες δύο περιπτώσεις ο πίνακας που προκύπτει θα περιέχει μόνο μία στήλη clientNo.

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

που απαντούν.

ΕΠΙΛΕΓΩs.branchNo, s.staffNo, fName, IName, ιδιοκτησία Αρ

ΑΠΟStaff s, PropertyForRent σελ

ΟΠΟΥs.staffNo = p.staffNo

ΠΑΡΑΓΓΕΛΙΑ ΑΠΟs.branchNo, s.staffNo, propertyNo;

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

Πίνακας 35

Αποτέλεσμα της αίτησης

υποκατάστημα αρ Προσωπικό Αρ fName IName ακίνητο αρ
ΠΟΥ SG14 Δαβίδ Πέρασμα PG16
ΠΟΥ SG37 Άννα Φηγός PG21
ΠΟΥ SG37 Άννα Φηγός PG36
BOO5 SL41 Μαρία Υπήνεμος PL94
SBI7 SA9 Τζούλι Howe PA14

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

ΕΠΙΛΕΓΩ b.branchNo, b.city, s.staffNo, fName, IName, ιδιοκτησία Αρ.

ΑΠΟΥποκατάστημα β, Staff s, PropertyFor Rent σελ

ΟΠΟΥ b.branchNo = s.branchNo ΚΑΙ s.staffNo = p.staffNo

ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ b.branchNo, s.staffNo, propertyNo;

Ο πίνακας που προκύπτει πρέπει να περιέχει στήλες από τρεις πίνακες προέλευσης—Branch, Staff και PropertyForRent—άρα το ερώτημα πρέπει να ενώνει αυτούς τους πίνακες. Οι πίνακες Branch και Staff μπορούν να ενωθούν χρησιμοποιώντας τη συνθήκη b.branchNo=*s .branchNo, με αποτέλεσμα τα υποκαταστήματα της εταιρείας να συνδέονται με το προσωπικό που εργάζεται σε αυτά. Οι πίνακες Staff και PropertyForRent μπορούν να ενωθούν χρησιμοποιώντας τη συνθήκη s.staffNo=p.staffNo. Ως αποτέλεσμα, κάθε εργαζόμενος θα συνδέεται με τα ενοικιαζόμενα ακίνητα για τα οποία είναι υπεύθυνος. Τα αποτελέσματα του ερωτήματος παρουσιάζονται στον πίνακα. 36.

Πίνακας 36

Αποτελέσματα ερωτημάτων

υποκατάστημα αρ πόλη προσωπικόMo fName IName ακίνητο αρ
B003 Γλασκώβη SG14 Δαβίδ Πέρασμα PG16
B003 Γλασκώβη SG37 Άννα Φηγός PG21
B003 Γλασκώβη SG37 Άννα Φηγός PG36
B005 Λονδίνο SL41 Τζούλι Υπήνεμος PL94
B007 Είδος σκωτσέζικου τερριέ SA9 Μαρία Howe PA14

Σημειώστε ότι το πρότυπο SQL σας επιτρέπει να χρησιμοποιήσετε εναλλακτική επιλογήδιατυπώσεις των κατασκευών FROM και WHERE:

ΑΠΟ(Κλάδος β JOIN Staff s USING Αρ. υποκαταστήματος) ΩΣ bs

ΕΝΩΝΩPropertyForRent σελ ΧΡΗΣΗπροσωπικού Αρ

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

ΕΠΙΛΕΓΩs.branchNo, S.staffNo, ΚΟΜΗΣ(*) ΩΣκόμης

FROM Staff s, PropertyForRent σελ

ΟΠΟΥ S.staffNo = p.staffNo

ΟΜΑΔΑ ΑΠΟs.branchNo, s.staffNo

ΠΑΡΑΓΓΕΛΙΑ ΑΠΟs.branchNo, s.staffNo;

Για να συντάξετε την απαιτούμενη αναφορά, πρέπει πρώτα να μάθετε ποιος από τους υπαλλήλους της εταιρείας είναι υπεύθυνος για τα ενοικιαζόμενα ακίνητα. Αυτό το πρόβλημα μπορεί να λυθεί συνδέοντας τους πίνακες Staff και PropertyForRent χρησιμοποιώντας τη στήλη staffNo στις ρήτρες FROM/WHERE. Στη συνέχεια είναι απαραίτητο να σχηματιστούν ομάδες αποτελούμενες από τον αριθμό τμήματος και τους αριθμούς προσωπικού των υπαλλήλων του, για τις οποίες θα πρέπει να χρησιμοποιηθεί η κατασκευή GROUP BY. Τέλος, ο πίνακας που προκύπτει πρέπει να ταξινομηθεί χρησιμοποιώντας τον όρο ORDER BY. Τα αποτελέσματα του ερωτήματος παρουσιάζονται στον πίνακα. 37.

Πίνακας 37

Αποτέλεσμα της αίτησης

υποκατάστημα αρ προσωπικού Αρ κόμης
В00З SG14
В00З SG37
B005 SL41
B007 SA9

Κάνοντας συνδέσεις.Μια ένωση είναι ένα υποσύνολο ενός γενικότερου συνδυασμού δεδομένων από δύο πίνακες που καλούνται Καρτεσιανή. Το καρτεσιανό γινόμενο δύο πινάκων είναι ένας άλλος πίνακας που αποτελείται από όλα τα πιθανά ζεύγη σειρών που αποτελούν μέρος και των δύο πινάκων. Το σύνολο των στηλών στον πίνακα που προκύπτει είναι όλες οι στήλες του πρώτου πίνακα ακολουθούμενες από όλες τις στήλες του δεύτερου πίνακα. Εάν εισαγάγετε ένα ερώτημα σε δύο πίνακες χωρίς να καθορίσετε έναν όρο WHERE, το αποτέλεσμα του ερωτήματος στο περιβάλλον SQL θα είναι το καρτεσιανό γινόμενο αυτών των πινάκων. Επιπλέον, το πρότυπο ISO παρέχει μια ειδική μορφή για τη δήλωση SELECT που σας επιτρέπει να υπολογίσετε το καρτεσιανό γινόμενο δύο πινάκων:

SELECT(*j στήληΛίστα]

ΑΠΟ τραπέζιΌνομα ΣΥΝΔΕΣΗ ΣΤΑΥΡΟΣCaYeUlte2

Ας δούμε ξανά ένα παράδειγμα στο οποίο η σύνδεση των πινάκων πελάτη και Προβολή πραγματοποιείται χρησιμοποιώντας κοινή στήλη clientNo, Όταν εργάζεστε με πίνακες των οποίων τα περιεχόμενα δίνονται στον πίνακα. 3.6 και 3.8, το καρτεσιανό γινόμενο αυτών των πινάκων θα περιέχει 20 σειρές (4 σειρές πίνακα πελάτη x 5 σειρές πίνακα προβολής = 20 σειρές). Αυτό ισοδυναμεί με την έκδοση του ερωτήματος που χρησιμοποιείται στο Παράδειγμα 5.24, αλλά χωρίς τη χρήση της ρήτρας WHERE. Η διαδικασία για τη δημιουργία ενός πίνακα που περιέχει τα αποτελέσματα της ένωσης δύο πινάκων χρησιμοποιώντας την πρόταση SELECT είναι η εξής.

1. Σχηματίζεται ένα καρτεσιανό γινόμενο των πινάκων που καθορίζονται στην κατασκευή FROM.

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

3. Για κάθε γραμμή που απομένει, προσδιορίζεται η τιμή κάθε στοιχείου που καθορίζεται στη λίστα SELECT, με αποτέλεσμα μια ξεχωριστή γραμμή του πίνακα που προκύπτει.

4. Εάν το αρχικό ερώτημα περιέχει την κατασκευή SELECT DISTINCT, όλες οι διπλές σειρές αφαιρούνται από τον πίνακα που προκύπτει.

5. Εάν το ερώτημα που εκτελείτε περιέχει μια ρήτρα ORDER BY,


©2015-2019 ιστότοπος
Όλα τα δικαιώματα ανήκουν στους δημιουργούς τους. Αυτός ο ιστότοπος δεν διεκδικεί την πνευματική ιδιοκτησία, αλλά παρέχει δωρεάν χρήση.
Ημερομηνία δημιουργίας σελίδας: 07-08-2016

ΟΜΑΔΑ ΑΝΑ ρήτρα(Επιλογές δηλώσεων) σας επιτρέπει να ομαδοποιήσετε δεδομένα (γραμμές) με βάση την τιμή μιας στήλης ή πολλών στηλών ή παραστάσεων. Το αποτέλεσμα θα είναι ένα σύνολο συνοπτικών σειρών.

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

Μπορείτε να ομαδοποιήσετε έναν πίνακα με οποιονδήποτε συνδυασμό στηλών του.

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

Οι συγκεντρωτικές συναρτήσεις καθορίζονται στη λίστα στηλών μιας πρότασης SELECT, η οποία μπορεί επίσης να περιέχει μια πρόταση GROUP BY. Εάν η πρόταση SELECT δεν έχει όρο GROUP BY και η λίστα των στηλών επιλογής περιέχει τουλάχιστον, μία αθροιστική συνάρτηση, τότε δεν πρέπει να περιέχει απλές στήλες. Από την άλλη πλευρά, η λίστα επιλογής στηλών μπορεί να περιέχει ονόματα στηλών που δεν είναι ορίσματα στη συνάρτηση συγκεντρωτικών στοιχείων, εάν αυτές οι στήλες είναι ορίσματα στον όρο GROUP BY.

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

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

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

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

Συγκεντρωτική συνάρτηση COUNTέχει δύο διαφορετικές μορφές:

  • COUNT(col_name) - μετράει τον αριθμό των τιμών στη στήλη col_name, οι τιμές NULL δεν λαμβάνονται υπόψη
  • COUNT(*) - μετράει τον αριθμό των σειρών στον πίνακα, λαμβάνονται επίσης υπόψη οι τιμές NULL

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

COUNT_BIG συνάρτησηπαρόμοια με τη συνάρτηση COUNT. Η μόνη διαφορά μεταξύ τους είναι ο τύπος του αποτελέσματος που επιστρέφουν: η συνάρτηση COUNT_BIG επιστρέφει πάντα BIGINT τιμές, ενώ η συνάρτηση COUNT επιστρέφει INTEGER τιμές δεδομένων.

ΣΕ ΕΧΕΙ προσφοράορίζει μια συνθήκη που ισχύει για μια ομάδα σειρών. Έχει την ίδια σημασία για ομάδες σειρών με την πρόταση WHERE για τα περιεχόμενα του αντίστοιχου πίνακα (WHERE ισχύει πριν από την ομαδοποίηση, HAVING μετά).

Ας μάθουμε να συνοψίζουμε. Όχι, αυτά δεν είναι τα αποτελέσματα της μελέτης της SQL, αλλά τα αποτελέσματα των τιμών των στηλών των πινάκων της βάσης δεδομένων. Οι συγκεντρωτικές συναρτήσεις SQL λειτουργούν στις τιμές μιας στήλης για να παράγουν μια ενιαία τιμή που προκύπτει. Οι πιο συχνά χρησιμοποιούμενες συναρτήσεις συγκεντρωτικών SQL είναι SUM, MIN, MAX, AVG και COUNT. Είναι απαραίτητο να γίνει διάκριση μεταξύ δύο περιπτώσεων χρήσης συγκεντρωτικών συναρτήσεων. Πρώτον, οι αθροιστικές συναρτήσεις χρησιμοποιούνται από μόνες τους και επιστρέφουν μια μοναδική τιμή αποτελέσματος. Δεύτερον, οι συγκεντρωτικές συναρτήσεις χρησιμοποιούνται με τον όρο SQL GROUP BY, δηλαδή ομαδοποίηση κατά πεδία (στήλες) για να ληφθούν οι προκύπτουσες τιμές σε κάθε ομάδα. Ας εξετάσουμε πρώτα περιπτώσεις χρήσης συγκεντρωτικών συναρτήσεων χωρίς ομαδοποίηση.

Λειτουργία SQL SUM

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

ΕΠΙΛΕΞΤΕ ΣΥΝΟΛΟ (COLUMN_NAME) ...

Αυτή η έκφραση ακολουθείται από FROM (TABLE_NAME) και στη συνέχεια μπορεί να καθοριστεί μια συνθήκη χρησιμοποιώντας τον όρο WHERE. Επιπλέον, το όνομα της στήλης μπορεί να προηγείται από DISTINCT, που σημαίνει ότι θα μετρώνται μόνο οι μοναδικές τιμές. Από προεπιλογή, λαμβάνονται υπόψη όλες οι τιμές (για αυτό μπορείτε να καθορίσετε συγκεκριμένα όχι DISTINCT, αλλά ALL, αλλά η λέξη ALL δεν απαιτείται).

Παράδειγμα 1.Υπάρχει μια βάση δεδομένων της εταιρείας με δεδομένα για τα τμήματα και τους υπαλλήλους της. Ο πίνακας Προσωπικού έχει επίσης μια στήλη με στοιχεία για τους μισθούς των εργαζομένων. Η επιλογή από τον πίνακα μοιάζει με αυτό (για να μεγεθύνετε την εικόνα, κάντε κλικ πάνω της με το αριστερό κουμπί του ποντικιού):

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

ΕΠΙΛΕΞΤΕ ΠΟΣΟ (Μισθός) ΑΠΟ Προσωπικό

Αυτό το ερώτημα θα επιστρέψει την τιμή 287664,63.

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

Λειτουργία SQL MIN

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

Παράδειγμα 3.Η βάση δεδομένων και ο πίνακας είναι τα ίδια όπως στο παράδειγμα 1.

Πρέπει να μάθουμε τον κατώτατο μισθό για τους υπαλλήλους του τμήματος 42. Για να το κάνετε αυτό, γράψτε το ακόλουθο αίτημα:

Το ερώτημα θα επιστρέψει την τιμή 10505,90.

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


Παράδειγμα 4.Ο πίνακας Org προστίθεται στον πίνακα Staff, που περιέχει δεδομένα για τα τμήματα της εταιρείας. Εκτυπώστε τον ελάχιστο αριθμό ετών που εργάστηκε από έναν υπάλληλο σε ένα τμήμα που βρίσκεται στη Βοστώνη.

Λειτουργία SQL MAX

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

Παράδειγμα 5.

Πρέπει να μάθουμε τον μέγιστο μισθό των υπαλλήλων του τμήματος 42. Για να το κάνετε αυτό, γράψτε το ακόλουθο αίτημα:

Το ερώτημα θα επιστρέψει την τιμή 18352,80

Ήρθε η ώρα ασκήσεις για ανεξάρτητη λύση.

Παράδειγμα 6.Εργαζόμαστε και πάλι με δύο τραπέζια - Προσωπικό και Οργαν. Εμφανίστε το όνομα του τμήματος και τη μέγιστη αξία της προμήθειας που έλαβε ένας υπάλληλος στο τμήμα που ανήκει στην ομάδα τμημάτων (Division) Eastern. Χρήση JOIN (σύνδεση τραπεζιών) .

Λειτουργία SQL AVG

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

Παράδειγμα 7.Η βάση δεδομένων και ο πίνακας είναι τα ίδια όπως στα προηγούμενα παραδείγματα.

Ας υποθέσουμε ότι θέλετε να μάθετε τη μέση προϋπηρεσία των υπαλλήλων του τμήματος 42. Για να το κάνετε αυτό, γράψτε το ακόλουθο ερώτημα:

Το αποτέλεσμα θα είναι 6,33

Παράδειγμα 8.Δουλεύουμε με ένα τραπέζι - Προσωπικό. Εμφάνιση του μέσου μισθού των εργαζομένων με 4 έως 6 χρόνια εμπειρίας.

Συνάρτηση SQL COUNT

Η συνάρτηση SQL COUNT επιστρέφει τον αριθμό των εγγραφών σε έναν πίνακα βάσης δεδομένων. Εάν καθορίσετε SELECT COUNT(COLUMN_NAME) ... στο ερώτημα, το αποτέλεσμα θα είναι ο αριθμός των εγγραφών χωρίς να λαμβάνονται υπόψη εκείνες οι εγγραφές στις οποίες η τιμή της στήλης είναι NULL (μη καθορισμένη). Αν χρησιμοποιήσετε έναν αστερίσκο ως επιχείρημα και ξεκινήστε ΕΠΙΛΟΓΗ ερωτήματος COUNT(*) ..., τότε το αποτέλεσμα θα είναι ο αριθμός όλων των εγγραφών (σειρών) του πίνακα.

Παράδειγμα 9.Η βάση δεδομένων και ο πίνακας είναι τα ίδια όπως στα προηγούμενα παραδείγματα.

Θέλετε να μάθετε τον αριθμό όλων των υπαλλήλων που λαμβάνουν προμήθειες. Ο αριθμός των υπαλλήλων των οποίων οι τιμές στηλών Comm δεν είναι NULL θα επιστραφεί με το ακόλουθο ερώτημα:

SELECT COUNT(Comm) FROM Staff

Το αποτέλεσμα θα είναι 11.

Παράδειγμα 10.Η βάση δεδομένων και ο πίνακας είναι τα ίδια όπως στα προηγούμενα παραδείγματα.

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

ΕΠΙΛΕΞΤΕ COUNT(*) ΑΠΟ Προσωπικό

Το αποτέλεσμα θα είναι 17.

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

Παράδειγμα 11.Δουλεύουμε με ένα τραπέζι - Προσωπικό. Εμφάνιση του αριθμού των εργαζομένων στο τμήμα προγραμματισμού (Plains).

Συγκεντρωτικές συναρτήσεις με SQL GROUP BY

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

Παράδειγμα 12.Υπάρχει μια βάση δεδομένων της πύλης διαφημίσεων. Διαθέτει έναν πίνακα διαφημίσεων που περιέχει δεδομένα σχετικά με τις διαφημίσεις που υποβλήθηκαν για την εβδομάδα. Η στήλη Κατηγορία περιέχει δεδομένα σχετικά με μεγάλες κατηγορίες διαφημίσεων (για παράδειγμα, Real Estate) και η στήλη Ανταλλακτικά περιέχει δεδομένα σχετικά με μικρότερα τμήματα που περιλαμβάνονται στις κατηγορίες (για παράδειγμα, τα τμήματα Διαμερίσματα και εξοχικά σπίτια είναι τμήματα της κατηγορίας Real Estate). Η στήλη Μονάδες περιέχει δεδομένα για τον αριθμό των διαφημίσεων που υποβλήθηκαν και η στήλη Χρήματα περιέχει δεδομένα σχετικά με το χρηματικό ποσό που ελήφθη για την υποβολή διαφημίσεων.

ΚατηγορίαΜέροςΜονάδεςΧρήματα
ΜεταφοράΑυτοκίνητα110 17600
ΑκίνηταΔιαμερίσματα89 18690
ΑκίνηταΝτάχας57 11970
ΜεταφοράΜοτοσικλέτες131 20960
Υλικά κατασκευήςσανίδες68 7140
Ηλεκτρολόγος Μηχανικόςτηλεοράσεις127 8255
Ηλεκτρολόγος ΜηχανικόςΨυγεία137 8905
Υλικά κατασκευήςRegips112 11760
Ελεύθερος χρόνοςΒιβλία96 6240
ΑκίνηταΚατά οίκον47 9870
Ελεύθερος χρόνοςΜουσική117 7605
Ελεύθερος χρόνοςΠαιχνίδια41 2665

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