Εσωτερικά ερωτήματα sql. Πολύπλοκα ερωτήματα SQL. Ένθετα ερωτήματα, ενώσεις, προβολές

Ένα δευτερεύον ερώτημα είναι ένα ερώτημα που περιέχεται στην έκφραση λέξης-κλειδιού WHERE ενός άλλου ερωτήματος για τους σκοπούς του πρόσθετους περιορισμούςστα δεδομένα εξόδου. Τα δευτερεύοντα ερωτήματα ονομάζονται επίσης ένθετα ερωτήματα. Χρησιμοποιούνται για την επιβολή συνθηκών στα δεδομένα εξόδου. Τα δευτερεύοντα ερωτήματα μπορούν να χρησιμοποιηθούν με δηλώσεις SELECT, INSERT, UPDATE ή DELETE.

Σε ορισμένες περιπτώσεις, ένα υποερώτημα μπορεί να χρησιμοποιηθεί αντί για σύνδεση πινάκων, συνδέοντας έτσι σιωπηρά δεδομένα πίνακα. Όταν χρησιμοποιείται ένα υποερώτημα σε ένα ερώτημα, το υποερώτημα εκτελείται πρώτα και μόνο τότε εκτελείται το ερώτημα που το περιέχει, λαμβάνοντας υπόψη τις συνθήκες για την εκτέλεση του υποερωτήματος. Ένα υποερώτημα μπορεί να χρησιμοποιηθεί είτε στην έκφραση λέξης-κλειδιού WHERE είτε στην έκφραση λέξης-κλειδιού HAVING του κύριου ερωτήματος. Λογικές πράξειςκαι πράξεις σύγκρισης όπως =, >,<, о, IN, NOT IN, AND, OR и т п. можно использовать в подзапросе. Все, что применимо к обычному запросу, применимо и к подзапросу.

Κατά τη σύνταξη υποερωτημάτων, πρέπει να τηρείτε τους ακόλουθους κανόνες.

Το υποερώτημα πρέπει να περικλείεται σε παρένθεση.

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

Η λέξη-κλειδί ORDER BY δεν μπορεί να χρησιμοποιηθεί σε ένα δευτερεύον ερώτημα, αν και το ORDER BY μπορεί να χρησιμοποιηθεί στο κύριο ερώτημα. Αντί για ORDER BY, μπορείτε να χρησιμοποιήσετε GROUP BY σε ένα δευτερεύον ερώτημα.

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

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

SELECT στήλη_όνομα ΑΠΟ πίνακα WHERE στήλη_όνομα = (ΕΠΙΛΟΓΗ_όνομα_στήλης ΑΠΟ τον πίνακα ΠΟΥ συνθήκες);

Ακριβώς όπως ένα υποερώτημα μπορεί να είναι ένθετο μέσα σε ένα κύριο ερώτημα, ένα υποερώτημα μπορεί επίσης να είναι ένθετο μέσα σε ένα δευτερεύον ερώτημα. Στο κύριο ερώτημα, το υποερώτημα εκτελείται πριν από την εκτέλεση του κύριου, και με τον ίδιο τρόπο, σε ένα υποερώτημα, το υποερώτημα που είναι ένθετο σε αυτό θα εκτελεστεί πρώτα

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

SELECT COUNT (DISTINCT subj_id), επισήμανση FROM exam_marks GROUP BY mark HAVING mark > (SELECT AVG(mark) FROM exam_marks WHERE stud_id=301);

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

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



Επιλέγεται μια σειρά από τον πίνακα του οποίου το όνομα καθορίζεται στο εξωτερικό ερώτημα.

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

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

Η διαδικασία επαναλαμβάνεται για επόμενη γραμμήεξωτερικούς πίνακες ερωτημάτων.

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

SELECT exam_date, SUM(mark) FROM exam_σημαίνει GROUP BY exam_date

ΕΧΟΝΤΑΣ 10< (SELECT COUNT(mark) FROM exam_marks b

ΠΟΥ a.exam_date=b.exam_date);

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

Περίληψη: Ένα δευτερεύον ερώτημα είναι ένα ερώτημα που εκτελείται σε ένα άλλο ερώτημα για μια εργασία πρόσθετες προϋποθέσειςστα δεδομένα εξόδου. Ένα υποερώτημα μπορεί να χρησιμοποιηθεί σε εκφράσεις λέξεων-κλειδιών WHERE και HAVING. Η σύνταξη των υποερωτημάτων πρακτικά δεν διαφέρει από τη σύνταξη ενός κανονικού ερωτήματος, υπάρχουν μόνο μικροί περιορισμοί. Ένας από αυτούς τους περιορισμούς είναι η απαγόρευση χρήσης της λέξης-κλειδιού ORDER BY σε δευτερεύοντα ερωτήματα, ωστόσο, μπορείτε να χρησιμοποιήσετε το GROUP BY, το οποίο επιτυγχάνει σχεδόν το ίδιο αποτέλεσμα. Τα δευτερεύοντα ερωτήματα χρησιμοποιούνται για την τοποθέτηση συνθηκών σε ερωτήματα για τα οποία τα ακριβή δεδομένα δεν είναι γνωστά, αυξάνοντας έτσι την ισχύ και την ευελιξία της SQL.

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

Ένθετα ερωτήματα

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

ΕΠΙΛΟΓΗ hst_name ΑΠΟ κεντρικούς υπολογιστές WHERE hst_pcode IN (ΕΠΙΛΟΓΗ vis_hstcode ΑΠΟ επισκέψεις, ιστότοπους WHERE (sit_pcode = vis_sitcode) ΚΑΙ (sit_name LIKE "www.dom2.ru"));

Ας ρίξουμε μια πιο προσεκτική ματιά σε αυτό το αίτημα. Η πρώτη πρόταση SELECT είναι απαραίτητη για την επιλογή ονομάτων κόμβων. Για να επιλέξουμε τα ονόματα που θέλουμε, το αίτημα περιέχει μια ενότητα WHERE, στην οποία πρωτεύων κλειδίΟ πίνακας "Nodes" (hst_pcode) ελέγχεται για συμμετοχή σε ένα σύνολο (τελεστής IN). Προφανώς, το σύνολο για έλεγχο συμμετοχής θα πρέπει να επιστραφεί από τη δεύτερη δήλωση SELECT που βρίσκεται σε παρένθεση. Ας το δούμε ξεχωριστά:

ΕΠΙΛΟΓΗ vis_hstcode ΑΠΟ επισκέψεις, ιστότοπους ΠΟΥ (sit_pcode = vis_sitcode) ΚΑΙ (sit_name LIKE "www.dom2.ru")

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

Σύνδεση με SQL

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

Εσωτερική σύνδεση

Ας δούμε ένα παράδειγμα:

ΕΠΙΛΟΓΗ hst_name, sit_name, vis_timestamp ΑΠΟ κεντρικούς υπολογιστές, επισκέψεις, ιστότοπους WHERE (hst_pcode = vis_hstcode) ΚΑΙ (vis_sitcode = sit_pcode)

Αυτό το αίτημαθα επιστρέψει τα ακόλουθα δεδομένα

hst_name sit_name vis_timestamp
ws1 www.dom2.ru 2012-08-01 07:59:58.209028
ws1 www.vkontakte.ru 2012-08-01 08:00:10.315083
1-1 www.vkontakte.ru 2012-08-01 08:00:20.025087
1-2 www.opennet.ru 2012-08-01 08:00:26.260159

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

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

SELECT hst_name, sit_name, vis_timestamp FROM hosts JOIN επισκέψεις ON (hst_pcode = vis_hstcode) JOIN sites ON (vis_sitcode = sit_pcode);

Το αίτημα περιέχει δύο τελεστές JOIN… ON. Δεδομένου ότι το "Join" μπορεί να μεταφραστεί ως "σύνδεση" ή "ένωση", αυτό το παράδειγμα είναι πιο εύγλωττο. Εάν προσπαθήσετε να μεταφράσετε το κείμενο ενός ερωτήματος SQL στα ρωσικά, θα λάβετε κάτι σαν

SELECT (πεδία) hst_name, sit_name, vis_timestamp FROM (πίνακας) φιλοξενεί JOINING (με πίνακα) επισκέψεις BY (συνθήκη) (hst_pcode = vis_hstcode) JOINING (με πίνακα) sites BY (condition) (vis_sitcode = sit_pcode);

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

Εξωτερική ένωση

Οι μέθοδοι που χρησιμοποιούνται παραπάνω για τη σύνδεση πινάκων ονομάζονται εσωτερική σύνδεση(εσωτερική σύνδεση). Αυτή η μέθοδος σύνδεσης έχει μειονεκτήματα. Για παράδειγμα, εάν δεν είχαμε καμία επίσκεψη σε έναν από τους ιστότοπους ή εάν ένας από τους κόμβους δεν πραγματοποίησε ούτε μία επίσκεψη, τότε ο ιστότοπος ή ο κόμβος δεν θα υπάρχει στο σύνολο δεδομένων που προκύπτει. Στο παραπάνω παράδειγμα, μπορείτε να δείτε ότι ο ιστότοπος www.yandex.ru λείπει από τα δεδομένα, καθώς και ο κόμβος 1-3 Μερικές φορές αυτό είναι ανεπιθύμητο και σε τέτοιες περιπτώσεις το χρησιμοποιούν εξωτερική ένωση(εξωτερική ένωση). Η εξωτερική ένωση μπορεί να είναι αριστερά(αριστερή ένωση) και σωστά(δεξιά ένωση). Η πλευρά σύνδεσης (αριστερά ή δεξιά) αντιστοιχεί στον πίνακα από τον οποίο θα επιλεγούν όλα τα δεδομένα. Έτσι, όταν χρησιμοποιείτε ένα LEFT JOIN, τα δεδομένα από τον πίνακα στα αριστερά του τελεστή JOIN θα επιλεγούν στο σύνολό τους. Ας το υποστηρίξουμε με ένα παράδειγμα. Ας υποθέσουμε ότι πρέπει να επιλέξουμε ΟΛΟΥΣ τους κόμβους και τις επισκέψεις που σχετίζονται με αυτούς. Αυτό μπορεί να γίνει κατόπιν αιτήματος

SELECT hst_name, vis_timestamp FROM hosts LEFT JOIN επισκέψεις ON (hst_pcode = vis_hstcode);

Δώστε προσοχή στα δεδομένα που θα επιστραφούν ως απάντηση στο αίτημα

hst_name vis_timestamp
ws1 2012-08-01 07:59:58.209028
ws1 2012-08-01 08:00:10.315083
1-1 2012-08-01 08:00:20.025087
1-2 2012-08-01 08:00:26.260159
1-3

Μπορεί να φανεί ότι ο κόμβος 1-3 δεν αντιστοιχεί σε μία επίσκεψη, αλλά εξακολουθεί να βρίσκεται στη λίστα. Το RIGHT JOIN λειτουργεί με παρόμοιο τρόπο. Ένα ερώτημα που θα επιστρέψει το ίδιο σύνολο δεδομένων μπορεί να γραφτεί χρησιμοποιώντας ένα RIGHT JOIN:

SELECT hst_name, vis_timestamp FROM επισκέψεις RIGHT JOIN hosts ON (hst_pcode = vis_hstcode);

Σε αυτήν την περίπτωση, πρέπει να αλλάξετε την ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ σε ΔΕΞΙΑ ΣΥΝΔΕΣΗ και να αλλάξετε τους πίνακες επισκέψεων και κεντρικών υπολογιστών στο ερώτημα.

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

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

§ τα αιτήματα πρέπει να περιέχουν τον ίδιο αριθμόπεδία?

§ Οι τύποι δεδομένων των πεδίων των συγχωνευμένων ερωτημάτων πρέπει επίσης να ταιριάζουν.

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

SELECT hst_name AS name FROM hosts UNIONSELECT sit_name AS name FROM sites.

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

SELECT 1 AS level, hst_name AS name FROM hosts UNIONSELECT 2 AS level, sit_name AS name FROM sitesORDER BY level, name;

ΥΠΑΡΧΕΙ και ΔΕΝ ΥΠΑΡΧΕΙ προϋποθέσεις

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

SELECT sit_name FROM sites WHERE ((SELECT COUNT(*) FROM visits WHERE vis_sitcode = sit_pcode) = 0);

Για το παράδειγμά μας, η λίστα θα είναι σύντομη:

sit_name
www.yandex.ru

Το αίτημα λειτουργεί ως εξής:

§ Ο κωδικός τοποθεσίας και το όνομά του επιλέγονται από τον πίνακα τοποθεσιών.

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

§ η συνάρτηση COUNT(*) θα μετρήσει τις εγγραφές και θα επιστρέψει τον αριθμό τους, ο οποίος θα περάσει στην συνθήκη.

§ εάν η συνθήκη είναι αληθής (ο αριθμός των εγγραφών είναι 0), το όνομα της τοποθεσίας προστίθεται στη λίστα.

Αν κάποιοι βρίσκουν αυτό το ερώτημα μπερδεμένο, μπορείτε να επιτύχετε τα ίδια αποτελέσματα με ένα ερώτημα χρησιμοποιώντας το ΔΕΝ ΥΠΑΡΧΕΙ:

SELECT sit_name FROM sites WHERE NOT EXISTS (SELECT vis_pcode FROM visits WHERE vis_sitcode = sit_pcode);

Η έκφραση ΔΕΝ ΥΠΑΡΧΕΙ (κατά τη γνώμη μου) φέρνει επιπλέον σαφήνεια και είναι πιο κατανοητή. Η έκφραση ΥΠΑΡΧΕΙ λειτουργεί παρόμοια, η οποία ελέγχει την παρουσία εγγραφών.

Προβολές (VIEW)

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

ΔΗΜΙΟΥΡΓΙΑ ΠΡΟΒΟΛΗ show_dom2 ASSELECT hst_name ΑΠΟ κεντρικούς υπολογιστές WHERE hst_pcode IN (ΕΠΙΛΟΓΗ vis_hstcode ΑΠΟ επισκέψεις, ιστότοπους ΠΟΥ (sit_pcode = vis_sitcode) ΚΑΙ (sit_name LIKE "www.dom2.ru"));

Στην πραγματικότητα, αυτό είναι όλο. Ένας προσεκτικός παρατηρητής μπορεί να έχει παρατηρήσει ότι, στην πραγματικότητα, μπορείτε να δεχτείτε ένα αίτημα και στην αρχή να προσθέσετε τις λέξεις "ΔΗΜΙΟΥΡΓΙΑ ΠΡΟΒΟΛΗ<имя>ΟΠΩΣ ΚΑΙ". Σε αυτήν την αρχή μπορούμε να προτείνουμε τη δημιουργία αναπαραστάσεων. Δημιουργήστε ένα αίτημα, βεβαιωθείτε ότι λειτουργεί και, στη συνέχεια, προσθέστε όλα τα απαραίτητα για να αποθηκεύσετε αυτό το αίτημα στον διακομιστή ως προβολή. Το μόνο μειονέκτημαΤο πρόβλημα με τη χρήση προβολών είναι ότι ορισμένες ιδιαίτερα πολύπλοκες τεχνικές σύνταξης ερωτημάτων ενδέχεται να μην λειτουργούν σε προβολές. Δυστυχώς, υπάρχουν πολύ λίγες πληροφορίες σχετικά με τις προβολές στην τεκμηρίωση του postgreSQL και σίγουρα μπορείτε να μάθετε τι μπορεί να χρησιμοποιηθεί και τι όχι μέσω δοκιμής και λάθους. Αποθηκεύοντας το αίτημα στον διακομιστή ως προβολή, μπορείτε να το εκτελέσετε όσες φορές θέλετε, με ένα αίτημα όπως

SELECT * FROM show_dom2;

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

DROP VIEW show_dom2;

συμπέρασμα

παραγγελία αιτήματος αναφοράς δεδομένων

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

ΣΥΜΠΕΡΑΣΜΑ


ΒΙΒΛΙΟΓΡΑΦΙΑ


ΠΑΡΑΡΤΗΜΑ Α


ΠΑΡΑΡΤΗΜΑ Β


Συγχώνευση πινάκων.

Ένα ερώτημα μπορεί να συνδυάσει δεδομένα από έναν ή περισσότερους πίνακες. Αυτή η ένωση πινάκων ονομάζεται σύνδεση (δεσμευτική)τραπέζια. Διακρίνω εσωτερικός και εξωτερικόςσυνδέσεις.

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

Για παράδειγμα,

ΕΠΙΛΕΞΤΕ R.fam, R.birthday,A.Foto

ΑΠΟ Rabotniki R, Advanced A

όπου οι πίνακες Rabotniki και Advanced περιέχουν τα κύρια και Επιπλέον πληροφορίεςσχετικά με τους υπαλλήλους της επιχείρησης. Επικοινωνία ένας προς έναν. Στον πίνακα Rabotniki δίνεται το ψευδώνυμο R και στον πίνακα Advanced το ψευδώνυμο A.

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

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

Παράδειγμα 1. Δίνεται μια βάση δεδομένων Sotrudniki, που αποτελείται από δύο πίνακες:

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

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

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

SELECT S_Fio,S_Birthday,D_Nazv FROM Sotrudniki, Doljn

WHERE S_Doljn=D_Code

Ο αριθμός των εγγραφών στο προκύπτον σύνολο δεδομένων θα είναι ίσος με τον αριθμό των εγγραφών στον πίνακα Sotrudniki. Π

Παράδειγμα 2. Απαιτείται να δημιουργήσετε ένα ερώτημα για τη βάση δεδομένων Sotrudniki που θα σας επιτρέψει να αποκτήσετε μια λίστα υπαλλήλων που έχουν τη θέση "προγραμματιστής". Παίρνουμε

SELECT S_fio, S_birthday FROM sotrudniki, doljn

WHERE S_doljn=D_code και D_nazv="προγραμματιστής"

Η αυτοσύνδεση πίνακα επιτρέπεται σε ερωτήματα SQL. Σε αυτή την περίπτωση, σε έναν πίνακα δίνονται δύο ψευδώνυμα.

Για παράδειγμα, Για να βρείτε όλους τους ομότιμους στον πίνακα Sotrudniki, μπορείτε να γράψετε ένα ερώτημα:

SELECT s1.s_fio, s2.s_fio, s1.s_birthday

ΑΠΟ Sotrudniki s1, Sotrudniki s2

ΠΟΥ (ΑΠΟΣΠΑΣΜΑ (ΕΤΟΣ

FROM s1.s_birthday)=EXTRACT(ΕΤΟΣ

ΑΠΟ s2.s_birthday))

ΚΑΙ (s1.s_fio!=s2.s_fio) ΚΑΙ (s1.s_fio

Η τελευταία προϋπόθεση τακτοποιεί τα επώνυμα και εξαλείφει την επανάληψη των αποτελεσμάτων.

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

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

1) ΑΡΙΣΤΕΡΑ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ… ΕΝΕΡΓΗ –το αριστερό περιλαμβάνει στο αποτέλεσμα όλα τα ρεκόρ του πρώτου πίνακα, ακόμα και αυτά για τα οποία δεν υπάρχει αντιστοιχία στο δεύτερο.

2) ΔΕΞΙΑ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ … ON– δεξιά, περιλαμβάνει στο αποτέλεσμα όλα τα ρεκόρ του δεύτερου πίνακα, ακόμα και αυτά για τα οποία δεν υπάρχει αντιστοιχία στον πρώτο.

3) ΠΛΗΡΗΣ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ…ON– πλήρης, το αποτέλεσμα περιλαμβάνει μια ένωση εγγραφών και από τους δύο πίνακες, ανεξάρτητα από την αντιστοιχία τους.

Με μια εξωτερική ένωση, μπορείτε να μιλήσετε για το ποιο τραπέζι είναι το κύριο. Στην πρώτη περίπτωση - αριστερά, στη δεύτερη - δεξιά.

Για παράδειγμα. Ας υπάρχουν επώνυμα στον πίνακα Sotrudniki του Sotrudniki DB που έχουν μια θέση που δεν προσδιορίζεται στον πίνακα Doljn και υπάρχουν θέσεις στον πίνακα Doljn για τις οποίες δεν υπάρχει επώνυμο στον πίνακα Sotrudniki. Επειτα

1) ΕΠΙΛΟΓΗ * ΑΠΟ Sotrudniki ΑΡΙΣΤΕΡΑ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ Doljn

ON S_doljn=D_code

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

2) ΕΠΙΛΟΓΗ * ΑΠΟ Sotrudniki ΔΕΞΙΑ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ Doljn

ON S_doljn=D_code

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

3) ΕΠΙΛΟΓΗ * ΑΠΟ Sotrudniki ΠΛΗΡΗΣ ΕΞΩΤΕΡΙΚΗ ΕΓΓΡΑΦΗ Doljn ON

Σειρές που σχετίζονται με τον πίνακα Doljn, για τον οποίο δεν υπάρχει αντιστοιχία στον πίνακα Sotrudniki, έχουν προστεθεί στις σειρές που σχετίζονται με τον πίνακα Sotrudniki.


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

Για παράδειγμα,

1) Προσδιορίστε όλα τα ονόματα στους πίνακες Sotrudniki και Sotrudniki1 που έχουν την ίδια δομή:

ΕΠΙΛΟΓΗ * ΑΠΟ Sotrudniki

WHERE S_fio IN (ΕΠΙΛΟΓΗ S_fio ΑΠΟ Sotrudniki1)

Η ένθετη πρόταση SELECT επιστρέφει ένα σύνολο επωνύμων από τον πίνακα Sotrudniki1 και την πρόταση WHERE του κύριου Δήλωση SELECTεπιλέγει στον πίνακα Sotrudniki εκείνες τις εγγραφές που βρίσκονται στο σύνολο των επωνύμων από τον πίνακα Sotrudniki1.

2) Εξαγάγετε το επώνυμο(α) του νεότερου υπαλλήλου από τη βάση δεδομένων Sotrudniki:

SELECT S_Fio, EXTRACT (ΕΤΟΣ ΑΠΟ S_Girthday)

ΠΟΥ ΑΠΟΣΠΑΣΜΑ (ΕΤΟΣ ΑΠΟ S_Γενέθλια)=

(ΕΠΙΛΟΓΗ μέγ.(ΕΞΑΓΩΓΗ(ΕΤΟΣ ΑΠΟ 1_Γενέθλια))

ΑΠΟ Sotrudniki)

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

3) Εξαγωγή από τη βάση δεδομένων Students όλων των βαθμών ενός συγκεκριμένου μαθητή, για παράδειγμα, Petrov:

SELECT S_fam, P_nazv, E_mark FROM

Εξέταση, Predm, Μαθητές

WHERE E_student=(ΕΠΙΛΟΓΗ S_code FROM Students

WHERE S_fam="Petrov")

ΚΑΙ E_Predm=P_code ΚΑΙ E_Student=S_code

Στην ένθετη κατασκευή SELECT, καθορίζεται ο κωδικός ενός μαθητή με το όνομα "Petrov" και οι τελευταίες συνθήκες διασφαλίζουν ότι ο πλεονασμός εξαλείφεται κατά τη διάρκεια εσωτερικών ενώσεων πινάκων.

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

Για παράδειγμα, λάβετε πληροφορίες σχετικά με τα θέματα στα οποία διεξήχθη η εξέταση σε μια συγκεκριμένη ημερομηνία, για παράδειγμα, «14/01/2006»:

ΕΠΙΛΟΓΗ * ΑΠΟ ΤΟ Predm PR

WHERE "01/14/2006" IN (ΕΠΙΛΟΓΗ E_date

ΑΠΟ Εξέταση

WHERE PR.P_code=E_predm)

Το ίδιο πρόβλημα μπορεί να λυθεί χρησιμοποιώντας τη λειτουργία σύνδεσης πίνακα:

ΕΠΙΛΕΞΤΕ DISTINCT P_nazv FROM Predm, Examination

WHERE P_code=E_predm AND E_date= "01/14/2006"

Παράδειγμα. Εμφάνιση του επωνύμου(ων) του μαθητή που έλαβε βαθμό πάνω από το μέσο όρο στις εξετάσεις

SELECT DISTINCT S_fam FROM Students, Examination

E_mark>(SELECT AVG(E_mark) FROM Examination)

ΚΑΙ S_code=E_μαθητής

Μπορείτε να χρησιμοποιήσετε λέξεις-κλειδιά στον όρο WHERE όταν εργάζεστε με σύνολα εγγραφών ΟΛΑΚαι ΟΠΟΙΟΣ. ΟΛΑ- η προϋπόθεση πληρούται για όλα τα αρχεία, ΟΠΟΙΟΣ- η προϋπόθεση πληρούται για τουλάχιστον ένα ρεκόρ.

Για παράδειγμα,

1) εμφανίστε τα επώνυμα των εργαζομένων από τον πίνακα Sotrudniki που δεν είναι μεγαλύτεροι από οποιονδήποτε υπάλληλο στον πίνακα Sotrudniki1:

WHERE S_birthday>= ALL (ΕΠΙΛΟΓΗ S_birthday

ΑΠΟ Sotrudniki1)

2) εμφανίστε τα επώνυμα των εργαζομένων από τον πίνακα Sotrudniki που είναι νεότεροι από τουλάχιστον έναν υπάλληλο στον πίνακα Sotrudniki1:

ΕΠΙΛΕΞΤΕ S_fio,S_birthday ΑΠΟ Sotrudniki

WHERE S_birthday> ANY (ΕΠΙΛΟΓΗ S_birthday ΑΠΟ Sotrudniki1)

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

Για παράδειγμα,

ΕΠΙΛΕΞΤΕ S_fio,S_birthday ΑΠΟ Sotrudniki S1

ΠΟΥ ΥΠΑΡΧΕΙ (ΕΠΙΛΟΓΗ S_fio, S_birthday

ΑΠΟ Sotrudniki S2

WHERE (S1.S_birthday=S2.S_birthday)

ΚΑΙ (S1.S_code!=S2.S_code))

Λήψη λίστας υπαλλήλων που έχουν τουλάχιστον έναν συνομήλικο.

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

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

Η SQL παρέχει τη δυνατότητα συνδυασμού τέτοιων ερωτημάτων σε ένα, μετατρέποντας ένα από αυτά σε υποερώτημα (ενθετικό ερώτημα). Έτσι, για να μάθουμε ποιος δημιούργησε το θέμα "ποδήλατα", θα κάνουμε το εξής ερώτημα:

Δηλαδή μετά τη λέξη-κλειδί ΟΠΟΥ, γράφουμε άλλο αίτημα στην συνθήκη. Η MySQL επεξεργάζεται πρώτα το υποερώτημα, επιστρέφει id_author=2 και αυτή η τιμή μεταβιβάζεται στον όρο ΟΠΟΥεξωτερικό αίτημα.

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

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

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

Ας καταλάβουμε πώς λειτουργεί.

  • Η MySQL θα εκτελέσει πρώτα το βαθύτερο ερώτημα:

  • Το αποτέλεσμα που προκύπτει (id_author=2) θα μεταβιβαστεί σε ένα εξωτερικό αίτημα, το οποίο θα έχει τη μορφή:

  • Το αποτέλεσμα που προκύπτει (id_topic:4,1) θα μεταβιβαστεί σε ένα εξωτερικό αίτημα, το οποίο θα έχει τη μορφή:

  • Και θα δώσει το τελικό αποτέλεσμα (topic_name: about fishing, about fishing). Εκείνοι. ο συγγραφέας του θέματος "ποδήλατα" άφησε μηνύματα στο θέμα "Σχετικά με το ψάρεμα" που δημιουργήθηκε από τον Σεργκέι (id=1) και στο θέμα "Σχετικά με το ψάρεμα" που δημιουργήθηκε από τη Σβέτα (id=4).
Αυτό ήταν το μόνο που ήθελα να πω για τα ένθετα ερωτήματα. Ωστόσο, υπάρχουν δύο σημεία που αξίζει να προσέξετε:
  • Δεν συνιστάται η δημιουργία ερωτημάτων με βαθμό ένθεσης μεγαλύτερο από τρεις. Αυτό οδηγεί σε αυξημένο χρόνο εκτέλεσης και δυσκολία στην κατανόηση του κώδικα.
  • Η δεδομένη σύνταξη για τα ένθετα ερωτήματα είναι ίσως η πιο κοινή, αλλά όχι η μοναδική. Για παράδειγμα, αντί να ρωτήσω

    γράφω

    Εκείνοι. μπορούμε να χρησιμοποιήσουμε οποιονδήποτε τελεστή που χρησιμοποιείται με λέξη-κλειδίΠΟΥ (τα μελετήσαμε στο τελευταίο μάθημα).
Η διάλεξη συζητά την κατασκευή και τη χρήση υποερωτημάτων κατά την ανάκτηση και την αλλαγή δεδομένων.

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

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

Το υποερώτημα είναι πολύ ισχυρό Γλώσσα SQL. Σας επιτρέπει να δημιουργήσετε σύνθετες ιεραρχίες ερωτημάτων που εκτελούνται επανειλημμένα κατά τη διαδικασία κατασκευής ενός συνόλου αποτελεσμάτων ή εκτέλεσης ενός από τους τελεστές τροποποίησης δεδομένων ( ΔΙΑΓΡΑΦΩ, ΕΙΣΑΓΕΤΕ, ΕΚΣΥΓΧΡΟΝΙΖΩ).

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

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

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

  • ορίστε το σύνολο των γραμμών που προστίθενται στον πίνακα ανά εκτέλεση της πρότασης ΕΙΣΑΓΕΤΕ;
  • Προσδιορίστε τα δεδομένα που περιλαμβάνονται στην προβολή που δημιουργήθηκε από τη δήλωση CREATE VIEW.
  • ορίστε τιμές που τροποποιούνται από τον χειριστή ΕΚΣΥΓΧΡΟΝΙΖΩ;
  • καθορίστε μία ή περισσότερες τιμές στις ρήτρες WHERE και HAVING της δήλωσης SELECT.
  • ορίστε τον πίνακα στην πρόταση FROM ως αποτέλεσμα της εκτέλεσης ενός δευτερεύοντος ερωτήματος.
  • ισχύουν συσχετιζόμενα υποερωτήματα. Ένα υποερώτημα λέγεται ότι συσχετίζεται εάν το ερώτημα που περιέχεται στο κατηγόρημα έχει μια αναφορά σε μια τιμή από έναν πίνακα (εξωτερικό του ερωτήματος) που ελέγχεται από το κατηγόρημα.

Ορισμένα DBMS (για παράδειγμα, Oracle DBMS) σας επιτρέπουν να δημιουργήσετε νέους πίνακες με βάση ένα δευτερεύον ερώτημα χρησιμοποιώντας τη δήλωση CREATE TABLE.

Ένα απλό παράδειγμα χρήσης ενός δευτερεύοντος ερωτήματος είναι η ακόλουθη πρόταση:

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

Εάν το υποερώτημα δεν επιλέξει καμία σειρά, το κατηγόρημα θα είναι ίσο με το ΑΓΝΩΣΤΟ, το οποίο ερμηνεύεται από τα περισσότερα DBMS ως FALSE.

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

Για παράδειγμα:

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

Για παράδειγμα:

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

Για παράδειγμα:

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

Ωστόσο, η χρήση του τελεστή IN έχει επίσης ορισμένα σημασιολογικά μειονεκτήματα: το ερώτημα δεν καθορίζει με σαφήνεια πόσες σειρές πρέπει να είναι το αποτέλεσμα του ερωτήματος. Κατά τη δημιουργία σχέσεων για ένα πραγματικό μοντέλο δεδομένων, αυτό μπορεί να οδηγήσει σε κάποια ασάφεια και εξάρτηση από τα ίδια τα δεδομένα. Διαφορετικά, εάν το μοντέλο δεδομένων υποθέσει την παρουσία μιας μόνο σειράς ως σταθερό αποτέλεσμα του υποερωτήματος και, κατά συνέπεια, χρησιμοποιεί τον τελεστή σύγκρισης =, και η δομή δεδομένων επιτρέπει την εισαγωγή τιμών όταν το αποτέλεσμα του υποερωτήματος θα είναι περισσότερες από μία γραμμή, τότε όταν χρησιμοποιείτε έναν τέτοιο τελεστή SQL στο Ένα σφάλμα μπορεί να εμφανιστεί κάποια στιγμή.

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

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

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

Ένα υποερώτημα μπορεί να καθοριστεί είτε σε ένα κατηγόρημα που ορίζεται από έναν όρο WHERE είτε σε ένα κατηγόρημα ομάδας που ορίζεται από έναν όρο HAVING.

Για παράδειγμα:

Συσχετισμένα υποερωτήματα

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

Για παράδειγμα:

Σε αυτήν την περίπτωση, για κάθε σειρά του πίνακα tbl1, θα ελεγχθεί η συνθήκη ότι η τιμή του πεδίου f2 συμπίπτει με την τιμή της γραμμής του πίνακα tbl2, όπου η τιμή του πεδίου f3 είναι ίση με την τιμή του πεδίου f3 του εξωτερικού πίνακας (tbl1). Αυτό απλούστερο παράδειγμα συσχετισμένο υποερώτημα.

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

Για παράδειγμα:

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

Για παράδειγμα:

Κατασκευάζοντας ένα κατηγόρημα για ένα υποερώτημα που επιστρέφει πολλές σειρές

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

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

Για παράδειγμα:

Αυτό το ερώτημα θα δημιουργήσει ένα μη κενό σύνολο αποτελεσμάτων μόνο εάν μια ημερομηνία εισήχθη σε οποιαδήποτε τιμή στη στήλη f4 του πίνακα, για παράδειγμα: "10/11/2003".

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

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

Το πρότυπο SQL-92 δεν προβλέπει τη χρήση συναρτήσεων συγκέντρωσης σε υποερωτήματα στα οποία εφαρμόζεται ο τελεστής EXISTS. Ωστόσο, ορισμένα DBMS επιτρέπουν αυτόν τον τύπο υποερωτήματος.

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

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

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

Χρήση υποερωτημάτων σε δηλώσεις τροποποίησης δεδομένων

Οι δηλώσεις DML, εκτός από τη δήλωση SELECT, περιλαμβάνουν δηλώσεις που σας επιτρέπουν να αλλάξετε δεδομένα σε πίνακες. Αυτός είναι ο χειριστής ΕΙΣΑΓΕΤΕ, που εκτελεί την προσθήκη μιας ή περισσότερων σειρών σε έναν πίνακα, τελεστή ΔΙΑΓΡΑΦΩ, που αφαιρεί μία ή περισσότερες σειρές από έναν πίνακα και τον τελεστή ΕΚΣΥΓΧΡΟΝΙΖΩ, το οποίο αλλάζει τις τιμές των στηλών του πίνακα.

INSERT δήλωση

Χειριστής ΕΙΣΑΓΕΤΕ

INSERT INTO table_name [ (πεδίο .,:) ] ( VALUES (τιμή .,:) ) | υποερώτημα | (ΠΡΟΕΠΙΛΟΓΙΚΕΣ ΤΙΜΕΣ)

Χειριστής ΕΙΣΑΓΕΤΕμπορεί να προσθέσει μία ή περισσότερες σειρές στον πίνακα. Η λίστα πεδίων (πεδίο .,:) καθορίζει τα ονόματα των πεδίων και τη σειρά με την οποία οι τιμές εισάγονται σε αυτά από τη λίστα τιμών που ορίζονται από τη φράση VALUES ή ως αποτέλεσμα της εκτέλεσης ενός υποερωτήματος.

Η λίστα που ορίζεται από τον όρο VALUES ονομάζεται κατασκευαστής τιμών πίνακα και καθορίζεται σε παρενθέσεις, διαχωρισμένες με κόμματα.

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

Εάν οι στήλες που υπόκεινται σε περιορισμό NOT NULL δεν έχουν δεδομένα για προσθήκη, το DBMS δημιουργεί ένα σφάλμα εκτέλεσης δήλωσης SQL.

Επόμενος χειριστής ΕΙΣΑΓΕΤΕδείχνει την αντιγραφή σειρών από τον πίνακα tbl2 με βάση ένα υποερώτημα:

INSERT INTO tbl1(f1,f2,f3) (ΕΠΙΛΟΓΗ f1,f2,f3 FROM tbl2);

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

ΔΙΑΓΡΑΦΗ δήλωσης

Χειριστής ΔΙΑΓΡΑΦΩστο πρότυπο SQL-92 έχει την ακόλουθη επίσημη περιγραφή:

Χειριστής ΔΙΑΓΡΑΦΩχρησιμοποιείται για την αφαίρεση σειρών από έναν πίνακα που καθορίζεται από μια συνθήκη στον όρο WHERE ( αφαίρεση αναζήτησης, διαγραφή αναζήτησης) ή WHERE CURRENT OF (διαγραφή σε θέση).

Η διαγραφή θέσης, που ορίζεται από την πρόταση WHERE CURRENT OF, διαγράφοντας σειρές από τον κέρσορα, τις διαγράφει αντίστοιχα από τον πίνακα της βάσης δεδομένων στον οποίο δημιουργήθηκε αυτός ο κέρσορας.

Εάν ο χειριστής ΔΙΑΓΡΑΦΩεφαρμόζεται σε οποιαδήποτε προβολή, τα δεδομένα διαγράφονται επίσης από τον πίνακα βάσης δεδομένων που δημιουργήθηκε με βάση τον τελευταίο.

Δεν πρέπει ποτέ να ξεχνάμε ότι εάν δεν υπάρχει ρήτρα WHERE ή η κατηγόρηση στην πρόταση WHERE αξιολογείται πάντα σε TRUE, τότε ο τελεστής ΔΙΑΓΡΑΦΩθα αφαιρέσει όλες τις σειρές από τον πίνακα.

ΕΝΗΜΕΡΩΣΗ δήλωσης

Χειριστής ΕΚΣΥΓΧΡΟΝΙΖΩστο πρότυπο SQL-92 έχει την ακόλουθη επίσημη περιγραφή:

Χειριστής ΕΚΣΥΓΧΡΟΝΙΖΩχρησιμοποιείται για την πραγματοποίηση αλλαγών σε δεδομένα πίνακα.

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

Μπορείτε να χρησιμοποιήσετε μια έκφραση υπό όρους κατά τον υπολογισμό των τιμών στηλών ΥΠΟΘΕΣΗκαι μια έκφραση CAST για χύτευση τύπου.

Για παράδειγμα:

Έκφραση υπό όρους ΠΕΡΙΠΤΩΣΗ

Έκφραση υπό όρους ΥΠΟΘΕΣΗσας επιτρέπει να επιλέξετε μία από πολλές τιμές με βάση μια καθορισμένη συνθήκη.

Έκφραση υπό όρους ΥΠΟΘΕΣΗέχει την ακόλουθη επίσημη περιγραφή:

( ΠΕΡΙΠΤΩΣΗ ( expr WHEN expr THEN ( expr | NULL )) | ( WHEN expr THEN ( expr | NULL )) [ ELSE ( expr | NULL ) ] ΤΕΛΟΣ) | ( NULLIF (expr1,expr2) ) | (ΣΥΝΔΥΑΣΗ (εκφρ.,:) )

Έκφραση υπό όρους ΥΠΟΘΕΣΗμπορεί να γραφτεί, αντίστοιχα, σε τέσσερις μορφές:

  • ΥΠΟΘΕΣΗμε εκφράσεις. Για παράδειγμα:

    ΕΠΙΛΟΓΗ f1, ΠΕΡΙΠΤΩΣΗ f3 ΟΤΑΝ "abc" ΤΟΤΕ "1_abc" ΤΕΛΟΣ ΑΠΟ tbl1;

  • ΥΠΟΘΕΣΗμε κατηγορήματα. Για παράδειγμα:

    ΕΠΙΛΟΓΗ f1, ΠΕΡΙΠΤΩΣΗ ΟΤΑΝ f3= "abc" ΜΕΤΑ "1_abc" ΑΛΛΟ f3 ΤΕΛΟΣ ΑΠΟ tbl1;

  • NULLIF - εάν οι εκφράσεις που καθορίζονται στις παρενθέσεις δεν ταιριάζουν, τότε επιλέγεται η πρώτη από αυτές τις τιμές, διαφορετικά η τιμή ορίζεται σε NULL. Για παράδειγμα:
  • COALESCE - επιλέγει την πρώτη τιμή που δεν είναι NULL στη λίστα. Για παράδειγμα:

    INSERT INTO tbl1(f1,f2) VALUES (1+ COALESCE(SELECT MAX(f1) FROM tbl1, 0), 100);

Για να εκτελέσετε με επιτυχία τη δήλωση ΕΚΣΥΓΧΡΟΝΙΖΩαπαιτούνται ορισμένες προϋποθέσεις, συμπεριλαμβανομένων των εξής:

  • διαθεσιμότητα κατάλληλων προνομίων·
  • μια άποψη απαιτεί να οριστεί ως μεταβλητή.
  • Κατά την αλλαγή προβολών, εφαρμόζονται οι περιορισμοί ΜΕ ΕΠΙΛΟΓΗ ΕΛΕΓΧΟΥ ή ΜΕ ΕΠΙΛΟΓΗ ΕΠΙΛΟΓΗ ΕΛΕΓΧΟΥ που τέθηκαν κατά τη δημιουργία της προβολής.
  • Σε συναλλαγές μόνο για ανάγνωση, οι αλλαγές είναι διαθέσιμες μόνο σε προσωρινούς πίνακες.
  • οι εκφράσεις που χρησιμοποιούνται για τον προσδιορισμό τιμών δεν μπορούν να περιέχουν υποερωτήματα με συναρτήσεις συγκέντρωσης.
  • Για έναν δρομέα με δυνατότητα ενημέρωσης που καθορίζεται από μια ρήτρα ΓΙΑ ΕΝΗΜΕΡΩΣΗ, κάθε στήλη προς ενημέρωση πρέπει επίσης να ορίζεται ως ΓΙΑ ΕΝΗΜΕΡΩΣΗ .
  • Σε έναν δρομέα με ρήτρα ORDER BY, δεν μπορείτε να τροποποιήσετε τις στήλες που καθορίζονται σε αυτόν τον όρο.