Οργάνωση ερωτημάτων χρησιμοποιώντας την ένωση. Union of UNION και UNION ALL σε SQL - περιγραφή και παραδείγματα. Ταξινόμηση των αποτελεσμάτων συνδυασμένων ερωτημάτων

Το μάθημα θα καλύψει το θέμα της χρήσης των πράξεων των ερωτημάτων ένωσης, τομής και διαφοράς. Παραδείγματα για το πώς χρησιμοποιείται Ερώτημα SQL Ένωση, υπάρχει και η χρήση των λέξεων-κλειδιών SOME, ANY και All. Καλύπτονται συναρτήσεις συμβολοσειράς


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

Μια ειδική λέξη χρησιμοποιείται για να συνδυάσει πολλά ερωτήματα ΕΝΩΣΗ.
Σύνταξη:

< запрос 1 >ΕΝΩΣΗ[ΟΛΟΙ]< запрос 2 >

<запрос 1>ΕΝΩΣΗ<запрос 2>

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

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

Μπορείτε να συνδυάσετε οποιονδήποτε αριθμό ερωτημάτων μαζί.

Η χρήση του χειριστή UNION απαιτεί να πληρούνται διάφορες προϋποθέσεις:

  1. Ο αριθμός των στηλών εξόδου κάθε ερωτήματος πρέπει να είναι ο ίδιος.
  2. οι στήλες εξόδου κάθε ερωτήματος πρέπει να είναι συγκρίσιμες μεταξύ τους κατά τύπο δεδομένων (με σειρά προτεραιότητας).
  3. το σύνολο που προκύπτει χρησιμοποιεί τα ονόματα στηλών που καθορίζονται στο πρώτο ερώτημα.
  4. Η ORDER BY μπορεί να χρησιμοποιηθεί μόνο στο τέλος ενός σύνθετου ερωτήματος επειδή ισχύει για το αποτέλεσμα της ένωσης.

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


✍ Λύση:
1 2 3 4 5 6 SELECT `Number` , `Price` FROM pc UNION SELECT `Number` , `Price` FROM notebook ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ `Τιμή`

SELECT `Number` , `Price` FROM pc UNION SELECT `Number` , `Price` FROM notebook ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ `Τιμή`

Αποτέλεσμα:

Ας δούμε ένα πιο περίπλοκο παράδειγμα με μια εσωτερική ένωση:

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


✍ Λύση:
1 2 3 4 5 6 7 8 ΕΠΙΛΟΓΗ προϊόντος. «Τύπος», pc. `Αριθμός` , `Τιμή` ΑΠΟ pc προϊόν INNER JOIN ΣΕ τεμ. «Αριθμός» = προϊόν. «Αριθμός» προϊόν UNION SELECT. «Τύπος», σημειωματάριο. `Αριθμός` , `Τιμή` ΑΠΟ notebook INNER JOIN προϊόν ON notebook. «Αριθμός» = προϊόν. «Αριθμός» ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ «Τιμή».

ΕΠΙΛΟΓΗ προϊόντος.`Type` , pc.`Number` , `Price` FROM pc INNER JOIN product ON pc.`Number` = product.`Number` UNION SELECT product.`Type` , notebook.`Number` , `Price` ΑΠΟ notebook ΕΣΩΤΕΡΙΚΟ ΕΓΓΡΑΦΕΙΤΕ προϊόν ΣΤΟ σημειωματάριο.`Αριθμός` = προϊόν.`Αριθμός` ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ `Τιμή`

Αποτέλεσμα:

SQL Union 1.Βρείτε τον κατασκευαστή, τον αριθμό ανταλλακτικού και την τιμή όλων των φορητών υπολογιστών και εκτυπωτών

SQL Union 2.Βρείτε αριθμούς και τιμές όλων των προϊόντων που παράγονται από τον κατασκευαστή Ρωσία

Το κατηγόρημα ύπαρξης SQL ΥΠΑΡΧΕΙ

Η SQL διαθέτει εγκαταστάσεις για την εκτέλεση λειτουργιών τομής και διαφοράς σε ερωτήματα—την πρόταση INTERSECT (τομή) και την πρόταση EXCEPT (διαφορά). Αυτές οι ρήτρες λειτουργούν παρόμοια με τον τρόπο λειτουργίας της UNION: το σύνολο αποτελεσμάτων περιλαμβάνει μόνο εκείνες τις γραμμές που υπάρχουν και στα δύο ερωτήματα - INTERSECT ή μόνο εκείνες τις γραμμές του πρώτου ερωτήματος που λείπουν στο δεύτερο - EXCEPT. Αλλά το πρόβλημα είναι ότι πολλά DBMS δεν υποστηρίζουν αυτές τις προτάσεις. Αλλά υπάρχει διέξοδος - χρησιμοποιώντας το κατηγόρημα ΥΠΑΡΧΕΙ.

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

Τυπικά EXISTS χρησιμοποιείται σε εξαρτημένα υποερωτήματα (για παράδειγμα, IN).

ΥΠΑΡΧΕΙ (υποερώτημα πίνακα)

Παράδειγμα:Βρείτε κατασκευαστές υπολογιστών που παράγουν επίσης φορητούς υπολογιστές


✍ Λύση:

SELECT DISTINCT Manufacturer FROM product AS pc_product WHERE Type = "Computer" AND EXISTS (SELECT Manufacturer FROM product WHERE Type = "Laptop" AND Manufacturer = pc_product.Manufacturer)

Αποτέλεσμα:

Βρείτε τους κατασκευαστές υπολογιστών που δεν κατασκευάζουν εκτυπωτές

SQL ΟΡΙΣΜΕΝΕΣ Λέξεις-κλειδιά | ΟΠΟΙΑΔΗΠΟΤΕ και ΟΛΑ

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

Σύνταξη:

< выражение>< оператор сравнения>ΚΑΠΟΙΑ | ΟΠΟΙΟΣ (< подзапрос> )

<выражение><оператор сравнения>ΚΑΠΟΙΑ | ΟΠΟΙΟΣ (<подзапрос>)

Εάν για οποιαδήποτε τιμή X που επιστράφηκε από ένα υποερώτημα, το αποτέλεσμα της λειτουργίας " " επιστρέψει TRUE , τότε το κατηγόρημα ΟΠΟΙΑΔΗΠΟΤΕ αξιολογείται επίσης σε TRUE .

Παράδειγμα:Βρείτε προμηθευτές υπολογιστών των οποίων οι αριθμοί δεν πωλούνται (δηλαδή δεν υπάρχουν στον πίνακα υπολογιστή)


✍ Λύση:

Δεδομένα πηγής πίνακα:

Αποτέλεσμα:

Στο παράδειγμα, το κατηγόρημα Number = ANY (SELECT Number FROM pc) θα επιστρέψει την τιμή TRUE όταν ο αριθμός από το κύριο ερώτημα βρεθεί στη λίστα Numbers of table pc (που επιστρέφεται από το υποερώτημα). Επιπλέον, ΔΕΝ χρησιμοποιείται. Το σύνολο αποτελεσμάτων θα αποτελείται από μία στήλη - Κατασκευαστής. Για να μην εμφανίζεται πολλές φορές ένας κατασκευαστής, έχει εισαχθεί η λέξη υπηρεσίας DISTINCT.
Ας δούμε τώρα τη χρήση της λέξης-κλειδιού ALL:

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


✍ Λύση:

Σπουδαίος:Αξίζει να σημειωθεί ότι γενικά, ένα ερώτημα με ΟΠΟΙΑΔΗΠΟΤΕ επιστρέφει ένα σύνολο τιμών. Επομένως, η χρήση ενός δευτερεύοντος ερωτήματος σε έναν όρο WHERE χωρίς τους τελεστές EXISTS , IN , ALL και ANY, οι οποίοι παράγουν μια Boolean τιμή, μπορεί να οδηγήσει σε σφάλμα χρόνου εκτέλεσης ερωτήματος


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


✍ Λύση:


Αυτό το ερώτημα είναι σωστό επειδή η βαθμωτή έκφραση Price συγκρίνεται με ένα δευτερεύον ερώτημα που επιστρέφει μια μεμονωμένη τιμή

Λειτουργίες για εργασία με συμβολοσειρές σε SQL

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

ΑΡΙΣΤΕΡΑ (<строка>,<число>)

Η συνάρτηση RIGHT επιστρέφει τον καθορισμένο αριθμό χαρακτήρων στα δεξιά από μια παράσταση συμβολοσειράς:

ΣΩΣΤΑ(<строка>,<число>)

Παράδειγμα:Εκτυπώστε τα πρώτα γράμματα των ονομάτων όλων των κατασκευαστών


✍ Λύση:

SELECT DISTINCT LEFT(`Manufacturer` , 1) FROM `product`

Αποτέλεσμα:

Παράδειγμα:Εκτυπώστε ονόματα κατασκευαστών που αρχίζουν και τελειώνουν με το ίδιο γράμμα


✍ Λύση:

Λειτουργία αντικατάστασης SQL

Σύνταξη:

SELECT `name` , REPLACE(`name` , "a", "aa") FROM `teachers`

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

Η UNION ανήκει στην κατηγορία τελεστών για εργασία με σύνολα δεδομένων (τελεστής συνόλου). Άλλοι τέτοιοι τελεστές περιλαμβάνουν το INTERSECT και το EXCERT (το EXCERT και το MINUS είναι λειτουργικά ισοδύναμα, αλλά το EXCERT είναι μέρος του προτύπου ANSI).Όλοι οι τελεστές συνόλων δεδομένων χρησιμοποιούνται για τον ταυτόχρονο χειρισμό των συνόλων αποτελεσμάτων δύο ή περισσότερων ερωτημάτων, εξ ου και το όνομά τους.

Σύνταξη S0L2003

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

ΕΝΩΣΗ

ΕΝΩΣΗ

Λέξεις-κλειδιά

ΕΝΩΣΗ

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

ΟΛΑ

Διπλότυπες σειρές από όλα τα σύνολα αποτελεσμάτων συγχωνεύονται επίσης.

ΔΙΑΚΡΙΤΗ

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

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

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

Οι τύποι δεδομένων δεν χρειάζεται να είναι πανομοιότυποι, αλλά πρέπει να είναι συμβατοί. Για παράδειγμα, οι τύποι CHAR και VARCHAR είναι συμβατοί. Από προεπιλογή, το tsabor που προκύπτει χρησιμοποιεί το μέγεθος του μεγαλύτερου συμβατού τύπου και σε ένα ερώτημα που συνδυάζει τρεις στήλες CHAR - CHAR(5), CHAR(IO) και CHAR(12), τα αποτελέσματα θα είναι σε μορφή CHAR(12) , και σε στήλες μικρότερα μεγέθη θα προσθέσουν επιπλέον κενά.

Αν και το πρότυπο ANSI καθορίζει ότι ο τελεστής INTERSECT έχει υψηλότερη προτεραιότητα από άλλους τελεστές συνόλου, σε πολλές πλατφόρμες αυτοί οι τελεστές αντιμετωπίζονται ως έχοντες την ίδια προτεραιότητα. Μπορείτε να ελέγξετε ρητά την προτεραιότητα του τελεστή χρησιμοποιώντας παρενθέσεις. Διαφορετικά, το ΣΔΒΔ πιθανότατα θα τα εκτελέσει με τη σειρά από αριστερά προς τα δεξιά.

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

Σύμφωνα με το πρότυπο ANSI, μπορείτε να χρησιμοποιήσετε μόνο μία ρήτρα ORDER BY σε ένα ερώτημα. Τοποθετήστε το στο τέλος της τελευταίας δήλωσης SELECT. Για να αποφύγετε την ασάφεια κατά τον καθορισμό στηλών και πινάκων, φροντίστε να δώσετε σε όλες τις στήλες σε όλους τους πίνακες τα κατάλληλα ψευδώνυμα. Ωστόσο, κατά τον καθορισμό ονομάτων στηλών σε ένα ερώτημα SELECT ... UNION, χρησιμοποιείται μόνο το ψευδώνυμο από το πρώτο ερώτημα. Για παράδειγμα:

ΕΠΙΛΟΓΗ au_lname AS επώνυμο, au_fname AS όνομα ΑΠΟ συντάκτες UNION SELECT emp_lname AS επώνυμο, emp_fname AS όνομα ΑΠΟ υπαλλήλους ORDER BY onname, name;

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

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

DB2

Η πλατφόρμα DB2 υποστηρίζει τις λέξεις-κλειδιά ANSI UNION και UNION ALL συν τον όρο VALUES.

[, (έκφραση-!, έκφραση2, …)] […]

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

Αν και η ρήτρα UNION DISTINCT δεν υποστηρίζεται, το λειτουργικό ισοδύναμο είναι η ρήτρα UNION. Η ρήτρα ΑΝΤΙΣΤΟΙΧΗ δεν υποστηρίζεται.

Οι τύποι δεδομένων όπως VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK και τύποι δομής δεν μπορούν να χρησιμοποιηθούν με τη λέξη-κλειδί UNION (αλλά μπορούν να χρησιμοποιηθούν με τον όρο UNION ALL).

Εάν όλοι οι πίνακες χρησιμοποιούν το ίδιο όνομα στήλης, το σύνολο αποτελεσμάτων χρησιμοποιεί αυτό το όνομα. Εάν τα ονόματα των στηλών είναι διαφορετικά, το DB2 δημιουργεί ένα νέο όνομα στήλης. Στη συνέχεια, η στήλη δεν μπορεί να χρησιμοποιηθεί σε ρήτρα ORDER BY ή FOR UPDATE.

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

SELECT empno FROM υπάλληλος WHERE workdept LIKE "E%" UNION SELECT empno FROM emp_act WHERE projno IN ("IF1000", "IF2000", "AD3110") UNION VALUES ("AA0001", (AB0002"), ("AC00

Σε αυτό το παράδειγμα, λαμβάνουμε όλα τα αναγνωριστικά των εργαζομένων από τον πίνακα εργαζομένων που βρίσκονται σε οποιοδήποτε τμήμα με όνομα που ξεκινά με "E", καθώς και τα αναγνωριστικά όλων των υπαλλήλων από τον λογιστικό πίνακα emp_act που εργάζονται στα έργα IF1000 ", "IF2000" και "AD3110". Επιπλέον, τα αναγνωριστικά υπαλλήλων "AA000T, "AB0002" και "AC00031" περιλαμβάνονται πάντα εδώ.

MySQL

Δεν υποστηρίζεται.

Μαντείο

Η πλατφόρμα Oracle υποστηρίζει τις λέξεις-κλειδιά του προτύπου ANSI SQL UNION και UNION ALL. Η σύνταξη έχει ως εξής.

Η Oracle δεν υποστηρίζει την ρήτρα CORRESPONDING. Η ρήτρα UNION DISTINCT δεν το κάνει. υποστηρίζεται, αλλά το λειτουργικό ισοδύναμο είναι η ρήτρα UNION. Η πλατφόρμα Oracle δεν υποστηρίζει τη χρήση των όρων UNION ALL και UNION στις ακόλουθες περιπτώσεις.

Εάν το πρώτο ερώτημα στη δήλωση περιέχει οποιεσδήποτε εκφράσεις στη λίστα των στοιχείων, τότε χρησιμοποιήστε το ψευδώνυμο στη στήλη χρησιμοποιώντας τον όρο AS. Επιπλέον, μόνο το τελευταίο ερώτημα στη δήλωση μπορεί να περιέχει μια ρήτρα ORDER BY. Για παράδειγμα, μπορείτε να λάβετε όλα τα μοναδικά αναγνωριστικά καταστήματος (store_ids), χωρίς διπλότυπα, χρησιμοποιώντας το ακόλουθο ερώτημα.

SELECT stor_id ΑΠΟ καταστήματα UNION SELECT stor_id FROM sales;

PostgreSQL

Η πλατφόρμα PostgreSQL υποστηρίζει τις λέξεις-κλειδιά UNION και UNION ALL της τυπικής σύνταξης ANSI.

οδηγίες ΕΠΙΛΟΓΗ 2 ΕΝΩΣΗΣ

Η πλατφόρμα PostgreSQL δεν υποστηρίζει τη χρήση των όρων UNION και UNION ALL σε ερωτήματα με ρήτρα FOR UPDATE. Η PostgreSQL δεν υποστηρίζει την ρήτρα CORRESPONDING. Η ρήτρα UNION DISTINCT δεν υποστηρίζεται, το λειτουργικό ισοδύναμο είναι η ρήτρα UNION.

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

SELECT a.au_lname FROM συγγραφείς AS a WHERE a.au_lnanie LIKE "P%" UNI0N SELECT e.lname FROM υπαλλήλους AS e WHERE e.lname LIKE "P%";

SQL Server

Η πλατφόρμα SQL Server υποστηρίζει τις λέξεις-κλειδιά UNION και UNION ALL σε τυπική σύνταξη ANSI.

Δήλωση SELECT 1 UNION

Δήλωση SELECT 2 UNION

Ο SQL Server δεν υποστηρίζει την ρήτρα CORRESPONDING. Η ρήτρα UNION DISTINCT δεν υποστηρίζεται, αλλά το λειτουργικό ισοδύναμο είναι η ρήτρα UNION.

Με τους όρους UNION και UNION ALL, μπορείτε να χρησιμοποιήσετε την πρόταση SELECT...INTO, αλλά η λέξη-κλειδί INTO πρέπει να εμφανίζεται στο πρώτο ερώτημα του τελεστή ένωσης. Ειδικές λέξεις-κλειδιά όπως SELECT TOP και GROUP BY...WITH CUBE μπορούν να χρησιμοποιηθούν σε όλα τα ερωτήματα σύνδεσης. Ωστόσο, φροντίστε να συμπεριλάβετε αυτές τις προτάσεις σε όλα τα αιτήματα συμμετοχής. Εάν χρησιμοποιείτε τους όρους SELECT TOP ή GROUP BY... WITH CUBE στο ίδιο ερώτημα, η λειτουργία θα αποτύχει.

Όλα τα ερωτήματα σε μια ένωση πρέπει να περιέχουν τον ίδιο αριθμό στηλών. Οι τύποι δεδομένων των στηλών δεν χρειάζεται να είναι πανομοιότυποι, αλλά πρέπει να μπορούν να μεταδοθούν σιωπηρά μεταξύ τους. Για παράδειγμα, οι στήλες CHAR και VARCHAR μπορούν να χρησιμοποιηθούν μαζί. Κατά την έξοδο δεδομένων, ο SQL Server χρησιμοποιεί το μέγεθος της μεγαλύτερης στήλης κατά τον προσδιορισμό του μεγέθους του τύπου δεδομένων για μια στήλη συνόλου αποτελεσμάτων. Έτσι, εάν μια πρόταση SELECT... UNION χρησιμοποιεί στήλες CHAR(5) και CHAR(IO), τα δεδομένα και από τις δύο στήλες θα εξάγονται στη στήλη CHAR(IO). Οι αριθμητικοί τύποι δεδομένων μεταδίδονται και εμφανίζονται ως τύπος με την υψηλότερη ακρίβεια.

Για παράδειγμα, το ακόλουθο ερώτημα συνδυάζει τα αποτελέσματα δύο ανεξάρτητων ερωτημάτων που χρησιμοποιούν τον όρο GROUP BY...WITH CUBE.

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

1. Χρησιμοποιώντας τον τελεστή UNION

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

ΕΠΙΛΕΓΩ *
FROM Sumproduct LEFT JOIN Sellers ON Sumproduct.City = Sellers.City
ΕΝΩΣΗ
ΕΠΙΛΟΓΗ *

FROM Sumproduct RIGHT JOIN Sellers ON Sumproduct.City = Sellers.City

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

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

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

2. Ενεργοποιήστε ή απενεργοποιήστε τις επαναλαμβανόμενες γραμμές

Αίτημα από ΕΝΩΣΗαφαιρεί αυτόματα όλες τις διπλότυπες σειρές από το σύνολο αποτελεσμάτων ερωτήματος (δηλαδή, συμπεριφέρεται σαν προτάσεις ΟΠΟΥμε πολλαπλές προϋποθέσεις σε μια δήλωση ΕΠΙΛΕΓΩ). Αυτή η συμπεριφορά χειριστή ΕΝΩΣΗαπό προεπιλογή, αλλά μπορούμε να το αλλάξουμε εάν το επιθυμούμε. Για να γίνει αυτό θα πρέπει να χρησιμοποιήσουμε τον τελεστή ΕΝΩΣΗ ΟΛΩΝαντί ΕΝΩΣΗ.

3. Ταξινόμηση των αποτελεσμάτων συνδυασμένων ερωτημάτων

Αποτελέσματα εκτέλεσης δήλωσης ΕΠΙΛΕΓΩταξινομηθεί χρησιμοποιώντας μια ρήτρα ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ. Όταν συνδυάζετε ερωτήματα χρησιμοποιώντας ΕΝΩΣΗμόνο μια πρόταση ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑμπορεί να χρησιμοποιηθεί και πρέπει να περιλαμβάνεται στην τελευταία δήλωση ΕΠΙΛΕΓΩ. Πράγματι, στην πράξη δεν έχει νόημα η ταξινόμηση μέρους των αποτελεσμάτων με μια σειρά και το άλλο μέρος με άλλη. Επομένως, μερικές προτάσεις ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑδεν επιτρέπεται η χρήση.

Η πρόταση SQL UNION συνδυάζει το αποτέλεσμα δύο ή περισσότερων εντολών SELECT.

Χειριστής SQL UNION

Ο τελεστής UNION χρησιμοποιείται για τον συνδυασμό πολλαπλών αποτελεσμάτων δύο ή περισσότερων δηλώσεων SELECT.

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

Σύνταξη SQL UNION

ΕΠΙΛΕΓΩ όνομα(α) στήληςΑΠΟ Τραπέζι 1
ΕΝΩΣΗ
ΕΠΙΛΕΓΩ όνομα(α) στήληςΑΠΟ πίνακας 2 ;

Σημείωση: Ο τελεστής UNION επιλέγει μόνο διαφορετικές προεπιλεγμένες τιμές.Για να επιτρέψετε διπλότυπες τιμές, χρησιμοποιήστε τη λέξη-κλειδί ALL με UNION.

Σύνταξη SQL UNION ALL

ΕΠΙΛΕΓΩ όνομα(α) στήληςΑΠΟ Τραπέζι 1
ΕΝΩΣΗ ΟΛΩΝ
ΕΠΙΛΕΓΩ όνομα(α) στήληςΑΠΟ πίνακας 2 ;

ΥΓ: Τα ονόματα των στηλών στα αποτελέσματα των ερωτημάτων σε μια ένωση είναι συνήθως ίσα με τα ονόματα των στηλών στο πρώτο ZEBEST στην ένωση.

Επίδειξη έκδοσης της βάσης δεδομένων

Σε αυτό το σεμινάριο θα χρησιμοποιήσουμε τη γνωστή βάση δεδομένων Northwind.

Ακολουθεί μια επιλογή από τον πίνακα "Πελάτες":

ταυτότητα χρήστηΌνομα πελάτηΤο άτομο επικοινωνίαςΔιεύθυνσηπόληΤΑΧΥΔΡΟΜΙΚΟΣ ΚΩΔΙΚΟΣΜια χώρα
1 Alfreds Futterkiste Μαρία Άντερς Obere Str. 57 Βερολίνο 12209 Γερμανία
2 Ana Trujillo Emparedados y helados Άνα Τρουχίγιο Avda. de la Constitucion 2222 Μεξικό D.F. 05021 Μεξικό
3 Antonio Moreno Taqueria Αντόνιο Μορένο Ματάδερος 2312 Μεξικό D.F. 05023 Μεξικό

Και η επιλογή από τον πίνακα "Προμηθευτές":

Παράδειγμα SQL UNION

Η ακόλουθη πρόταση SQL - επιλογή όλων διάφοροςπόλεις (μόνο μεμονωμένες τιμές) από τους πίνακες "Πελάτες" και "Προμηθευτές":

Σημείωση: Το UNION δεν μπορεί να χρησιμοποιηθεί για τη λίστα όλων των πόλεων από δύο πίνακες.Εάν υπάρχουν πολλοί πελάτες και προμηθευτές στις ίδιες πόλεις, κάθε πόλη θα αναφέρεται μόνο μία φορά. Η UNION επιλέγει μόνο ορισμένες τιμές. Χρησιμοποιώντας το UNION ALL επιλέξτε επίσης διπλές τιμές!

Παράδειγμα SQL UNION ALL

Ολοι(διπλότυπες τιμές) και πόλεις από τους πίνακες "Πελάτες" και "Προμηθευτές":

SQL UNION ALL WITH WHERE

Η ακόλουθη πρόταση SQL χρησιμοποιεί UNION ALL για επιλογή Ολοι(διπλότυπες τιμές) επίσης Γερμανόςπόλεις από τους πίνακες "Πελάτες" και "Προμηθευτές".

Ο τελεστής SQL UNION έχει σχεδιαστεί για να συνδυάζει τους πίνακες βάσης δεδομένων που προκύπτουν που λαμβάνονται χρησιμοποιώντας τη λέξη SELECT. Προϋπόθεση για τη συγχώνευση των πινάκων που προκύπτουν: σύμπτωση του αριθμού, της σειράς και του τύπου δεδομένων των στηλών. ORDER BY θα πρέπει να εφαρμόζεται στο αποτέλεσμα μιας ένωσης και να τοποθετείται μόνο στο τέλος ενός σύνθετου ερωτήματος. Ο τελεστής UNION έχει την ακόλουθη σύνταξη:

ΕΠΙΛΟΓΗ COLUMN_NAMES (1..N) FROM TABLE_NAME UNION SELECT COLUMN_NAMES (1..N) FROM TABLE_NAME

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

Όταν χρησιμοποιείτε τον τελεστή UNION χωρίς τη λέξη ALL, το αποτέλεσμα δεν περιέχει διπλότυπα, αλλά με τη λέξη ALL, το αποτέλεσμα περιέχει διπλότυπα.

Σύνολα και μεμονωμένες τιμές σε έναν πίνακα χρησιμοποιώντας τον τελεστή SQL UNION

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

Τι γίνεται αν χρειαστεί να λάβουμε και μια σύνοψη όλων των μεμονωμένων τιμών και των συνολικών τιμών σε έναν πίνακα; Εδώ έρχεται να σώσει ο χειριστής SQL UNION, με τη βοήθεια του οποίου συνδυάζονται δύο ερωτήματα. Το αποτέλεσμα της ένωσης πρέπει να παραγγελθεί χρησιμοποιώντας την ρήτρα ORDER BY. Γιατί αυτό είναι απαραίτητο θα γίνει καλύτερα κατανοητό από παραδείγματα.

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

ΕΠΙΛΕΞΤΕ Όνομα, Εργασία, Μισθός ΑΠΟ ΠΡΟΣΩΠΙΚΟ ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ Εργασία

ΟνομαΔουλειάΜισθός
ΣάντερςMgr18357.5
MarenghiMgr17506.8
PernalΕκπτώσεις18171.2
ΓιατρόςΕκπτώσεις12322.4
παράγονταςΕκπτώσεις16228.7

Το δεύτερο ερώτημα θα επιστρέψει τον συνολικό μισθό ανά θέση. Ετοιμάζουμε ήδη αυτό το ερώτημα για να συνδεθούμε με το πρώτο, οπότε θα θυμόμαστε ότι η προϋπόθεση για τη σύνδεση είναι ο ίσος αριθμός στηλών, η σύμπτωση των ονομάτων, της σειράς και των τύπων δεδομένων τους. Επομένως, συμπεριλαμβάνουμε επίσης τη στήλη Όνομα με αυθαίρετη τιμή "Z-TOTAL" στον πίνακα με τα σύνολα:

ΕΠΙΛΕΞΤΕ "Z-TOTAL" ΩΣ Όνομα, Εργασία, ΠΟΣΟ (Μισθός) ΩΣ Μισθός ΑΠΟ ΟΜΑΔΑ ΠΡΟΣΩΠΙΚΟΥ ΑΝΑ Εργασία

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

ΟνομαΔουλειάΜισθός
Z-ΣΥΝΟΛΟMgr35864.3
Z-ΣΥΝΟΛΟΕκπτώσεις46722.3

Τώρα ας συνδυάσουμε ερωτήματα χρησιμοποιώντας τον τελεστή UNION και ας εφαρμόσουμε τον τελεστή ORDER BY στο αποτέλεσμα της ένωσης. Θα πρέπει να ομαδοποιήσετε κατά δύο στήλες: Εργασία και Όνομα, έτσι ώστε οι σειρές με συνολικές τιμές, στις οποίες η τιμή του ονόματος είναι "Z-TOTAL", να βρίσκονται κάτω από τις σειρές με μεμονωμένες τιμές. Η συνένωση των αποτελεσμάτων ερωτήματος θα είναι η εξής:

(ΕΠΙΛΕΞΤΕ Όνομα, Εργασία, Μισθός ΑΠΟ ΠΡΟΣΩΠΙΚΟ ) ΣΥΝΔΕΣΜΟ (ΕΠΙΛΕΞΤΕ "Ζ-ΣΥΝΟΛΟ" ΩΣ Όνομα, Εργασία, ΠΟΣΟ (Μισθός) ΩΣ Μισθός ΑΠΟ ΟΜΑΔΑ ΠΡΟΣΩΠΙΚΟΥ ΑΝΑ ΕΡΓΑΣΙΑ) ΠΑΡΑΓΓΕΛΙΑ ΑΝΑ Εργασία, Όνομα

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

ΟνομαΔουλειάΜισθός
MarenghiMgr17506.8
ΣάντερςMgr18357.5
Z-ΣΥΝΟΛΟMgr35864.3
ΓιατρόςΕκπτώσεις12322.4
παράγονταςΕκπτώσεις16228.7
PernalΕκπτώσεις18171.2
Z-ΣΥΝΟΛΟΕκπτώσεις46722.3

Γράψτε ερωτήματα χρησιμοποιώντας το UNION και μετά δείτε τη λύση

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

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

ΟνομαΤμΧρόνια
Σάντερς20 7
Pernal20 8
Marenghi38 5
Γιατρός20 5
παράγοντας38 8

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

Άλλες χρήσεις για τη σύνδεση ερωτημάτων στον ίδιο πίνακα με χρήση του τελεστή SQL UNION

Παράδειγμα 4.Η βάση δεδομένων της εταιρείας έχει έναν πίνακα προσωπικού που περιέχει δεδομένα για τους υπαλλήλους της εταιρείας. Περιέχει τις στήλες Μισθός (ποσό μισθού), Εργασία (θέση) και Έτη (διάρκεια εργασιακής εμπειρίας). Το πρώτο αίτημα είναι απαραίτητο για τη λήψη δεδομένων σχετικά με υπαλλήλους των οποίων ο μισθός είναι μεγαλύτερος από 21.000:

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

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

Το αποτέλεσμα της εκτέλεσης ενός ερωτήματος με τον τελεστή UNION θα είναι ο ακόλουθος πίνακας:

ταυτότηταΟνομα
10 Σάντερς
30 Marenghi
100 Plotz
140 Φρέι
160 Molinare
240 Ντάνιελς
260 Τζόουνς

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

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

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

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

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

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

Σύνδεση αποτελεσμάτων ερωτήματος σε δύο πίνακες χρησιμοποιώντας τον τελεστή SQL UNION

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

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

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

ΕΠΙΛΕΞΤΕ ΔΙΑΚΡΙΤΗ ΤΙΜΗ ΑΠΟ VINIL

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

Τώρα ας δημιουργήσουμε ένα συνδυασμένο ερώτημα με τον τελεστή UNION:

ΕΠΙΛΕΞΤΕ ΔΙΑΚΡΙΤΗ Τιμή ΑΠΟ VINIL UNION ΕΠΙΛΕΞΤΕ ΔΙΑΚΡΙΤΗ τιμή ΑΠΟ ΧΑΡΤΙ

Εφόσον δεν χρησιμοποιούμε τη λέξη ALL, δεν θα βγουν διπλότυπες τιμές 400, 500 και 530. Το αποτέλεσμα του ερωτήματος θα είναι ο παρακάτω πίνακας:

Τιμή
300
320
360
400
430
500
530
610
720
800
850

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

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

ΕΠΙΛΕΞΤΕ ΔΙΑΚΡΙΤΗ Τιμή ΑΠΟ VINIL UNION ALL SELECT DISTINCT Price FROM PAPER

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

Τιμή
300
320
360
400
400
430
500
500
530
530
610
720
800
850

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

Παράδειγμα 8.Υπάρχει μια βάση δεδομένων «Θέατρο». Ο πίνακας Αναπαραγωγή περιέχει δεδομένα για παραγωγές (ονόματα στη στήλη Όνομα) και ο πίνακας Διευθυντής περιέχει δεδομένα για σκηνοθέτες (όνομα στη στήλη Fname, επώνυμο στη στήλη Lname). Το πρωτεύον κλειδί του πίνακα Director είναι dir_id - ο αριθμός αναγνώρισης του διευθυντή. Το Dir_id είναι επίσης ένα ξένο κλειδί του πίνακα Play, αναφέρεται στο πρωτεύον κλειδί του πίνακα Director. Απαιτείται για την παραγωγή παραγωγών σε σκηνοθεσία John Barton και Trevor Nunn.

Λύση. Ας συνδυάσουμε τα αποτελέσματα δύο ερωτημάτων - το ένα επιστρέφει παραστάσεις του σκηνοθέτη John Barton, το άλλο - του σκηνοθέτη Trevor Nunn. Και κάνουμε καθένα από αυτά τα συγχωνευμένα ερωτήματα στον πίνακα Play με ένα δευτερεύον ερώτημα στον πίνακα Director, το οποίο επιστρέφει το dir_id με το όνομα και το επίθετο του σκηνοθέτη. Κάθε εξωτερικό ερώτημα παίρνει την τιμή του κλειδιού dir_id από το ένθετο ερώτημα και επιστρέφει τα ονόματα των παραγωγών (Όνομα):

Σχεσιακές βάσεις δεδομένων και γλώσσα SQL