MySQL UNION – Πλήρες φροντιστήριο
⚡ Έξυπνη Σύνοψη
MySQL Η συνάρτηση UNION συνδυάζει τα αποτελέσματα δύο ή περισσότερων ερωτημάτων SELECT σε ένα ενιαίο σύνολο αποτελεσμάτων. Αυτή η εξήγηση καλύπτει τους κανόνες στηλών που καθιστούν μια ένωση έγκυρη, τη διαφορά μεταξύ UNION DISTINCT και UNION ALL, καθώς και επεξεργασμένα παραδείγματα που εκτελούνται στη βάση δεδομένων myflixdb.

Τι είναι μια ΕΝΩΣΗ στο MySQL?
ΕΝΩΣΗ είναι ένα MySQL τελεστής που συνδυάζει τα αποτελέσματα από πολλαπλά ερωτήματα SELECT σε ένα ενοποιημένο σύνολο αποτελεσμάτων. Οι γραμμές που επιστρέφονται από το δεύτερο ερώτημα τοποθετούνται κάτω από τις γραμμές που επιστρέφονται από το πρώτο, γεγονός που παράγει μία κάθετη λίστα αντί για δύο ξεχωριστές.
Η μόνη απαίτηση για να λειτουργήσει αυτό είναι ο αριθμός των στηλών να είναι ο ίδιος από όλα τα ερωτήματα SELECT που πρέπει να συνδυαστούν.
Ας υποθέσουμε ότι έχουμε δύο πίνακες ως εξής.
Και οι δύο πίνακες περιέχουν δύο στήλες του ίδιου είδους, επομένως είναι επιλέξιμοι για ένωση. Τα παραδείγματα που ακολουθούν συνδυάζουν ακριβώς αυτούς τους δύο πίνακες.
Γιατί να χρησιμοποιήσετε την UNION;
Ας υποθέσουμε ότι υπάρχει κάποιο ελάττωμα στο σχεδιασμό της βάσης δεδομένων σας και χρησιμοποιείτε δύο διαφορετικούς πίνακες που προορίζονται για τον ίδιο σκοπό. Θέλετε να ενοποιήσετε αυτούς τους δύο πίνακες σε έναν, παραλείποντας τυχόν διπλότυπες εγγραφές από το cree.ping στον νέο πίνακα. Μπορείτε να χρησιμοποιήσετε την UNION σε τέτοιες περιπτώσεις.
Ο τελεστής είναι επίσης χρήσιμος στην καθημερινή εργασία αναφοράς:
- Archiδεδομένα ved και live: Ένας τρέχων πίνακας και ένας πίνακας αρχειοθέτησης που μοιράζονται τις ίδιες στήλες μπορούν να αναφερθούν μαζί, χωρίς να συγχωνευθούν φυσικά.
- Αρκετές πηγές, μία αναφορά: Τα μέλη και οι ταινίες ή οι πωλήσεις από δύο περιοχές μπορούν να καταχωρηθούν σε ένα μόνο αποτέλεσμα για γρήγορο έλεγχο.
- Έλεγχοι μετεγκατάστασης: Οι γραμμές από τον παλιό πίνακα και τον νέο πίνακα μπορούν να στοιβάζονται και να συγκρίνονται πριν από την απόρριψη του παλιού πίνακα.
Μια ένωση δεν υποκαθιστά μια συνάρτηση JOIN. Η συνάρτηση UNION προσθέτει γραμμές κάτω από γραμμές, ενώ μια συνάρτηση JOIN προσθέτει στήλες δίπλα στις στήλες, και αυτή η διάκριση αποφασίζει ποιον τελεστή απαιτεί η εργασία.
MySQL Σύνταξη και Κανόνες UNION
Τώρα που ο σκοπός είναι σαφής, εξετάστε το σχήμα της δήλωσης και τους κανόνες που επιβάλλει η βάση δεδομένων.
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
Τρεις κανόνες διέπουν κάθε σωματείο:
- Ίσος αριθμός στηλών. Κάθε Δήλωση SELECT πρέπει να επιστρέψει τον ίδιο αριθμό στηλών, διαφορετικά MySQL εμφανίζει το σφάλμα 1222.
- Συμβατοί τύποι δεδομένων με την ίδια σειρά. Η πρώτη στήλη του πρώτου ερωτήματος αντιστοιχεί στη στήλη ένα του δεύτερου, επομένως ένας αριθμός θα πρέπει να ταιριάζει με έναν αριθμό και το κείμενο θα πρέπει να ταιριάζει με κείμενο.
- Τα ονόματα προέρχονται από το πρώτο ερώτημα. Η επικεφαλίδα του συνόλου αποτελεσμάτων λαμβάνεται από το πρώτο SELECT, γι' αυτό και οποιοδήποτε ψευδώνυμο ανήκει εκεί.
An ORDER BY είτε για LIMIT Η ρήτρα που τοποθετείται στο τέλος εφαρμόζεται στο συνδυασμένο αποτέλεσμα και όχι σε έναν κλάδο αυτού και πρέπει να αναφέρεται στα ονόματα των στηλών που παράγονται από το πρώτο SELECT.
UNION DISTINCT εναντίον UNION ALL
Με τους κανόνες σε ισχύ, η απόφαση που απομένει είναι αν οι διπλότυπες γραμμές θα πρέπει να επιβιώσουν.
Συνδυασμός πινάκων χρησιμοποιώντας DISTINCT
Ας δημιουργήσουμε τώρα ένα ερώτημα UNION για να συνδυάσουμε και τους δύο πίνακες χρησιμοποιώντας DISTINCT.
SELECT column1, column2 FROM `table1` UNION DISTINCT SELECT column1, column2 FROM `table2`;
Εδώ οι διπλότυπες σειρές καταργούνται και επιστρέφονται μόνο οι μοναδικές σειρές.
Σημείωση: MySQL χρησιμοποιεί τον όρο DISTINCT ως προεπιλογή κατά την εκτέλεση ερωτημάτων UNION εάν δεν έχει καθοριστεί τίποτα.
Συνδυασμός πινάκων χρησιμοποιώντας ALL
Ας δημιουργήσουμε τώρα ένα ερώτημα UNION για να συνδυάσουμε και τους δύο πίνακες χρησιμοποιώντας ALL.
SELECT `column1`, `column2` FROM `table1` UNION ALL SELECT `column1`, `column2` FROM `table2`;
Εδώ περιλαμβάνονται διπλότυπες γραμμές, καθώς χρησιμοποιούμε ALL.
Οι δύο εικόνες κάνουν τη διαφορά εύκολα αντιληπτή και ο παρακάτω πίνακας τη συνοψίζει.
| Σημείο σύγκρισης | ΔΙΑΚΡΙΣΗ ΕΝΩΣΗΣ | UNION ALL |
|---|---|---|
| Διπλότυπες σειρές | Αφαιρέθηκε από το αποτέλεσμα | Διατηρήθηκε στο αποτέλεσμα |
| Προεπιλεγμένη συμπεριφορά | Ναι, εφαρμόζεται όταν δεν έχει καθοριστεί τίποτα | Όχι, η λέξη-κλειδί ALL πρέπει να γραφτεί |
| Ταχύτητα | Πιο αργό, απαιτείται άδεια κατάργησης διπλότυπων | Ταχύτερα, οι γραμμές επιστρέφονται καθώς διαβάζονται |
| καλύτερα χρησιμοποιείται όταν | Η συγχωνευμένη λίστα πρέπει να περιέχει μοναδικές γραμμές | Κάθε σειρά έχει σημασία, διαφορετικά δεν μπορούν να εμφανιστούν διπλότυπα |
💡 Συμβουλές: Εάν οι δύο κλάδοι δεν μπορούν να παράγουν διπλότυπες γραμμές, επιλέξτε UNION ALL. Στη συνέχεια, η βάση δεδομένων παραλείπει την εργασία ταξινόμησης και σύγκρισης που απαιτεί η DISTINCT, η οποία αποτελεί αξιοσημείωτη εξοικονόμηση σε μεγάλους πίνακες.
Πρακτικό παράδειγμα χρήσης MySQL Πάγκος εργασίας
Τα παραδείγματα μέχρι στιγμής χρησιμοποίησαν δείγματα πινάκων. Το ίδιο ερώτημα εκτελείται τώρα στην πραγματική βάση δεδομένων myflixdb, όπου οι δύο πίνακες περιέχουν αρκετά διαφορετικές εγγραφές.
Στο myFlixDB μας, ας συνδυάσουμε το membership_number και full_names στήλες από τον πίνακα μελών με το movie_id και title στήλες από τον πίνακα ταινιών. Και τα δύο ερωτήματα επιστρέφουν δύο στήλες, επομένως η ένωση είναι έγκυρη.
Μπορούμε να χρησιμοποιήσουμε το ακόλουθο ερώτημα.
SELECT `membership_number`, `full_names` FROM `members` UNION SELECT `movie_id`, `title` FROM `movies`;
Εκτέλεση του παραπάνω σεναρίου στο MySQL πάγκος εργασίας έναντι του myflixdb μας δίνει τα ακόλουθα αποτελέσματα που φαίνονται παρακάτω. Παρατηρήστε ότι οι επικεφαλίδες προέρχονται από το πρώτο SELECT, παρόλο που οι κάτω σειρές είναι αρχεία ταινιών.
| membership_number | full_names |
|---|---|
| 1 | Janet Jones |
| 2 | Janet Smith Jones |
| 3 | Robert Phil |
| 4 | Gloria Williams |
| 5 | Leonard Hofstadter |
| 6 | Sheldon Cooper |
| 7 | Rajesh Koothrappali |
| 8 | Leslie Winkle |
| 9 | Howard Wolowitz |
| 16 | 67% Guilty |
| 6 | Angels and Demons |
| 4 | Code Name Black |
| 5 | Daddy's Little Girls |
| 7 | Davinci Code |
| 2 | Forgetting Sarah Marshal |
| 9 | Honey mooners |
| 19 | movie 3 |
| 1 | Pirates of the Caribean 4 |
| 18 | sample movie |
| 17 | The Great Dictator |
| 3 | X-Men |




