Υπάρχει περιγραφή sql. Ένθετα και συνδεδεμένα υποερωτήματα σε SQL, ΥΠΑΡΧΕΙ κατηγόρημα. Παραδείγματα για το κατηγόρημα της ποσοτικής σύγκρισης

Novosibirsk State Academy of Economics and Management

ΕΡΓΑΣΤΗΡΙΑΚΗ ΠΡΑΚΤΙΚΗ ΠΕΙΘΑΡΧΙΑΣ

"ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ"

Εργαστηριακή εργασία Νο 7

"Γλώσσα βάσης δεδομένων SQL: εντολές χειρισμού δεδομένων»

NOVOSIBIRSK 2000

Η SQL είναι μια συντομογραφία του Structured Query Language. Από το όνομα της γλώσσας είναι σαφές ότι ο κύριος σκοπός της είναι η δημιουργία ερωτημάτων για τη λήψη πληροφοριών από μια βάση δεδομένων. Οι εντολές για την ανάκτηση δεδομένων αποτελούν τη βάση της γλώσσας χειρισμού δεδομένων DML - αναπόσπαστο μέρος της γλώσσας SQL. Ωστόσο, το DML αποτελείται από περισσότερα από εντολές για την ανάκτηση δεδομένων από μια βάση δεδομένων. Υπάρχουν επίσης εντολές για τροποποίηση δεδομένων, διαχείριση δεδομένων και άλλες.

Η εργαστηριακή εργασία εξετάζει τα βασικά εργαλεία της γλώσσας DML. Κατά τη διάρκεια αυτού του εργαστηρίου θα τηρούμε το πρότυπο SQL2.

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

Για την εκτέλεση εργαστηριακών εργασιών, απαιτείται γνώση των βασικών στοιχείων του μοντέλου σχεσιακών δεδομένων, των βασικών στοιχείων της σχεσιακής άλγεβρας και του σχεσιακού λογισμού και των αρχών εργασίας με το MS SQL Server DBMS.

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

ΕΙΣΑΓΩΓΗ

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

Η αρχική δομή της σύνταξης SQL βασίστηκε (ή τουλάχιστον φαινόταν να βασίζεται) στον σχεσιακό λογισμό του Codd. Η μόνη υποστηριζόμενη πράξη στη σχεσιακή άλγεβρα ήταν η ένωση.

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

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

Απλές ερωτήσεις

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

Απλό αίτημα.Ένα ερώτημα που έχει πρόσβαση μόνο σε έναν πίνακα βάσης δεδομένων.

Αίτηση:Ποιος εργάζεται ως σοβατζής;

WHERE SKILL_TYPE = "Γύψος"

Αποτέλεσμα:

G.Rickover

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

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

ρήτρα SELECT.Καθορίζει τις στήλες του πίνακα που προκύπτει.

Από. Ο όρος FROM καθορίζει έναν ή περισσότερους πίνακες στους οποίους έχει πρόσβαση το ερώτημα. Όλες οι στήλες που παρατίθενται στις ρήτρες SELECT και WHERE πρέπει να υπάρχουν σε έναν από τους πίνακες που παρατίθενται στην εντολή FROM. Στην SQL2, αυτοί οι πίνακες μπορούν να οριστούν απευθείας στο σχήμα ως πίνακες βάσης ή προβολές δεδομένων ή μπορούν οι ίδιοι να είναι πίνακες χωρίς όνομα που προκύπτουν από ερωτήματα SQL. Στην τελευταία περίπτωση, το αίτημα δίνεται ρητά στην εντολή FROM.

Η φράση ΑΠΟ.Καθορίζει τους υπάρχοντες πίνακες στους οποίους έχει πρόσβαση το ερώτημα.

Οπου. Η ρήτρα WHERE περιέχει μια συνθήκη. βάσει των οποίων επιλέγονται οι σειρές του(των) πίνακα(ων). Στο παράδειγμά μας, η προϋπόθεση είναι ότι η στήλη SKILL_TYPE πρέπει να περιέχει τη σταθερά "Plasterer" που περικλείεται σε απόστροφα, όπως γίνεται πάντα με τις σταθερές κειμένου στην SQL. Η ρήτρα WHERE είναι η πιο ασταθής εντολή SQL. μπορεί να περιέχει πολλές διαφορετικές συνθήκες. Μεγάλο μέρος της συζήτησής μας θα αφιερωθεί στην απεικόνιση των διαφόρων δομών που επιτρέπονται στην εντολή WHERE.

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

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

Αίτηση:Παρέχετε όλες τις πληροφορίες σχετικά με τα κτίρια γραφείων.

WHERE TYPE = "Γραφείο"

Αποτέλεσμα:

BLDG IDADDRESSTYPEQLTY LEVELSTATUS

312 Elm St., 123 Office 2 2

210 Berezovaya st. 1011 Office Z 1

111 Osinovaya st. 1213 Office 4 1

Ένας αστερίσκος (*) σε μια εντολή SELECT σημαίνει "ολόκληρη τη σειρά". Αυτή είναι μια βολική συντομογραφία που θα χρησιμοποιούμε συχνά.

Αίτηση:Ποιος είναι ο εβδομαδιαίος μισθός για κάθε ηλεκτρολόγο;

ΕΠΙΛΕΞΤΕ ΟΝΟΜΑ, "Εβδομαδιαίος μισθός = ", 40 * HRLY_RATE

WHERE SKILL_TYPE = "Ηλεκτρολόγος"

Αποτέλεσμα:

Μ. Faraday Εβδομαδιαίος μισθός = 500,00

H.Columbus Εβδομαδιαίος μισθός = 620,00

Αυτό το ερώτημα απεικονίζει τη χρήση και των δύο σταθερών χαρακτήρων (στο παράδειγμά μας "Εβδομαδιαίος μισθός = ") και υπολογισμών στην εντολή SELECT. Μέσα στη δήλωση SELECT, μπορείτε να εκτελέσετε υπολογισμούς που χρησιμοποιούν αριθμητικές στήλες και αριθμητικές σταθερές, καθώς και τυπικούς αριθμητικούς τελεστές ( +, -, *, /), ομαδοποιημένα ανάλογα με τις ανάγκες χρησιμοποιώντας παρενθέσεις. Έχουμε επίσης συμπεριλάβει μια νέα εντολή ORDER BY που ταξινομεί το αποτέλεσμα του ερωτήματος με αύξουσα αλφαριθμητική σειρά κατά την καθορισμένη στήλη. Εάν θέλετε να ταξινομήσετε τα αποτελέσματα με φθίνουσα σειρά, πρέπει να προσθέσετε DESC στην εντολή. Η ρήτρα ORDER BY μπορεί να ταξινομήσει τα αποτελέσματα κατά πολλές στήλες, μερικές σε αύξουσα σειρά και άλλες σε φθίνουσα σειρά. Η στήλη πρωτεύοντος κλειδιού της ταξινόμησης παρατίθεται πρώτη.

Σταθερά χαρακτήρων.Μια σταθερά που αποτελείται από γράμματα, αριθμούς και «ειδικούς» χαρακτήρες.

Αίτηση:Ποιος έχει ωριαία χρέωση από $10 έως $12;

WHERE HRLY_RATE > = 10 ΚΑΙ HRLY_RATE< - 12

Αποτέλεσμα:

ΤΑΥΤΟΤΗΤΑ ΕΡΓΑΤΟΥΟΝΟΜΑ HRLY_RATE SKILL_TYPE SUPV_ID

Αυτό το ερώτημα επεξηγεί ορισμένα από τα πρόσθετα χαρακτηριστικά της πρότασης WHERE: τελεστές σύγκρισης και ο τελεστής Boolean AND. Έξι τελεστές σύγκρισης (=,<>(όχι ίσο),<, >, <=, >=). Οι τελεστές Boole AND, OR και NOT μπορούν να χρησιμοποιηθούν για τη δημιουργία σύνθετων συνθηκών ή για την άρνηση μιας συνθήκης. Οι παρενθέσεις μπορούν να χρησιμοποιηθούν για την ομαδοποίηση συνθηκών, όπως συνηθίζεται στις γλώσσες προγραμματισμού.

Συγκριτικοί τελεστές =,<>, <, >, <=, >=.

Λειτουργίες BooleanΚΑΙ (ΚΑΙ), Ή (Ή) και ΟΧΙ (ΑΥΤΟΣ) .

Θα μπορούσατε επίσης να χρησιμοποιήσετε τον τελεστή BETWEEN (between) για να διατυπώσετε αυτό το ερώτημα:

ΠΟΥ HRLY_RATE Μεταξύ 10 ΚΑΙ 12

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

Αίτημα: Καταγράψτε σοβατζήδες, στεγαστές και ηλεκτρολόγους.

WHERE SKILL_TYPE IN ("Γύψος", "Στέγη", "Ηλεκτρολόγος")

Αποτέλεσμα:

WORKER_ID ΟΝΟΜΑ HRLY_RATE SKILL_TYPE SUPV_ID

1412 Κ.Νέμο 13,75 Γύψος 1520

2920 R. Garrett 10.00 Roofer 2920

1520 G. Rickover 11.75 Γύψος 1520

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

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

Σύμβολα μοτίβων.Χαρακτήρες που αντικαθιστούν ακαθόριστες συμβολοσειρές χαρακτήρων.

Αίτηση:Καταγράψτε τους υπαλλήλους των οποίων ο τύπος ειδικότητας αρχίζει με "Elek".

WHERE SKILL_TYPE LIKE ("Elect%")

Αποτέλεσμα:

Αναγνωριστικό ΕΡΓΑΤΗ ΟΝΟΜΑ HRLY_RATE SKILL_TYPE SUPV_ID

1235 M. Faraday 12.50 Ηλεκτρολόγος 1311

1311 H. Columbus 15.50 Electric 1311

Η SQL έχει δύο χαρακτήρες μπαλαντέρ: % (ποσοστό) και _ (υπογράμμιση). Η υπογράμμιση αντικαθιστά ακριβώς έναν απροσδιόριστο χαρακτήρα. Το ποσοστό αντικαθιστά έναν αυθαίρετο αριθμό χαρακτήρων, ξεκινώντας από το μηδέν. Όταν χρησιμοποιούνται χαρακτήρες μπαλαντέρ, απαιτείται ένας τελεστής LIKE για τη σύγκριση μεταβλητών χαρακτήρων με σταθερές. Άλλα παραδείγματα:

ΟΝΟΜΑ ΑΡΕΣΕΙ "__Columbus"

ΟΝΟΜΑ ΑΡΕΣΕΙ "__K%"

Η συνθήκη στο πρώτο παράδειγμα είναι αληθής εάν το NAME αποτελείται από δύο χαρακτήρες ακολουθούμενους από το "Columbus". Στον πίνακα WORKER, όλα τα ονόματα ξεκινούν με ένα πρώτο αρχικό και μια τελεία. Έτσι, χρησιμοποιώντας αυτή τη συνθήκη. Ας βρούμε όλους τους εργαζόμενους με το επίθετο «Κολόμβος». Η συνθήκη του δεύτερου παραδείγματος μας επιτρέπει να βρούμε όλους τους υπαλλήλους των οποίων τα επώνυμα αρχίζουν με το γράμμα "K".

Αίτηση:Βρείτε όλες τις δουλειές που ξεκινούν μέσα στις επόμενες δύο εβδομάδες.

ΠΟΥ START_DATE ΜΕΤΑΞΥ ΤΟΥ CURRENT_DATE ΚΑΙ

Αποτέλεσμα:(Υποθέστε ότι η τρέχουσα ημερομηνία είναι CURRENT DATE = 10.10)

WORKER_ID BLDG_ID START_DATE NUM_DAYS

1235 312 10.10 5

1235 515 17.10 22

3231 111 10.10 8

1412 435 15.10 15

3231 312 24.10 20

1311 460 23.10 24

Αυτό το ερώτημα απεικονίζει τη χρήση του τελεστή BETWEEN με τιμές ημερομηνίας και διαστήματος. Η CURRENT_DATE είναι μια συνάρτηση που επιστρέφει πάντα τη σημερινή ημερομηνία. Εκφραση

CURRENT_DATE + INTERVAL "14" ΗΜΕΡΑ

προσθέτει μια περίοδο δύο εβδομάδων στην τρέχουσα ημερομηνία. Έτσι, επιλέγεται ASIGNMENT (υποθέτοντας ότι σήμερα είναι 10/10) εάν η τιμή της στήλης START_DATE είναι μεταξύ 10/10 και 10/24. Από αυτό μπορούμε να δούμε ότι μπορούμε να προσθέσουμε τιμές διαστήματος στα πεδία ημερομηνίας. Επιπλέον, μπορούμε να πολλαπλασιάσουμε τις τιμές των διαστημάτων με ακέραιες τιμές. Για παράδειγμα, ας υποθέσουμε ότι θέλουμε να μάθουμε ποιος αριθμός θα είναι σε έναν συγκεκριμένο αριθμό εβδομάδων (που συμβολίζεται με τη μεταβλητή NUM_WEEKS). Μπορούμε να το κάνουμε ως εξής:

CURRENT_DATE + INTERVAL "7" ΗΜΕΡΑ * NUM_WEEKS

2. Ερωτήματα πολλών πινάκων

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

Αίτηση:

Τα στοιχεία που χρειάζονται για την απάντηση βρίσκονται σε δύο πίνακες: ΕΡΓΑΤΗΣ και ΕΡΓΑΣΙΑ. Η λύση SQL απαιτεί την καταχώριση και των δύο πινάκων στην εντολή FROM και τον καθορισμό ενός ειδικού τύπου όρου WHERE:

ΕΠΙΛΕΞΤΕ SKILL_TYPE

ΑΠΟ ΕΡΓΑΖΟΜΕΝΗ, ΕΡΓΑΣΙΑ

WHERE WORKER.WORKER_ID = ASIGNMENT.WORKER_ID

ΚΑΙ BLDG_ID = 435

Τι συμβαίνει εδώ? Πρέπει να εξετάσουμε δύο στάδια στον τρόπο με τον οποίο το σύστημα επεξεργάζεται αυτό το αίτημα.

1. Ως συνήθως, η ρήτρα FROM επεξεργάζεται πρώτα. Ωστόσο, σε αυτήν την περίπτωση, επειδή η εντολή καθορίζει δύο πίνακες, το σύστημα δημιουργεί ένα καρτεσιανό γινόμενο των σειρών αυτών των πινάκων. Αυτό σημαίνει ότι δημιουργείται ένας μεγάλος πίνακας (λογικά) που αποτελείται από στήλες και από τους δύο πίνακες, με κάθε γραμμή ενός πίνακα να ζευγαρώνεται με κάθε γραμμή του άλλου πίνακα. Στο παράδειγμά μας, επειδή ο πίνακας WORKER έχει πέντε στήλες και ο πίνακας ASSIGNMENT έχει τέσσερις στήλες, το καρτεσιανό προϊόν που παράγεται από την εντολή FROM θα έχει εννέα στήλες. Ο συνολικός αριθμός σειρών του καρτεσιανού γινόμενου είναι ίσος με m * n, όπου m είναι ο αριθμός των σειρών του πίνακα WORKER. και n είναι ο αριθμός των σειρών στον πίνακα ASIGNMENT. Δεδομένου ότι ο πίνακας WORKER έχει 7 σειρές και ο πίνακας ASIGNMENT έχει 19 σειρές, το καρτεσιανό προϊόν θα περιέχει 7x19 ή 133 σειρές. Εάν η εντολή FROM παραθέτει περισσότερους από δύο πίνακες, δημιουργείται ένα καρτεσιανό γινόμενο όλων των πινάκων που καθορίζονται στην εντολή.

καρτεσιανό προϊόν. Το αποτέλεσμα της ένωσης κάθε σειράς ενός πίνακα με καθεμια σειρά από άλλο τραπέζι.

2. Μετά τη δημιουργία του γιγαντιαίου σχεσιακού πίνακα, το σύστημα χρησιμοποιεί την εντολή WHERE όπως πριν. Κάθε γραμμή του πίνακα που δημιουργείται από την εντολή FROM. ελέγχεται για να διαπιστωθεί εάν η συνθήκη WHERE ικανοποιείται. Οι σειρές που δεν πληρούν την προϋπόθεση εξαιρούνται από την εξέταση. Στη συνέχεια, η ρήτρα SELECT εφαρμόζεται στις υπόλοιπες σειρές.

Η ρήτρα WHERE στο ερώτημά μας περιέχει δύο προϋποθέσεις:

1. ΕΡΓΑΤΗΣ. WORKER_ID = ASIGNMENT.WORKER_ID

2. BLDG_ID = 435

Η πρώτη από αυτές τις προϋποθέσεις είναι η συνθήκη ένωσης. Σημειώστε ότι επειδή και οι δύο πίνακες WORKER και ASIGNMENT περιέχουν μια στήλη με το όνομα WORKER_ID, το καρτεσιανό γινόμενο τους θα περιέχει δύο στήλες με αυτό το όνομα. Για να τα διαφοροποιήσουμε, προηγούμε το όνομα της στήλης με το όνομα του πίνακα προέλευσης, διαχωρισμένο με μια τελεία.

Η πρώτη συνθήκη σημαίνει ότι σε οποιαδήποτε επιλεγμένη σειρά, η τιμή της στήλης WORKER_ID από τον πίνακα WORKER πρέπει να ταιριάζει με την τιμή της στήλης WORKER_ID από τον πίνακα ASSIGNMENT. Στην πραγματικότητα, ενώνουμε δύο πίνακες κατά WORKER_ID. Όλες οι σειρές στις οποίες οι τιμές αυτών των δύο στηλών δεν είναι ίσες εξαιρούνται από τον πίνακα προϊόντων. Ακριβώς το ίδιο συμβαίνει κατά την εκτέλεση της λειτουργίας φυσικής ένωσης της σχεσιακής άλγεβρας. (Ωστόσο, υπάρχει ακόμα κάποια διαφορά από μια φυσική σύνδεση: η SQL δεν καταργεί αυτόματα την επιπλέον στήλη WORKER_ID). Η πλήρης ένωση αυτών των δύο πινάκων με την πρόσθετη συνθήκη BLDG_ID = 435 φαίνεται στο Σχ. 1. Η χρήση της εντολής SELECT θα δώσει τελικά το ακόλουθο αποτέλεσμα ερωτήματος:

ΕΙΔΟΣ ΔΕΞΙΟΤΗΤΑΣ

Σοβατζής

Στεγαστής

Ηλεκτρολόγος

Ρύζι. 1. Ένταξη των πινάκων ΕΡΓΑΤΗΣ και ΕΡΓΑΣΙΑΣ

Τώρα θα δείξουμε πώς να συνδέσετε έναν πίνακα στον εαυτό του στην SQL.

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

ΕΠΙΛΕΞΤΕ A.WORKER_NAME, B.WORKER_NAME

ΑΠΟ ΤΟΝ ΕΡΓΑΤΗ Α, ΤΗΝ ΕΡΓΑΤΗ Β

WHERE B.WORKER_ID = A.SUPV_ID

Ο όρος FROM σε αυτό το παράδειγμα δημιουργεί δύο "αντίγραφα" του πίνακα WORKER, δίνοντάς τους τα ψευδώνυμα A και B. Ένα ψευδώνυμο είναι ένα εναλλακτικό όνομα που δίνεται στον πίνακα. Στη συνέχεια, τα αντίγραφα A και B του πίνακα WORKER ενώνονται με την εντολή WHERE με βάση την συνθήκη ισότητας του WORKER_ID στο B και του SUPV_ID στο A. Έτσι, κάθε γραμμή από το A ενώνεται με τη σειρά B, η οποία περιέχει πληροφορίες για τον διαχειριστή της σειράς A (Εικ. 2).

Ρύζι. 2. Συνένωση δύο αντιγράφων του πίνακα WORKER

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

A.NAMEB.NAME

M. Faraday H. Columbus

K.Nemo G.Rickover R.Garrett R.Garrett

P. Mason P. Mason G. Rickover G. Rickover H. Columbus H. Columbus J. Barrister P. Mason

Παρατσούκλι.Ένα εναλλακτικό όνομα που δίνεται στον πίνακα.

Ο A.WORKER_NAME αντιπροσωπεύει τον εργαζόμενο και ο B.WORKER_NAME τον διαχειριστή. Λάβετε υπόψη ότι ορισμένοι εργαζόμενοι είναι οι διευθυντές τους, κάτι που προκύπτει από την ισότητα WORKER_ID - SUPV_ID στις γραμμές τους.

Στην SQL, μπορείτε να συνδέσετε περισσότερους από δύο πίνακες τη φορά:

Αίτηση

ΕΠΙΛΟΓΗ WORKER_NAME

ΑΠΟ ΕΡΓΑΤΗ, ΕΡΓΑΣΙΑ, ΚΤΙΡΙΟ

WHERE WORKER.WORKER_ID = ASIGNMENT.WORKER_ID AND ASIGNMENT.BLDG_ID = BUILDING.BLDG_ID ΚΑΙ

TYPE = "Γραφείο"

Αποτέλεσμα:

M. Faraday

G.Rickover

J. Barrister

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

Οι εντολές SQL σε αυτό το ερώτημα δημιουργούν έναν πίνακα από τρεις πίνακες σχεσιακών βάσεων δεδομένων. Οι δύο πρώτοι πίνακες ενώνονται με WORKER_ID και μετά ο τρίτος πίνακας ενώνεται με BLDG_ID στον πίνακα που προκύπτει. Κατάσταση

TYPE = "Γραφείο"

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

3. Υποερωτήματα

Υποερώτημα.Ερώτημα μέσα σε ερώτημα

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

Αίτηση:Ποιες είναι οι ειδικότητες των εργαζομένων που τοποθετούνται στο κτίριο 435;

ΕΠΙΛΟΓΗ SKTLL_TYPE

FROM WORKER WHERE WORKER_ID IN

(ΕΠΙΛΟΓΗ WORKER_ID

WHERE BLDG_ID = 435)

Υποερώτημα σε αυτό το παράδειγμα

(ΕΠΙΛΟΓΗ WORKER_ID

WHERE BLDG_ID = 435)

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

ΤΑΥΤΟΤΗΤΑ ΕΡΓΑΤΟΥ

Εξωτερικό αίτημα.Το κύριο ερώτημα, το οποίο περιέχει όλα τα δευτερεύοντα ερωτήματα.

Αυτό το σύνολο αναγνωριστικών παίρνει στη συνέχεια τη θέση ενός δευτερεύοντος ερωτήματος στο εξωτερικό ερώτημα. Από αυτό το σημείο και μετά, το εξωτερικό ερώτημα εκτελείται χρησιμοποιώντας το σύνολο που δημιουργήθηκε από το υποερώτημα. Το εξωτερικό ερώτημα επεξεργάζεται κάθε γραμμή του πίνακα WORKER σύμφωνα με τον όρο WHERE. Εάν το WORKER_ID μιας σειράς βρίσκεται στο σύνολο (IN) που δημιουργήθηκε από το υποερώτημα, τότε επιλέγεται το SKILL_TYPE της σειράς και εμφανίζεται στον πίνακα που προκύπτει:

ΕΙΔΟΣ ΔΕΞΙΟΤΗΤΑΣ

Σοβατζής

Στεγαστής

Ηλεκτρολόγος

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

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

Μη συσχετισμένο υποερώτημα.Ένα υποερώτημα του οποίου η τιμή είναι ανεξάρτητη από οποιοδήποτε εξωτερικό ερώτημα.

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

Αίτηση: Καταγράψτε τους υπαλλήλους που έχουν τοποθετηθεί στα κτίρια γραφείων.

Και πάλι εξετάζουμε το ερώτημα με το οποίο εξετάσαμε τη σύνδεση.

ΕΠΙΛΟΓΗ WORKER_MAME

WHERE WORKER_ID IN

(ΕΠΙΛΟΓΗ WORKER_ID

WHERE BLDG_ID IN

WHERE TYPE = "Γραφείο"))

Αποτέλεσμα:

M. Faraday

G.Rickover

J. Barrister

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

Η εκτέλεση του ερωτήματος πραγματοποιείται με σειρά από μέσα προς τα έξω. Δηλαδή, πρώτα εκτελείται το πιο εσωτερικό ερώτημα (ή "κατώτατο"), μετά εκτελείται το υποερώτημα που το περιέχει και μετά το εξωτερικό ερώτημα.

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

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

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

ΕΠΙΛΟΓΗ WORKER_NAME

WHERE A.HRLY_RATE >

(ΕΠΙΛΟΓΗ B.HRLY_RATE

WHERE B.WORKER_ID = A.SUPV_ID)

Αποτέλεσμα:

Τα λογικά βήματα για την εκτέλεση αυτής της αίτησης είναι:

1. Το σύστημα δημιουργεί δύο αντίγραφα του πίνακα WORKER: αντίγραφο A και αντίγραφο B. Σύμφωνα με τον τρόπο που τα ορίσαμε, το A αναφέρεται στον υπάλληλο, το B αναφέρεται στον διευθυντή.

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

3. Το υποερώτημα επιλέγει την τιμή HRLY_RATE από τη σειρά Β, της οποίας το WORKER_ID είναι ίσο με το SUPV_ID της σειράς Α, που εξετάζεται αυτήν τη στιγμή από το κύριο ερώτημα. Αυτό είναι το HRLY_RATE του διαχειριστή.

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

ΥΠΑΡΧΕΙ και ΔΕΝ ΥΠΑΡΧΕΙ τελεστές

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

ΕΠΙΛΟΓΗ WORKER_ID

WHERE BLDG_ID ΟΧΙ 435

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

Μια σωστά διατυπωμένη λύση χρησιμοποιεί τον τελεστή NOT EXISTS:

ΕΠΙΛΟΓΗ WORKER_ID

ΟΠΟΥ ΔΕΝ ΥΠΑΡΧΕΙ

WHERE ASIGNMENT.WORKER_ID = WORKER.WORKER_ID ΚΑΙ

Αποτέλεσμα:

WORKER_ID

Οι τελεστές EXISTS και NOT EXISTS τοποθετούνται πάντα πριν από το υποερώτημα. Το EXISTS αξιολογείται ως true εάν το σύνολο που δημιουργείται από το υποερώτημα δεν είναι κενό. Εάν το σύνολο που δημιουργείται από το υποερώτημα είναι κενό, τότε το EXISTS παίρνει την τιμή "false". Ο χειριστής ΔΕΝ ΥΠΑΡΧΕΙ, φυσικά, λειτουργεί ακριβώς το αντίθετο. Είναι αληθές εάν το αποτέλεσμα του υποερωτήματος είναι κενό και ψευδές διαφορετικά.

ΥΠΑΡΧΕΙ χειριστής. Επιστρέφει true εάν το σύνολο αποτελεσμάτων δεν είναι κενό.

ΔΕΝ ΥΠΑΡΧΕΙ χειριστής. Επιστρέφει true εάν το σύνολο αποτελεσμάτων είναι κενό.

Σε αυτό το παράδειγμα χρησιμοποιήσαμε τον τελεστή ΔΕΝ ΥΠΑΡΧΕΙ. Το υποερώτημα επιλέγει όλες τις σειρές του πίνακα ASSIGNMENT στις οποίες το WORKER_ID έχει την ίδια τιμή με τη σειρά που εξετάζεται από το κύριο ερώτημα και το BLDG_ID είναι ίσο με 435. Εάν αυτό το σύνολο είναι κενό, τότε η γραμμή εργασίας που θεωρείται από το κύριο ερώτημα είναι επιλεγμένο, αφού αυτό σημαίνει ότι Αυτός ο υπάλληλος δεν εργάζεται στο κτίριο 435.

Στη λύση που δώσαμε, χρησιμοποιήσαμε ένα συσχετισμένο υποερώτημα. Αν χρησιμοποιήσουμε τον τελεστή IN αντί για NOT EXISTS, μπορούμε να τα καταφέρουμε με ένα μη συσχετισμένο υποερώτημα:

ΕΠΙΛΟΓΗ WORKER_ID

ΟΠΟΥ ΔΕΝ ΜΠΕΙ Ο ΕΡΓΑΤΗΣ_ID

(ΕΠΙΛΟΓΗ WORKER_ID

WHERE BLDG_ID = 435)

Αυτή η λύση είναι απλούστερη από τη λύση με τον τελεστή ΔΕΝ ΥΠΑΡΧΕΙ. Γεννιέται ένα φυσικό ερώτημα: γιατί χρειαζόμαστε ΥΠΑΡΧΕΙ και ΔΕΝ ΥΠΑΡΧΕΙ καθόλου; Η απάντηση είναι ότι το ΔΕΝ ΥΠΑΡΧΕΙ είναι ο μόνος τρόπος επίλυσης ερωτημάτων που περιέχουν τη λέξη "κάθε" στη συνθήκη. Τέτοια ερωτήματα επιλύονται στη σχεσιακή άλγεβρα χρησιμοποιώντας την πράξη διαίρεσης και στον σχεσιακό λογισμό χρησιμοποιώντας τον καθολικό ποσοτικοποιητή. Ακολουθεί ένα παράδειγμα ερωτήματος με τη λέξη "κάθε" στην κατάστασή του:

Αίτηση:Καταγράψτε τους υπαλλήλους που έχουν τοποθετηθεί σε κάθε κτίριο.

Αυτή η ερώτηση μπορεί να υλοποιηθεί σε SQL χρησιμοποιώντας διπλές αρνήσεις. Θα αναδιατυπώσουμε το ερώτημα ώστε να περιλαμβάνει ένα διπλό αρνητικό:

Αίτηση:Καταγράψτε τέτοιους υπαλλήλους για ποιους Δενυπάρχει ένα κτίριο στο οποίο δεν έχουν ανατεθεί.

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

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

(I) ΕΠΙΛΟΓΗ BLDG_ID

ΟΠΟΥ ΔΕΝ ΥΠΑΡΧΕΙ

ASIGNMENT.WORKER_ID = 1234)

Σημειώσαμε αυτό το ερώτημα (I) γιατί θα αναφερθούμε σε αυτό αργότερα. Εάν δεν υπάρχει κτίριο που να ικανοποιεί αυτό το αίτημα, τότε ο εργάτης 1234 εκχωρείται σε κάθε κτίριο και επομένως ικανοποιεί τις προϋποθέσεις του αρχικού αιτήματος. Για να λάβουμε μια λύση στο αρχικό ερώτημα, πρέπει να γενικεύσουμε το ερώτημα (I) από έναν συγκεκριμένο εργαζόμενο 1234 στη μεταβλητή WORKER_ID και να μετατρέψουμε αυτό το τροποποιημένο ερώτημα σε υποερώτημα του μεγαλύτερου ερωτήματος. Ιδού η λύση:

(II) ΕΠΙΛΟΓΗ ΕΡΓΑΤΟΥ_ID

ΟΠΟΥ ΔΕΝ ΥΠΑΡΧΕΙ

ΟΠΟΥ ΔΕΝ ΥΠΑΡΧΕΙ

WHERE ASIGNMENT.BLDG_ID = BUILDING.BLDG_ID ΚΑΙ

ASIGNMENT.WORKER_ID = WORKER.WORKER_ID)

Αποτέλεσμα:

ΤΑΥΤΟΤΗΤΑ ΕΡΓΑΤΟΥ

Σημειώστε ότι το υποερώτημα που ξεκινά από την τέταρτη γραμμή του ερωτήματος (II) είναι πανομοιότυπο με το ερώτημα (I), με το "1234" να αντικατασταθεί από το WORKER.WORKER_ID. Το ερώτημα (II) μπορεί να διαβαστεί ως εξής:

Επιλέξτε WORKER_ID από το WORKER εάν δεν υπάρχει κτίριο στο οποίο δεν έχει εκχωρηθεί το WORKER_ID.

Αυτό ταιριάζει με τους όρους του αρχικού αιτήματος.

Βλέπουμε ότι ο τελεστής ΔΕΝ ΥΠΑΡΧΕΙ μπορεί να χρησιμοποιηθεί για τη διατύπωση των ερωτημάτων που απαιτούσαν μια λειτουργία διαίρεσης στη σχεσιακή άλγεβρα και έναν καθολικό ποσοτικοποιητή στον σχεσιακό λογισμό. Από την άποψη της ευκολίας χρήσης, ο τελεστής ΔΕΝ ΥΠΑΡΧΕΙ δεν προσφέρει κανένα ιδιαίτερο όφελος, πράγμα που σημαίνει ότι τα ερωτήματα SQL που χρησιμοποιούν το ΔΕΝ ΥΠΑΡΧΕΙ δύο φορές δεν είναι ευκολότερα κατανοητά από τις λύσεις σχεσιακής άλγεβρας με διαίρεση ή λύσεις σχεσιακού λογισμού με καθολικούς ποσοτικοποιητές. Θα χρειαστεί περισσότερη έρευνα για τη δημιουργία γλωσσικών κατασκευών που επιτρέπουν την πιο φυσική επίλυση τέτοιων ερωτημάτων.

Ενσωματωμένες λειτουργίες

Ας εξετάσουμε ερωτήσεις αυτού του τύπου:

Ποιες είναι οι μέγιστες και οι ελάχιστες ωριαίες χρεώσεις; Ποιος είναι ο μέσος αριθμός ημερών που εργάζονται οι εργαζόμενοι στο κτίριο 435; Ποιος είναι ο συνολικός αριθμός των ημερών που διατίθενται για τις εργασίες σοβάτισμα στο κτίριο 312; Πόσες διαφορετικές ειδικότητες υπάρχουν;

Η απάντηση σε αυτές τις ερωτήσεις απαιτεί στατιστικές συναρτήσεις που εξετάζουν πολλές σειρές σε έναν πίνακα και επιστρέφουν μία μόνο τιμή. Υπάρχουν πέντε τέτοιες λειτουργίες στην SQL, που ονομάζονται ενσωματωμένες συναρτήσεις ή συναρτήσεις συνόλου. Αυτές οι συναρτήσεις είναι SUM (άθροισμα), AVG (μέσος όρος), COUNT (ποσότητα), MAX (μέγιστο) και MIN (ελάχιστο).

Ενσωματωμένη λειτουργία (συνάρτηση ρύθμισης). Μια στατιστική συνάρτηση που λειτουργεί σε πολλές σειρές: SUM (άθροισμα), AVG (μέσος όρος), COUNT (ποσότητα), MAX (μέγιστο), MIN (ελάχιστο).

Αίτηση:Ποιες είναι οι μέγιστες και οι ελάχιστες ωριαίες χρεώσεις;

SELECT MAX(HRLY_RATE), MIN(HRLY_RATE)

Αποτέλεσμα: 17.40, 8.20

Οι λειτουργίες MAX και MIN λειτουργούν σε μία στήλη πίνακα. Επιλέγουν τη μέγιστη ή την ελάχιστη τιμή, αντίστοιχα, από αυτή τη στήλη. Η διατύπωση ερωτήματός μας δεν περιέχει ρήτρα WHERE. Για τα περισσότερα ερωτήματα αυτό μπορεί να μην ισχύει, όπως δείχνει το επόμενο παράδειγμά μας.

Αίτηση:Ποιος είναι ο μέσος αριθμός ημερών που εργάζονται οι εργαζόμενοι στο κτίριο 435;

ΕΠΙΛΟΓΗ AVG (NUM_DAYS)

WHERE BLDG_ID =435

Αποτέλεσμα: 12.33

Αίτηση:Ποιος είναι ο συνολικός αριθμός των ημερών που διατίθενται για τις εργασίες σοβάτισμα στο κτίριο 312;

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

ΑΠΟ ΑΠΟΣΤΟΛΗ, ΕΡΓΑΖΟΜΕΝΟΣ

WHERE WORKER.WORKER_ID = ASIGNMENT.WORKER_ID ΚΑΙ

SKILL_TYPE = "Γύψος" ΚΑΙ

Αποτέλεσμα: 27

Η λύση χρησιμοποιεί μια ένωση μεταξύ των πινάκων ASSIGNMENT και WORKER. Αυτό είναι απαραίτητο επειδή το SKILL_TYPE βρίσκεται στον πίνακα WORKER και το BLDG_ID στον πίνακα ASSIGNMENT.

Αίτηση:Πόσες διαφορετικές ειδικότητες υπάρχουν;

ΕΠΙΛΕΞΤΕ ΑΡΙΘΜΟΥΣ (ΔΙΑΚΡΙΤΗ_ΔΕΞΙΟΤΗΤΑ)

Αποτέλεσμα: 4

Επειδή η ίδια ειδικότητα μπορεί να εμφανιστεί σε πολλές διαφορετικές σειρές, πρέπει να χρησιμοποιήσετε τη λέξη-κλειδί DISTINCT σε αυτό το ερώτημα για να αποτρέψετε το σύστημα να μετράει τον ίδιο τύπο ειδικότητας περισσότερες από μία φορές. Ο χειριστής DISTINCT μπορεί να χρησιμοποιηθεί με οποιαδήποτε από τις ενσωματωμένες λειτουργίες, αν και φυσικά είναι περιττός με τις λειτουργίες MAX και MIN.

ΔΙΑΚΡΙΤΗ. Ένας τελεστής που εξαλείφει τις διπλές γραμμές.

Οι συναρτήσεις SUM και AVG θα πρέπει να χρησιμοποιούνται μόνο με αριθμητικές στήλες. Άλλες λειτουργίες μπορούν να χρησιμοποιηθούν τόσο με αριθμητικά όσο και με δεδομένα χαρακτήρων. Όλες οι συναρτήσεις εκτός από COUNT μπορούν να χρησιμοποιηθούν με υπολογισμένες εκφράσεις. Για παράδειγμα:

Αίτηση:Ποιος είναι ο μέσος εβδομαδιαίος μισθός;

SELECT AVG (40 * HRLY_RATE)

Αποτέλεσμα: 509.14

Το COUNT μπορεί να αναφέρεται σε μια ολόκληρη σειρά αντί για μια μεμονωμένη στήλη :

Αίτηση: Πόσα κτίρια έχουν επίπεδο ποιότητας 3;

SELECT COUNT (*)

ΑΠΟ ΚΤΙΡΙΟ ΠΟΥ

Αποτέλεσμα: 3

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

ρήτρες GROUP BY και HAVING

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

Αίτηση:Για κάθε διευθυντή, μάθετε τη μέγιστη ωριαία χρέωση μεταξύ των υφισταμένων του.

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

ΟΜΑΔΑ ΚΑΤΑ SUPV_ID

Αποτέλεσμα:

SUPV_IDMAX (ΤΙΜΟΣ HRLY)

Κατά την επεξεργασία αυτού του ερωτήματος, το σύστημα πρώτα χωρίζει τις σειρές του πίνακα WORKER σε ομάδες χρησιμοποιώντας τον ακόλουθο κανόνα. Οι σειρές τοποθετούνται στην ίδια ομάδα εάν και μόνο εάν έχουν το ίδιο SUPV_ID. Στη συνέχεια, η ρήτρα SELECT εφαρμόζεται σε κάθε ομάδα. Εφόσον υπάρχει μόνο μία τιμή SUPV_ID σε αυτήν την ομάδα, δεν υπάρχει αβεβαιότητα SUPV_ID στην ομάδα. Για κάθε ομάδα, ο όρος SELECT εξάγει το SUPV_ID και επίσης υπολογίζει και εξάγει την τιμή MAX(HRLY_RATE). Το αποτέλεσμα παρουσιάζεται παραπάνω.

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

ΟΜΑΔΑ ΑΝΑ ρήτρα. Υποδεικνύει ότι οι σειρές πρέπει να χωριστούν σε ομάδες με κοινές τιμές των καθορισμένων στηλών.

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

AVG(MAX(HRLY_RATE))

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

Μπορείτε να χρησιμοποιήσετε την ρήτρα WHERE με την εντολή GROUP BY:

Αίτηση:Για κάθε τύπο κτιρίου, μάθετε το μέσο επίπεδο ποιότητας μεταξύ των κτιρίων του status 1.

SELECT TYPE, AVG (QLTY_LEVEL)

ΟΠΟΥ ΚΑΤΑΣΤΑΣΗ = 1

Αποτέλεσμα:

TYPEAVG (QLTY_LEVEL)

Κατάστημα 1

Κτίριο κατοικιών 3

Η πρόταση WHERE εκτελείται πριν από την πρόταση GROUP BY. Έτσι, καμία ομάδα δεν μπορεί να περιέχει μια σειρά που έχει κατάσταση διαφορετική από το 1. Οι σειρές κατάστασης 1 ομαδοποιούνται με βάση την τιμή TYPE και, στη συνέχεια, εφαρμόζεται ένας όρος SELECT σε κάθε ομάδα.

ΕΧΟΝΤΑΣ φράση. Θέτει όρους σε ομάδες.

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

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

Μπορούμε να αντικατοπτρίσουμε αυτή τη συνθήκη με την κατάλληλη εντολή HAVING:

SELECT SUPV_ID, MAX(HRLY_RATE)

ΑΠΟ ΟΜΑΔΑ ΕΡΓΑΖΟΜΕΝΩΝ ΑΠΟ SUPV_ID

ΕΧΟΝΤΑΣ COUNT(*) > 1

Αποτέλεσμα:

SUPV_ID MAX(HRLY_RATE)

Η διαφορά μεταξύ των όρων WHERE και HAVING είναι ότι το WHERE ισχύει για σειρές, ενώ το HAVING ισχύει για ομάδες.

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

Αίτηση: Για κάθε τύπο κτιρίου, μάθετε το μέσο επίπεδο ποιότητας μεταξύ των κτιρίων της κατάστασης 1. Λάβετε υπόψη μόνο εκείνους τους τύπους κτιρίων των οποίων το μέγιστο επίπεδο ποιότητας δεν υπερβαίνει το 3.

SELECT TYPE, AVG (QLTY_JLEVEL)

ΟΠΟΥ ΚΑΤΑΣΤΑΣΗ = 1

ΕΧΕΙ ΜΕΓΙΣΤΟ (QLTY_LEVEL)<= 3

Αποτέλεσμα:

TYPE AVG (QLTY_LEVEL)

Κατάστημα 1

Κτίριο κατοικιών 3

Σημειώστε ότι ξεκινώντας με τον όρο FROM, οι όροι εκτελούνται με τη σειρά και, στη συνέχεια, εφαρμόζεται ο όρος SELECT. Έτσι, η ρήτρα WHERE εφαρμόζεται στον πίνακα BUILDING και όλες οι σειρές στις οποίες το STATUS είναι διαφορετικό από το 1 διαγράφονται. Οι υπόλοιπες σειρές ομαδοποιούνται κατά TYPE. όλες οι σειρές με την ίδια τιμή TYPE καταλήγουν στην ίδια ομάδα. Έτσι, δημιουργούνται πολλές ομάδες, μία για κάθε τιμή TYPE. Στη συνέχεια, η ρήτρα HAVING εφαρμόζεται σε κάθε ομάδα και οι ομάδες των οποίων η τιμή του μέγιστου επιπέδου ποιότητας υπερβαίνει το 3 αφαιρούνται. Τέλος, η ρήτρα SELECT εφαρμόζεται στις υπόλοιπες ομάδες.

7. Ενσωματωμένες λειτουργίες και υποερωτήματα

Οι ενσωματωμένες συναρτήσεις μπορούν να χρησιμοποιηθούν μόνο σε ρήτρα SELECT ή εντολή HAVING. Ωστόσο, ένας όρος SELECT που περιέχει μια ενσωματωμένη συνάρτηση μπορεί να είναι μέρος ενός δευτερεύοντος ερωτήματος. Ας δούμε ένα παράδειγμα τέτοιου υποερωτήματος:

Αίτηση:Ποιοι εργαζόμενοι έχουν υψηλότερο ωρομίσθιο από το μέσο όρο;

ΕΠΙΛΟΓΗ WORKER_NAME

WHERE HRLY_RATE >

(ΕΠΙΛΟΓΗ AVG(HRLY_RATE)

Αποτέλεσμα:

Η. Κολόμβος

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

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

Ερώτημα: Ποιος υπάλληλος έχει ωρομίσθιο υψηλότερο από το μέσο ωρομίσθιο μεταξύ των υφισταμένων του ίδιου διευθυντή;

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

ΕΠΙΛΕΞΤΕ Α. WORKER_NAME

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

Τύποι όρων αναζήτησης:
. Σύγκριση με το αποτέλεσμα μιας υποερώτησης (=, >=)
. Έλεγχος αν ανήκει στα αποτελέσματα ενός δευτερεύοντος ερωτήματος (IN)
. Έλεγχος ύπαρξης (ΥΠΑΡΧΕΙ)
. Πολλαπλή (ποσοτική) σύγκριση (ΟΠΟΙΑΔΗΠΟΤΕ, ΟΛΑ)

Σημειώσεις για ένθετα ερωτήματα:
. Ένα υποερώτημα πρέπει να επιλέξει μόνο μία στήλη (εκτός από ένα υποερώτημα με κατηγόρημα ΥΠΑΡΧΕΙ) και ο τύπος δεδομένων αποτελέσματός του πρέπει να ταιριάζει με τον τύπο δεδομένων της τιμής που καθορίζεται στο κατηγόρημα.
. Σε ορισμένες περιπτώσεις, μπορείτε να χρησιμοποιήσετε τη λέξη-κλειδί DISTINCT για να διασφαλίσετε ότι θα επιστραφεί μια μεμονωμένη τιμή.
. Δεν μπορείτε να συμπεριλάβετε μια ρήτρα ORDER BY ή UNION σε ένα δευτερεύον ερώτημα.
. Το υποερώτημα μπορεί να βρίσκεται είτε στα αριστερά είτε στα δεξιά της συνθήκης αναζήτησης.
. Τα δευτερεύοντα ερωτήματα μπορούν να χρησιμοποιούν συναρτήσεις συνάθροισης χωρίς ρήτρα GROUP BY, η οποία επιστρέφει αυτόματα μια ειδική τιμή για οποιονδήποτε αριθμό γραμμών, ένα ειδικό κατηγόρημα IN και εκφράσεις που βασίζονται σε στήλη.
. Όποτε είναι δυνατόν, θα πρέπει να χρησιμοποιείτε συνδέσεις πίνακα JOIN αντί για υποερωτήματα.

Παραδείγματα για ένθετα ερωτήματα:

SELECT * FROM Orders WHERE SNum=(SELECT SNum FROM SalesPeople WHERE SName='Motika')
SELECT * FROM Orders WHERE SNum IN (SELECT SNum FROM SalesPeople WHERE City='London')
SELECT * FROM Orders WHERE SNum=(SELECT DISTINCT SNum FROM Orders WHERE CNum=2001)
SELECT * FROM Orders WHERE Amt>(SELECT AVG(Amt) FROM Orders WHERE Odate=10/04/1990)
SELECT * FROM Customer WHERE CNum=(SELECT SNum+1000 FROM SalesPeople WHERE SName='Serres')

2) Σχετικά υποερωτήματα

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

Παραδείγματα για σχετικά δευτερεύοντα ερωτήματα:

SELECT * FROM SalesPeople Main WHERE 1(SELECT AVG(Amt) FROM Orders O2 WHERE O2.CNum=O1.CNum) //επιστρέφει όλες τις παραγγελίες των οποίων η αξία υπερβαίνει τη μέση τιμή παραγγελίας για έναν δεδομένο πελάτη

3) Κατηγόρημα ΥΠΑΡΧΕΙ

Συντακτική μορφή: ΥΠΑΡΧΕΙ ()

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

Σημειώσεις για το κατηγόρημα ΥΠΑΡΧΕΙ:
. Το EXISTS είναι ένα κατηγόρημα που επιστρέφει TRUE ή FALSE και μπορεί να χρησιμοποιηθεί μόνο του ή με άλλες παραστάσεις Boole.
. Το EXISTS δεν μπορεί να χρησιμοποιήσει συναρτήσεις συγκέντρωσης στο υποερώτημά του.
. Σε συσχετισμένα υποερωτήματα, το κατηγόρημα EXISTS εκτελείται για κάθε γραμμή του εξωτερικού πίνακα.
. Μπορείτε να συνδυάσετε το κατηγόρημα EXISTS με ενώσεις πινάκων.

Παραδείγματα για το κατηγόρημα EXISTS:

SELECT * FROM Customer WHERE EXISTS (SELECT * FROM Customer WHERE City='San Jose') – επιστρέφει όλους τους πελάτες εάν κάποιος από αυτούς ζει στο San Jose.
SELECT DISTINCT SNum FROM Customer First WHERE NOT EXISTS (SELECT * FROM Customer Send WHERE Send.SNum=First.SNum AND Send.CNumFirst.CNum) – επιστρέφει τους αριθμούς των πωλητών που εξυπηρέτησαν μόνο έναν πελάτη.
SELECT DISTINCT F.SNum, SName, F.City FROM SalesPeople F, Customer S WHERE EXISTS (SELECT * FROM Customer T WHERE S.SNum=T.SNum AND S.CNumT.CNum AND F.SNum=S.SNum) – επιστρέφει αριθμούς, ονόματα και πόλεις διαμονής όλων των πωλητών που εξυπηρέτησαν πολλούς πελάτες.
SELECT * FROM SalesPeople Frst WHERE EXISTS (SELECT * FROM Customer Send WHERE Frst.SNum=Send.SNum AND 1

4) Κατηγορήματα ποσοτικής σύγκρισης

Συντακτική μορφή: (=|>|=|) ΟΠΟΙΑΔΗΠΟΤΕ|ΟΛΑ ()

Αυτά τα κατηγορήματα χρησιμοποιούν ένα υποερώτημα ως όρισμα, ωστόσο, σε σύγκριση με το κατηγόρημα EXISTS, χρησιμοποιούνται σε συνδυασμό με σχεσιακά κατηγορήματα (=,>=). Με αυτή την έννοια, είναι παρόμοια με το κατηγόρημα IN, αλλά χρησιμοποιούνται μόνο με υποερωτήματα. Το πρότυπο επιτρέπει τη χρήση της λέξης-κλειδιού SOME αντί για ANY, αλλά δεν το υποστηρίζουν όλα τα DBMS.

Σημειώσεις σχετικά με τα κατηγορήματα σύγκρισης:
. Το κατηγόρημα ALL αξιολογείται σε TRUE εάν κάθε τιμή που επιλέγεται κατά την εκτέλεση του υποερωτήματος ικανοποιεί τη συνθήκη που καθορίζεται στο κατηγόρημα του εξωτερικού ερωτήματος. Χρησιμοποιείται συχνότερα με ανισότητες.
. Το κατηγόρημα ANY αξιολογείται σε TRUE εάν τουλάχιστον μία τιμή που επιλέχθηκε κατά την εκτέλεση του υποερωτήματος ικανοποιεί τη συνθήκη που καθορίζεται στο κατηγόρημα του εξωτερικού ερωτήματος. Χρησιμοποιείται συχνότερα με ανισότητες.
. Εάν το υποερώτημα δεν επιστρέψει καμία σειρά, τότε το ALL παίρνει αυτόματα την τιμή TRUE (θεωρείται ότι ικανοποιείται η συνθήκη σύγκρισης) και για το ΚΑΘΕ λαμβάνει την τιμή FALSE.
. Εάν η σύγκριση είναι TRUE για καμία σειρά και υπάρχουν μία ή περισσότερες σειρές με τιμή NULL, τότε το ANY επιστρέφει ΑΓΝΩΣΤΟ.
. Εάν η σύγκριση είναι FALSE για καμία σειρά και υπάρχουν μία ή περισσότερες σειρές με τιμή NULL, τότε ALL επιστρέφει ΑΓΝΩΣΤΟ.

Παραδείγματα για το κατηγόρημα της ποσοτικής σύγκρισης:

SELECT * FROM SalesPeople WHERE City=ANY(ΕΠΙΛΟΓΗ Πόλης ΑΠΟ Πελάτη)
SELECT * FROM Orders WHERE Amt ALL (SELECT Rating FROM Customer WHERE City='Rome')

5) Κατηγόρημα μοναδικότητας

ΜΟΝΑΔΙΚΟ|ΔΙΑΚΡΙΤΙΚΟ ()

Το κατηγόρημα χρησιμοποιείται για τον έλεγχο της μοναδικότητας (απουσία διπλότυπων) στα δεδομένα εξόδου του υποερωτήματος. Επιπλέον, στο κατηγόρημα UNIQUT, οι συμβολοσειρές με τιμές NULL θεωρούνται μοναδικές και στο κατηγόρημα DISTINCT, δύο απροσδιόριστες τιμές θεωρούνται ίσες μεταξύ τους.

6) Ταίριαξε κατηγόρημα

ΑΓΩΝΑΣ ()

Το κατηγόρημα MATCH ελέγχει εάν η τιμή μιας συμβολοσειράς ερωτήματος θα ταιριάζει με την τιμή οποιασδήποτε συμβολοσειράς που προκύπτει από το υποερώτημα. Αυτό το υποερώτημα διαφέρει από τα κατηγορήματα IN AND ANY καθώς επιτρέπει την επεξεργασία "μερικών" (PARTIAL) αντιστοιχίσεων που μπορεί να προκύψουν μεταξύ σειρών που έχουν κάποιες τιμές NULL.

7) Ερωτήματα στην ενότητα ΑΠΟ

Στην πραγματικότητα, είναι νόμιμη η χρήση υποερωτήματος όπου επιτρέπεται η αναφορά πίνακα.

SELECT CName, Tot_Amt FROM Customer, (SELECT CNum, SUM(Amt) AS Tot_Amt FROM Orders GROUP BY CNum) WHERE City='London' AND Customer.CNum=Orders.CNum
//υποερώτημα επιστρέφει το συνολικό ποσό των παραγγελιών που υποβλήθηκαν από κάθε πελάτη από το Λονδίνο.

8) Αναδρομικά ερωτήματα

ΜΕ ΑΝΑΔΡΟΜΙΚΟ
Ε1 ΩΣ ΕΠΙΛΟΓΗ … ΑΠΟ … ΠΟΥ…
Ε2 ΩΣ ΕΠΙΛΟΓΗ … ΑΠΟ … ΠΟΥ…

ΟΠΟΥ ΥΠΑΡΧΕΙ

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

υποερώτημα

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

Γενικοί κανόνες

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

ΕΠΙΛΟΓΗ * ΑΠΟ θέσεις εργασίας ΟΠΟΥ ΔΕΝ ΥΠΑΡΧΕΙ (ΕΠΙΛΟΓΗ * ΑΠΟ εργαζόμενο WHERE jobs.job_id=employye.job_id);

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

ΕΠΙΛΟΓΗ au_lname ΑΠΟ συντάκτες ΟΠΟΥ ΥΠΑΡΧΕΙ (ΕΠΙΛΟΓΗ * ΑΠΟ εκδότες WHERE authors.city=publishers.city);

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

Σε πολλά ερωτήματα, ο τελεστής ΥΠΑΡΧΕΙ εκτελεί την ίδια λειτουργία με ANY. Ο τελεστής EXISTS είναι συνήθως πιο αποτελεσματικός όταν χρησιμοποιείται με συσχετισμένα ερωτήματα.

Ο τελεστής EXISTS είναι σημασιολογικά ισοδύναμος με τον τελεστή ANY.

Ένα υποερώτημα σε μια πρόταση EXISTS εκτελεί συνήθως έναν από τους δύο τύπους αναζητήσεων. Η πρώτη επιλογή είναι να χρησιμοποιήσετε έναν χαρακτήρα μπαλαντέρ - έναν αστερίσκο (για παράδειγμα, SELECT * FROM...), οπότε δεν ανακτάτε κάποια συγκεκριμένη στήλη ή τιμή. Ο αστερίσκος εδώ σημαίνει "οποιαδήποτε στήλη". Η δεύτερη επιλογή είναι να επιλέξετε μόνο μία συγκεκριμένη στήλη στο υποερώτημα (για παράδειγμα, SELECT aujd FROM). Ορισμένες μεμονωμένες πλατφόρμες επιτρέπουν υποερωτήματα σε πολλές στήλες (π.χ. SELECT aujd, aujname FROM...). Ωστόσο, αυτή η δυνατότητα είναι σπάνια και θα πρέπει να αποφεύγεται σε κώδικα που πρέπει να μεταφερθεί σε άλλες πλατφόρμες.

Διαφορές μεταξύ πλατφορμών

Όλες οι πλατφόρμες υποστηρίζουν τον τελεστή EXISTS με τη μορφή που περιγράψαμε παραπάνω.

Επιπλέον, μπορείτε να χρησιμοποιήσετε ΥΠΑΡΧΕΙ χειριστής. Αυτός ο τελεστής χρησιμοποιείται συχνά με συσχετισμένα υποερωτήματα για να ελεγχθεί εάν η τιμή που ανακτάται από το εξωτερικό ερώτημα υπάρχει στο σύνολο αποτελεσμάτων που ανακτάται από το εσωτερικό ερώτημα. Εάν το υποερώτημα επιστρέψει τουλάχιστον μία σειρά, ο τελεστής επιστρέφει TRUE. Εάν η τιμή δεν υπάρχει, ο χειριστής επιστρέφει FALSE. Αντίστοιχα, ο τελεστής ΔΕΝ ΥΠΑΡΧΕΙ ελέγχει ότι η τιμή που ανακτήθηκε από το εξωτερικό ερώτημα δεν υπάρχει στο σύνολο αποτελεσμάτων που ανακτήθηκε από το εσωτερικό ερώτημα.

    Ο τελεστής ΥΠΑΡΧΕΙ ελέγχει την ύπαρξη γραμμών στο σύνολο αποτελεσμάτων ενός υποερωτήματος.

    Εάν βρεθεί η τιμή συμβολοσειράς υποερωτήματος:

    • η αναζήτηση δεν συνεχίζεται στο εσωτερικό ερώτημα.

      η συνθήκη επισημαίνεται TRUE.

    Εάν δεν βρεθεί η τιμή συμβολοσειράς υποερωτήματος:

    • η συνθήκη επισημαίνεται ως FALSE.

      η αναζήτηση συνεχίζεται στο εσωτερικό ερώτημα.

ΥΠΑΡΧΕΙ χειριστής

Όλοι οι λογικοί τελεστές είναι εφαρμόσιμοι με ένθετες δηλώσεις SELECT. Επιπλέον, μπορείτε να χρησιμοποιήσετε τον τελεστή EXISTS. Αυτός ο τελεστής χρησιμοποιείται συχνά με συσχετισμένα υποερωτήματα για να ελεγχθεί εάν η τιμή που ανακτάται από το εξωτερικό ερώτημα υπάρχει στο σύνολο αποτελεσμάτων που ανακτάται από το εσωτερικό ερώτημα. Εάν το υποερώτημα επιστρέψει τουλάχιστον μία σειρά, ο τελεστής επιστρέφει TRUE. Εάν η τιμή δεν υπάρχει, ο χειριστής επιστρέφει FALSE. Αντίστοιχα, ο τελεστής ΔΕΝ ΥΠΑΡΧΕΙ ελέγχει ότι η τιμή που ανακτήθηκε από το εξωτερικό ερώτημα δεν υπάρχει στο σύνολο αποτελεσμάτων που ανακτήθηκε από το εσωτερικό ερώτημα.