MySQL UNION – Πλήρες φροντιστήριο

⚡ Έξυπνη Σύνοψη

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

  • 🔗 Βασικός Σκοπός: Η συνάρτηση UNION στοιβάζει τις γραμμές που επιστρέφονται από πολλά ερωτήματα SELECT σε ένα μόνο σύνολο αποτελεσμάτων, το ένα ερώτημα κάτω από το άλλο.
  • 📐 Κανόνας Στήλης: Κάθε SELECT πρέπει να επιστρέφει τον ίδιο αριθμό στηλών, με την ίδια σειρά, με συμβατούς τύπους δεδομένων.
  • 🧹 ΔΙΑΚΡΙΤΙΚΟ ΕΝΩΣΗΣ: Οι διπλότυπες γραμμές καταργούνται και επιστρέφονται μόνο μοναδικές γραμμές, και αυτή είναι η συμπεριφορά MySQL ισχύει από προεπιλογή.
  • 📚 ΕΝΩΣΗ ΟΛΩΝ: Κάθε γραμμή επιστρέφεται, συμπεριλαμβανομένων των διπλότυπων, κάτι που είναι ταχύτερο επειδή δεν απαιτείται πέρασμα κατάργησης διπλότυπων.
  • 🏷️ Ονόματα στηλών: Το σύνολο αποτελεσμάτων παίρνει τα ονόματα των στηλών του από την πρώτη πρόταση SELECT, επομένως τα ψευδώνυμα ανήκουν σε αυτό το ερώτημα.
  • Τυπική χρήση: Ενοποίηση δύο πινάκων που περιέχουν το ίδιο είδος εγγραφής, χωρίς να επιτρέπονται διπλότυπες γραμμές στην συγχωνευμένη έξοδο.

MySQL ΕΝΩΣΗ OperaTor

Τι είναι μια ΕΝΩΣΗ στο MySQL?

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

Η μόνη απαίτηση για να λειτουργήσει αυτό είναι ο αριθμός των στηλών να είναι ο ίδιος από όλα τα ερωτήματα SELECT που πρέπει να συνδυαστούν.

Ας υποθέσουμε ότι έχουμε δύο πίνακες ως εξής.

MySQL ΕΝΩΣΗMySQL ΕΝΩΣΗ

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

Γιατί να χρησιμοποιήσετε την 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`;

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

  1. Ίσος αριθμός στηλών. Κάθε Δήλωση SELECT πρέπει να επιστρέψει τον ίδιο αριθμό στηλών, διαφορετικά MySQL εμφανίζει το σφάλμα 1222.
  2. Συμβατοί τύποι δεδομένων με την ίδια σειρά. Η πρώτη στήλη του πρώτου ερωτήματος αντιστοιχεί στη στήλη ένα του δεύτερου, επομένως ένας αριθμός θα πρέπει να ταιριάζει με έναν αριθμό και το κείμενο θα πρέπει να ταιριάζει με κείμενο.
  3. Τα ονόματα προέρχονται από το πρώτο ερώτημα. Η επικεφαλίδα του συνόλου αποτελεσμάτων λαμβάνεται από το πρώτο 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

Συχνές Ερωτήσεις

Η συνάρτηση UNION στοιβάζει τις γραμμές ενός ερωτήματος κάτω από ένα άλλο, έτσι ώστε το αποτέλεσμα να μεγαλώνει. A Ενώνω αντιστοιχίζει σχετικές γραμμές και τοποθετεί τις στήλες τους τη μία δίπλα στην άλλη, έτσι ώστε το αποτέλεσμα να μεγαλώνει. Χρησιμοποιήστε την UNION για παρόμοιες γραμμές και την JOIN για σχετικούς πίνακες.

Τοποθετήστε ένα μόνο ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ όρος μετά το τελευταίο SELECT. Ταξινομεί το συνδυασμένο αποτέλεσμα και πρέπει να χρησιμοποιεί τα ονόματα στηλών που παράγονται από το πρώτο SELECT. Ένας όρος LIMIT που τοποθετείται εκεί συμπεριφέρεται με τον ίδιο τρόπο.

Το σφάλμα 1222 εμφανίζεται όταν οι κλάδοι SELECT επιστρέφουν άνισο αριθμό στηλών. Μετρήστε τις στήλες σε κάθε κλάδο και προσθέστε μια λεκτική γραμμή ή ένα σύμβολο κράτησης θέσης NULL στον μικρότερο κλάδο, έτσι ώστε και οι δύο πλευρές να ευθυγραμμίζονται με την ίδια σειρά.

Ναι. Βοηθοί SMS σε SQL, συμπεριλαμβανομένων εκείνων που είναι ενσωματωμένοι στο MySQL Πάγκος εργασίας, δημιουργήστε εντολές UNION από ένα απλό αίτημα. Ελέγξτε μόνοι σας τη σειρά των στηλών, επειδή ένα μοντέλο μπορεί να ευθυγραμμίσει στήλες που απλώς μοιάζουν.

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

Συνοψίστε αυτήν την ανάρτηση με: