inner join vs outer join
Inner Join Vs Outer Join: Ετοιμαστείτε να εξερευνήσετε τις ακριβείς διαφορές μεταξύ εσωτερικής και εξωτερικής συμμετοχής
Πριν εξερευνήσετε τις διαφορές μεταξύ του Inner Join Vs Outer Join, ας δούμε πρώτα τι είναι το SQL JOIN;
Ένας όρος ένταξης χρησιμοποιείται για τον συνδυασμό εγγραφών ή για τον χειρισμό των εγγραφών από δύο ή περισσότερους πίνακες μέσω μιας συνθήκης σύνδεσης. Η συνθήκη ένδειξης δείχνει πώς οι στήλες από κάθε πίνακα αντιστοιχίζονται μεταξύ τους.
Η συμμετοχή βασίζεται σε μια σχετική στήλη μεταξύ αυτών των πινάκων. Ένα πιο συνηθισμένο παράδειγμα είναι η ένωση μεταξύ δύο πινάκων μέσω της στήλης πρωτεύοντος κλειδιού και της στήλης ξένου κλειδιού.
Ας υποθέσουμε, έχουμε έναν πίνακα που περιέχει το μισθό των υπαλλήλων και υπάρχει ένας άλλος πίνακας που περιέχει τα στοιχεία των υπαλλήλων.
Σε αυτήν την περίπτωση, θα υπάρχει μια κοινή στήλη όπως το ID του υπαλλήλου που θα ενώνει αυτούς τους δύο πίνακες. Αυτή η στήλη Αναγνώριση υπαλλήλου θα αποτελούσε το πρωτεύον κλειδί των πινάκων λεπτομερειών υπαλλήλου και το ξένο κλειδί στον πίνακα μισθών εργαζομένων.
Είναι πολύ σημαντικό να υπάρχει ένα κοινό κλειδί μεταξύ των δύο οντοτήτων. Μπορείτε να θεωρήσετε έναν πίνακα ως οντότητα και το κλειδί ως έναν κοινό σύνδεσμο μεταξύ των δύο πινάκων που χρησιμοποιείται για τη λειτουργία συμμετοχής.
selenium webdriver συνεντεύξεις ερωτήσεις και απαντήσεις για έμπειρους
Βασικά, υπάρχουν δύο τύποι συμμετοχής στο SQL, δηλ. Εσωτερική Συμμετοχή και Εξωτερική Συμμετοχή . Η εξωτερική σύνδεση υποδιαιρείται περαιτέρω σε τρεις τύπους, δηλαδή Συμμετοχή αριστερού εξωτερικού, Συμμετοχή δεξιού εξωτερικού και πλήρη εγγραφή εξωτερικού.
Σε αυτό το άρθρο, θα δούμε τη διαφορά μεταξύ Εσωτερική Συμμετοχή και Εξωτερική Συμμετοχή λεπτομερώς. Θα κρατήσουμε το Cross Joins και το Unequal Joins εκτός του πεδίου αυτού του άρθρου.
Τι θα μάθετε:
- Τι είναι το Inner Join;
- Τι είναι η Εξωτερική Συμμετοχή;
- Διαφορά μεταξύ εσωτερικής και εξωτερικής σύνδεσης
- Εκτέλεση
- MS Access Εσωτερική και Εξωτερική Συμμετοχή
- Συμμετοχή αριστερά εναντίον Εξωτερική εγγραφή αριστερά
- Αριστερή εξωτερική εγγραφή εναντίον δεξιά εξωτερική εγγραφή
- Διαφορά μεταξύ Εσωτερικής Συμμετοχής και Εξωτερικής Συμμετοχής σε Πίνακα
- Εσωτερική και εξωτερική συμμετοχή εναντίον Union
- συμπέρασμα
- Συνιστώμενη ανάγνωση
Τι είναι το Inner Join;
Ένας εσωτερικός σύνδεσμος επιστρέφει μόνο τις σειρές που έχουν αντίστοιχες τιμές και στους δύο πίνακες (εξετάζουμε εδώ ότι η ένωση γίνεται μεταξύ των δύο πινάκων).
Τι είναι η Εξωτερική Συμμετοχή;
Το Outer Join περιλαμβάνει τις σειρές που ταιριάζουν καθώς και μερικές από τις σειρές που δεν ταιριάζουν μεταξύ των δύο πινάκων. Ο εξωτερικός σύνδεσμος διαφέρει ουσιαστικά από τον εσωτερικό σύνδεσμο στον τρόπο με τον οποίο χειρίζεται την κατάσταση ψευδούς αντιστοίχισης.
Υπάρχουν 3 τύποι Εξωτερικής Συμμετοχής:
- Αριστερά εξωτερική εγγραφή : Επιστρέφει όλες τις σειρές από τον ΑΡΙΣΤΕΡΟ πίνακα και τις αντίστοιχες εγγραφές μεταξύ των δύο πινάκων.
- Δεξιά εξωτερική συμμετοχή : Επιστρέφει όλες τις σειρές από τον πίνακα ΔΕΞΙΩΝ και τις αντίστοιχες εγγραφές μεταξύ των δύο πινάκων.
- Πλήρης εξωτερική συμμετοχή : Συνδυάζει το αποτέλεσμα του αριστερού εξωτερικού συνδέσμου και του δεξιού εξωτερικού συνδέσμου.
Διαφορά μεταξύ εσωτερικής και εξωτερικής σύνδεσης
[εικόνα πηγή ]
Όπως φαίνεται στο παραπάνω διάγραμμα, υπάρχουν δύο οντότητες, δηλαδή ο πίνακας 1 και ο πίνακας 2 και και οι δύο πίνακες μοιράζονται ορισμένα κοινά δεδομένα.
Ένας εσωτερικός σύνδεσμος θα επιστρέψει την κοινή περιοχή μεταξύ αυτών των πινάκων (η πράσινη σκιασμένη περιοχή στο παραπάνω διάγραμμα), δηλαδή όλες οι εγγραφές που είναι κοινές μεταξύ του πίνακα 1 και του πίνακα 2.
Μια αριστερή εξωτερική εγγραφή θα επιστρέψει όλες τις σειρές από τον πίνακα 1 και μόνο αυτές τις σειρές από τον πίνακα 2 που είναι κοινές και στον πίνακα 1. Το Right Outer Join θα κάνει ακριβώς το αντίθετο. Θα δώσει όλες τις εγγραφές από τον πίνακα 2 και μόνο τις αντίστοιχες εγγραφές που ταιριάζουν από τον πίνακα 1.
Επιπλέον, μια Πλήρης Εξωτερική Συμμετοχή θα μας δώσει όλες τις εγγραφές από τον πίνακα 1 και τον πίνακα 2.
Ας ξεκινήσουμε με ένα παράδειγμα για να το καταστήσουμε σαφέστερο.
Ας υποθέσουμε ότι έχουμε δύο τραπέζια: EmpDetails και EmpSalary .
Πίνακας EmpDetails:
Ταυτότητα Υπαλλήλου | Ονομα υπαλλήλου |
7 | Κρίνος |
1 | Γιάννης |
δύο | Σαμάνθα |
3 | Κανένας |
4 | Μεταξένιος |
5 | Εμβολο |
6 | Άρπιτ |
8 | Σίτα |
9 | Φαρά |
10 | Καθίκι |
Πίνακας EmpSalary:
Ταυτότητα Υπαλλήλου | Ονομα υπαλλήλου | Μισθός |
---|---|---|
έντεκα | Τριαντάφυλλο | 90000 |
1 | Γιάννης | 50.000 |
δύο | Σαμάνθα | 120000 |
3 | Κανένας | 75000 |
4 | Μεταξένιος | 25000 |
5 | Εμβολο | 150000 |
6 | Άρπιτ | 80000 |
12 | Σάκσι | 45000 |
13 | Γρύλος | 250.000 |
Ας κάνουμε μια Εσωτερική Συμμετοχή σε αυτά τα δύο τραπέζια και να παρατηρήσουμε το αποτέλεσμα:
Ερώτηση:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails INNER JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Αποτέλεσμα:
Ταυτότητα Υπαλλήλου | Ονομα υπαλλήλου | Μισθός |
---|---|---|
7 | Κρίνος | ΜΗΔΕΝΙΚΟ |
1 | Γιάννης | 50.000 |
δύο | Σαμάνθα | 120000 |
3 | Κανένας | 75000 |
4 | Μεταξένιος | 25000 |
5 | Εμβολο | 150000 |
6 | Άρπιτ | 80000 |
Στο παραπάνω σύνολο αποτελεσμάτων, μπορείτε να δείτε ότι το Inner Join επέστρεψε τις πρώτες 6 εγγραφές που υπήρχαν τόσο στο EmpDetails όσο και στο EmpSalary έχοντας ένα αντίστοιχο κλειδί, δηλαδή EmployeeID. Επομένως, εάν τα Α και Β είναι δύο οντότητες, το Inner Join θα επιστρέψει το σύνολο αποτελεσμάτων που θα είναι ίσο με το «Records in A and B», με βάση το αντίστοιχο κλειδί.
Ας δούμε τώρα τι θα κάνει μια Αριστερή Εξωτερική Συμμετοχή.
Ερώτηση:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails LEFT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Αποτέλεσμα:
Ταυτότητα Υπαλλήλου | Ονομα υπαλλήλου | Μισθός |
---|---|---|
1 | Γιάννης | 50.000 |
δύο | Σαμάνθα | 120000 |
3 | Κανένας | 75000 |
4 | Μεταξένιος | 25000 |
5 | Εμβολο | 150000 |
6 | Άρπιτ | 80000 |
8 | Σίτα | ΜΗΔΕΝΙΚΟ |
9 | Φαρά | ΜΗΔΕΝΙΚΟ |
10 | Καθίκι | ΜΗΔΕΝΙΚΟ |
Στο παραπάνω σύνολο αποτελεσμάτων, μπορείτε να δείτε ότι ο αριστερός εξωτερικός σύνδεσμος επέστρεψε και τις 10 εγγραφές από τον ΑΡΙΣΤΕΡΟ πίνακα, δηλαδή τον πίνακα EmpDetails και καθώς τα πρώτα 6 αρχεία ταιριάζουν, επέστρεψε το μισθό του υπαλλήλου για αυτές τις αντίστοιχες εγγραφές.
Καθώς οι υπόλοιπες εγγραφές δεν έχουν αντίστοιχο κλειδί στον πίνακα ΔΕΞΙΑ, δηλαδή στον πίνακα EmpSalary, επέστρεψε NULL που αντιστοιχεί σε αυτές. Επειδή, η Λίλι, η Σίτα, η Φαρά και ο Τζέρι δεν έχουν αντίστοιχο αναγνωριστικό υπαλλήλου στον πίνακα EmpSalary, ο μισθός τους εμφανίζεται ως NULL στο σύνολο αποτελεσμάτων.
Επομένως, εάν τα Α και Β είναι δύο οντότητες, τότε ο αριστερός εξωτερικός σύνδεσμος θα επιστρέψει το σύνολο αποτελεσμάτων που θα είναι ίσο με «Εγγραφές σε ΑΝ Β», με βάση το αντίστοιχο πλήκτρο.
Τώρα ας παρατηρήσουμε τι κάνει το Right Outer Join.
Ερώτηση:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails RIGHT join EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Αποτέλεσμα:
Ταυτότητα Υπαλλήλου | Ονομα υπαλλήλου | Μισθός |
---|---|---|
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | 90000 |
1 | Γιάννης | 50.000 |
δύο | Σαμάνθα | 120000 |
3 | Κανένας | 75000 |
4 | Μεταξένιος | 25000 |
5 | Εμβολο | 150000 |
6 | Άρπιτ | 80000 |
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | 250.000 |
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | 250.000 |
Στο παραπάνω σύνολο αποτελεσμάτων, μπορείτε να δείτε ότι το Right Outer Join έκανε ακριβώς το αντίθετο του αριστερού join. Έχει επιστρέψει όλους τους μισθούς από τον σωστό πίνακα, δηλαδή τον πίνακα EmpSalary.
Όμως, καθώς οι Rose, Sakshi και Jack δεν έχουν αντίστοιχο αναγνωριστικό υπαλλήλου στον αριστερό πίνακα, δηλαδή τον πίνακα EmpDetails, έχουμε τον αριθμό υπαλλήλου και το όνομα υπαλλήλου ως NULL από τον αριστερό πίνακα.
Έτσι, εάν τα Α και Β είναι δύο οντότητες, τότε ο σωστός εξωτερικός σύνδεσμος θα επιστρέψει το σύνολο αποτελεσμάτων που θα είναι ίσο με το «Εγγραφές στο B ΔΕΝ Α», με βάση το πλήκτρο αντιστοίχισης.
Ας δούμε επίσης ποιο θα είναι το σύνολο των αποτελεσμάτων εάν κάνουμε μια επιλογή λειτουργίας σε όλες τις στήλες και στους δύο πίνακες.
Ερώτηση:
SELECT * FROM EmpDetails RIGHT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Αποτέλεσμα:
Ταυτότητα Υπαλλήλου | Ονομα υπαλλήλου | Ταυτότητα Υπαλλήλου | Ονομα υπαλλήλου | Μισθός |
---|---|---|---|---|
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | έντεκα | Τριαντάφυλλο | 90000 |
1 | Γιάννης | 1 | Γιάννης | 50.000 |
δύο | Σαμάνθα | δύο | Σαμάνθα | 120000 |
3 | Κανένας | 3 | Κανένας | 75000 |
4 | Μεταξένιος | 4 | Μεταξένιος | 25000 |
5 | Εμβολο | 5 | Εμβολο | 150000 |
6 | Άρπιτ | 6 | Άρπιτ | 80000 |
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | 12 | Σάκσι | 250.000 |
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | 13 | Γρύλος | 250.000 |
Τώρα, ας προχωρήσουμε στην Πλήρης Συμμετοχή.
Ένας πλήρης εξωτερικός σύνδεσμος γίνεται όταν θέλουμε όλα τα δεδομένα και από τους δύο πίνακες, ανεξάρτητα από το αν υπάρχει αντιστοιχία ή όχι. Ως εκ τούτου, εάν θέλω όλους τους υπαλλήλους, ακόμη και αν δεν βρω ένα αντίστοιχο κλειδί, θα εκτελέσω ένα ερώτημα όπως φαίνεται παρακάτω.
Ερώτηση:
SELECT * FROM EmpDetails FULL JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Αποτέλεσμα:
Ταυτότητα Υπαλλήλου | Ονομα υπαλλήλου | Ταυτότητα Υπαλλήλου | Ονομα υπαλλήλου | Μισθός |
---|---|---|---|---|
7 | Κρίνος | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ |
1 | Γιάννης | 1 | Γιάννης | 50.000 |
δύο | Σαμάνθα | δύο | Σαμάνθα | 120000 |
3 | Κανένας | 3 | Κανένας | 75000 |
4 | Μεταξένιος | 4 | Μεταξένιος | 25000 |
5 | Εμβολο | 5 | Εμβολο | 150000 |
6 | Άρπιτ | 6 | Άρπιτ | 80000 |
8 | Σίτα | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ |
9 | Φαρά | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ |
10 | Καθίκι | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ |
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | έντεκα | Τριαντάφυλλο | 90000 |
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | 12 | Σάκσι | 250.000 |
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | 13 | Γρύλος | 250.000 |
Μπορείτε να δείτε στο παραπάνω σύνολο αποτελεσμάτων ότι καθώς οι πρώτοι έξι δίσκοι ταιριάζουν και στους δύο πίνακες, έχουμε όλα τα δεδομένα χωρίς κανένα NULL. Οι επόμενες τέσσερις εγγραφές υπάρχουν στον αριστερό πίνακα αλλά όχι στον σωστό πίνακα, επομένως τα αντίστοιχα δεδομένα στον δεξιό πίνακα είναι NULL.
Οι τρεις τελευταίες εγγραφές υπάρχουν στον δεξιό πίνακα και όχι στον αριστερό πίνακα, επομένως έχουμε NULL στα αντίστοιχα δεδομένα από τον αριστερό πίνακα. Έτσι, εάν τα Α και Β είναι δύο οντότητες, η πλήρης εξωτερική ένωση θα επιστρέψει το σύνολο αποτελεσμάτων που θα είναι ίσο με «Εγγραφές σε Α ΚΑΙ Β», ανεξάρτητα από το αντίστοιχο κλειδί.
Θεωρητικά, είναι ένας συνδυασμός Left Join και Right Join.
Εκτέλεση
Ας συγκρίνουμε μια Εσωτερική Συμμετοχή με μια Αριστερή Εξωτερική Συμμετοχή στον διακομιστή SQL. Μιλώντας για την ταχύτητα λειτουργίας, ένα αριστερό εξωτερικό JOIN δεν είναι προφανώς πιο γρήγορο από έναν εσωτερικό σύνδεσμο.
Σύμφωνα με τον ορισμό, μια εξωτερική ένωση, είτε αριστερά είτε δεξιά, πρέπει να εκτελεί όλη την εργασία ενός εσωτερικού συνδέσμου μαζί με την επιπλέον εργασία μηδενική - επεκτείνοντας τα αποτελέσματα. Ένας εξωτερικός σύνδεσμος αναμένεται να επιστρέψει μεγαλύτερο αριθμό εγγραφών που αυξάνει περαιτέρω τον συνολικό χρόνο εκτέλεσης μόνο λόγω του μεγαλύτερου συνόλου αποτελεσμάτων.
Έτσι, ένας εξωτερικός σύνδεσμος είναι πιο αργός από έναν εσωτερικό σύνδεσμο.
Επιπλέον, μπορεί να υπάρχουν κάποιες συγκεκριμένες καταστάσεις όπου η αριστερή ένωση θα είναι ταχύτερη από μια Εσωτερική ένωση, αλλά δεν μπορούμε να συνεχίσουμε να τις αντικαθιστούμε ο ένας με τον άλλον καθώς η αριστερή εξωτερική ένωση δεν είναι λειτουργικά ισοδύναμη με μια εσωτερική ένωση.
Ας συζητήσουμε μια περίπτωση όπου η Αριστερή Συμμετοχή μπορεί να είναι ταχύτερη από την Εσωτερική Συμμετοχή. Εάν οι πίνακες που εμπλέκονται στη λειτουργία συμμετοχής είναι πολύ μικροί, ας πούμε ότι έχουν λιγότερες από 10 εγγραφές και οι πίνακες δεν διαθέτουν επαρκή ευρετήρια για να καλύψουν το ερώτημα, σε αυτήν την περίπτωση, το Left Join είναι γενικά πιο γρήγορο από το Inner Join.
Ας δημιουργήσουμε τους δύο παρακάτω πίνακες και ας κάνουμε μια ΕΝΔΕΙΚΤΙΚΗ ΣΥΝΔΕΣΗ και μια ΑΡΙΣΤΕΡΑ ΕΞΩ ΑΓΩΝΑ μεταξύ τους ως Παράδειγμα:
CREATE TABLE #Table1 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table1 (ID, Name) VALUES (1, 'A') INSERT #Table1 (ID, Name) VALUES (2, 'B') INSERT #Table1 (ID, Name) VALUES (3, 'C') INSERT #Table1 (ID, Name) VALUES (4, 'D') INSERT #Table1 (ID, Name) VALUES (5, 'E') CREATE TABLE #Table2 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table2 (ID, Name) VALUES (1, 'A') INSERT #Table2 (ID, Name) VALUES (2, 'B') INSERT #Table2 (ID, Name) VALUES (3, 'C') INSERT #Table2 (ID, Name) VALUES (4, 'D') INSERT #Table2 (ID, Name) VALUES (5, 'E') SELECT * FROM #Table1 t1 INNER JOIN #Table2 t2 ON t2.Name = t1.Name
ταυτότητα | Ονομα | ταυτότητα | Ονομα | |
---|---|---|---|---|
Παρακάτω είναι η απεικόνιση ενός εσωτερικού συνδέσμου: | Παρακάτω είναι η απεικόνιση ενός εξωτερικού συνδέσμου | |||
1 | 1 | ΠΡΟΣ ΤΗΝ | 1 | ΠΡΟΣ ΤΗΝ |
δύο | δύο | σι | δύο | σι |
3 | 3 | ντο | 3 | ντο |
4 | 4 | ρε | 4 | ρε |
5 | 5 | ΕΙΝΑΙ | 5 | ΕΙΝΑΙ |
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
ταυτότητα | Ονομα | ταυτότητα | Ονομα | |
---|---|---|---|---|
1 | 1 | ΠΡΟΣ ΤΗΝ | 1 | ΠΡΟΣ ΤΗΝ |
δύο | δύο | σι | δύο | σι |
3 | 3 | ντο | 3 | ντο |
4 | 4 | ρε | 4 | ρε |
5 | 5 | ΕΙΝΑΙ | 5 | ΕΙΝΑΙ |
Όπως μπορείτε να δείτε παραπάνω, και τα δύο ερωτήματα επέστρεψαν το ίδιο σύνολο αποτελεσμάτων. Σε αυτήν την περίπτωση, εάν δείτε το σχέδιο εκτέλεσης και των δύο ερωτημάτων, τότε θα διαπιστώσετε ότι η εσωτερική ένωση κοστίζει περισσότερο από την εξωτερική ένωση. Αυτό συμβαίνει επειδή, για μια εσωτερική ένωση, ο διακομιστής SQL κάνει αντιστοίχιση κατακερματισμού ενώ κάνει ένθετους βρόχους για την αριστερή ένωση.
Ένας συνδυασμός κατακερματισμού είναι συνήθως ταχύτερος από τους ένθετους βρόχους. Όμως, σε αυτήν την περίπτωση, καθώς ο αριθμός των σειρών είναι τόσο μικρός και δεν υπάρχει ευρετήριο για χρήση (όπως κάνουμε join στη στήλη ονόματος), η λειτουργία κατακερματισμού έχει αποδειχθεί ένα πιο ακριβό ερώτημα εσωτερικής σύνδεσης.
Ωστόσο, εάν αλλάξετε το αντίστοιχο κλειδί στο ερώτημα σύνδεσης από Όνομα σε Αναγνωριστικό και εάν υπάρχει μεγάλος αριθμός σειρών στον πίνακα, τότε θα διαπιστώσετε ότι η εσωτερική ένωση θα είναι ταχύτερη από την αριστερή εξωτερική ένωση.
MS Access Εσωτερική και Εξωτερική Συμμετοχή
Όταν χρησιμοποιείτε πολλές πηγές δεδομένων στο ερώτημα MS Access, τότε εφαρμόζετε ΣΥΝΔΕΣΕΙΣ για τον έλεγχο των εγγραφών που θέλετε να δείτε, ανάλογα με τον τρόπο με τον οποίο οι πηγές δεδομένων συνδέονται μεταξύ τους.
Σε μια εσωτερική ένωση, μόνο οι σχετικοί και από τους δύο πίνακες συνδυάζονται σε ένα μόνο σύνολο αποτελεσμάτων. Αυτή είναι μια προεπιλεγμένη σύνδεση στην Access και η πιο συχνά χρησιμοποιούμενη. Εάν εφαρμόσετε μια ένωση αλλά δεν προσδιορίσετε ρητά τι είδους ένωση είναι, τότε η Access υποθέτει ότι είναι μια εσωτερική ένωση.
Στις εξωτερικές συνδέσεις, όλα τα σχετικά δεδομένα και από τους δύο πίνακες συνδυάζονται σωστά, καθώς και όλες οι υπόλοιπες σειρές από έναν πίνακα. Σε όλες τις εξωτερικές συνδέσεις, όλα τα δεδομένα συνδυάζονται όπου είναι δυνατόν.
Συμμετοχή αριστερά εναντίον Εξωτερική εγγραφή
Στον διακομιστή SQL, η λέξη-κλειδί εξωτερικό είναι προαιρετική όταν εφαρμόζετε το αριστερό εξωτερικό μέλος. Επομένως, δεν έχει καμία διαφορά εάν γράφετε είτε «ΑΡΙΣΤΕΡΑ ΕΞΩ ΑΡΙΣΤΕΡΑ» ή «ΑΡΙΣΤΕΡΑ ΣΥΜΜΕΤΟΧΗ», καθώς και οι δύο θα σας δώσουν το ίδιο αποτέλεσμα.
A LEFT JOIN B είναι ισοδύναμη σύνταξη με A LEFT OUTER JOIN B.
Παρακάτω είναι η λίστα ισοδύναμων συντακτικών στον διακομιστή SQL:
[εικόνα πηγή ]
Αριστερή εξωτερική εγγραφή εναντίον δεξιά εξωτερική εγγραφή
Έχουμε ήδη δει αυτήν τη διαφορά σε αυτό το άρθρο. Μπορείτε να ανατρέξετε στα ερωτήματα Left Outer Join και Right Outer Join και το σύνολο αποτελεσμάτων για να δείτε τη διαφορά.
Η κύρια διαφορά μεταξύ του Left Join και του Right Join έγκειται στη συμπερίληψη μη ταιριασμένων σειρών. Ο αριστερός εξωτερικός σύνδεσμος περιλαμβάνει τις μη αντιστοιχισμένες σειρές από τον πίνακα που βρίσκεται στα αριστερά του όρου σύνδεσης ενώ ένας δεξί εξωτερικός σύνδεσμος περιλαμβάνει τις μη αντιστοιχισμένες σειρές από τον πίνακα που βρίσκεται στα δεξιά της ρήτρας σύνδεσης.
Οι χρήστες ρωτούν ποια είναι η καλύτερη χρήση, δηλαδή αριστερή ένωση ή δεξιά σύνδεση; Βασικά, είναι ο ίδιος τύπος λειτουργιών εκτός από την αντιστροφή των επιχειρημάτων τους. Ως εκ τούτου, όταν ρωτάτε ποια ένωση θα χρησιμοποιήσετε, πραγματικά ρωτάτε αν θα γράψετε ένα ένα. Είναι απλώς θέμα προτίμησης.
Γενικά, οι άνθρωποι προτιμούν να χρησιμοποιούν το Left join στο ερώτημά τους SQL. Θα πρότεινα να παραμείνετε συνεπείς με τον τρόπο που γράφετε το ερώτημα, προκειμένου να αποφύγετε τυχόν σύγχυση στην ερμηνεία του ερωτήματος.
Έχουμε δει όλα για το Inner join και κάθε είδους Outer συμμετέχει μέχρι τώρα. Ας συνοψίσουμε γρήγορα τη διαφορά μεταξύ Εσωτερικής Συμμετοχής και Εξωτερικής Συμμετοχής.
Διαφορά μεταξύ Εσωτερικής Συμμετοχής και Εξωτερικής Συμμετοχής σε Πίνακα
Εσωτερική σύνδεση | Εξωτερική συμμετοχή |
---|---|
Επιστρέφει μόνο τις σειρές που έχουν αντίστοιχες τιμές και στους δύο πίνακες. | Περιλαμβάνει τις σειρές που ταιριάζουν καθώς και μερικές από τις σειρές που δεν ταιριάζουν μεταξύ των δύο πινάκων. |
Σε περίπτωση που υπάρχει μεγάλος αριθμός σειρών στους πίνακες και υπάρχει ευρετήριο για χρήση, το INNER JOIN είναι γενικά πιο γρήγορο από το OUTER JOIN. | Γενικά, μια ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ είναι πιο αργή από μια ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ καθώς χρειάζεται να επιστρέφει περισσότερο αριθμό εγγραφών σε σύγκριση με την ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ. Ωστόσο, μπορεί να υπάρχουν ορισμένα συγκεκριμένα σενάρια όπου το OUTER JOIN είναι ταχύτερο. |
Όταν δεν βρεθεί κάποιος αγώνας, δεν επιστρέφει τίποτα. | Όταν δεν βρεθεί κάποιος αγώνας, ένα NULL τοποθετείται στην τιμή της στήλης που επιστρέφεται. |
Χρησιμοποιήστε το INNER JOIN όταν θέλετε να αναζητήσετε λεπτομερείς πληροφορίες για οποιαδήποτε συγκεκριμένη στήλη. | Χρησιμοποιήστε το OUTER JOIN όταν θέλετε να εμφανίσετε τη λίστα όλων των πληροφοριών στους δύο πίνακες. |
Το INNER JOIN ενεργεί σαν φίλτρο. Πρέπει να υπάρχει αντιστοίχιση και στους δύο πίνακες για μια εσωτερική ένωση για την επιστροφή δεδομένων. | Λειτουργούν σαν πρόσθετα δεδομένων. |
Υπάρχει σιωπηρή ένωση σύνδεσης για εσωτερική ένωση, η οποία περιλαμβάνει πίνακες που θα ενώνονται με κόμμα διαχωρισμένο με τον όρο FROM. Παράδειγμα: SELECT * FROM product, κατηγορία WHERE product.CategoryID = category.CategoryID; | Δεν υπάρχει σιωπηρή ένωση σύνδεσης για εξωτερική ένωση. |
Εσωτερική και εξωτερική συμμετοχή εναντίον Union
Μερικές φορές, συγχέουμε το Join and Union και αυτό είναι επίσης μία από τις πιο συχνές ερωτήσεις στο Συνεντεύξεις SQL . Έχουμε ήδη δει τη διαφορά μεταξύ εσωτερικού και εξωτερικού συνδέσμου. Τώρα, ας δούμε πώς ένα JOIN είναι διαφορετικό από την ΕΝΩΣΗ.
Η UNION τοποθετεί μια σειρά ερωτήσεων το ένα μετά το άλλο, ενώ το join δημιουργεί ένα καρτεσιανό προϊόν και το υποκαθιστά. Έτσι, το UNION και το JOIN είναι εντελώς διαφορετικές λειτουργίες.
Ας εκτελέσουμε τα παρακάτω δύο ερωτήματα στη MySQL και να δούμε το αποτέλεσμα τους.
Ερώτημα UNION:
SELECT 28 AS bah UNION SELECT 35 AS bah;
Αποτέλεσμα:
Μπαχ | |
---|---|
1 | 28 |
δύο | 35 |
ΕΓΓΡΑΦΕΙΤΕ Ερώτημα:
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
Αποτέλεσμα:
Φοο | Μπαρ | |
---|---|---|
1 | 38 | 35 |
Μια λειτουργία της UNION τοποθετεί το αποτέλεσμα δύο ή περισσότερων ερωτημάτων σε ένα σύνολο αποτελεσμάτων. Αυτό το σύνολο αποτελεσμάτων περιέχει όλες τις εγγραφές που επιστρέφονται μέσω όλων των ερωτημάτων που εμπλέκονται στο UNION. Έτσι, βασικά, μια ένωση συνδυάζει τα δύο σύνολα αποτελεσμάτων μαζί.
Μια λειτουργία σύνδεσης παίρνει δεδομένα από δύο ή περισσότερους πίνακες με βάση τις λογικές σχέσεις μεταξύ αυτών των πινάκων, δηλαδή με βάση την κατάσταση σύνδεσης. Στο ερώτημα συμμετοχής, τα δεδομένα από έναν πίνακα χρησιμοποιούνται για την επιλογή εγγραφών από έναν άλλο πίνακα. Σας επιτρέπει να συνδέσετε παρόμοια δεδομένα που υπάρχουν σε διαφορετικούς πίνακες.
Για να το καταλάβετε πολύ απλά, μπορείτε να πείτε ότι ένα UNION συνδυάζει σειρές από δύο πίνακες ενώ ένας συνδυασμός συνδυάζει στήλες από δύο ή περισσότερους πίνακες. Έτσι, και οι δύο χρησιμοποιούνται για να συνδυάσουν τα δεδομένα από πίνακες n, αλλά η διαφορά έγκειται στο πώς συνδυάζονται τα δεδομένα.
γ # ερωτήσεις και απαντήσεις συνέντευξης για έμπειρους με παραδείγματα
Ακολουθούν οι εικονογραφικές παραστάσεις των UNION και JOIN.
Τα παραπάνω είναι μια εικονική αναπαράσταση μιας Λειτουργίας Συμμετοχής που απεικονίζει ότι κάθε εγγραφή στο σύνολο αποτελεσμάτων περιέχει στήλες και από τους δύο πίνακες, δηλαδή τον Πίνακα Α και τον Πίνακα Β. Αυτό το αποτέλεσμα επιστρέφεται με βάση την συνθήκη σύνδεσης που εφαρμόζεται στο ερώτημα.
Η ένωση είναι γενικά το αποτέλεσμα της αποδιαμόρφωσης (αντίθετο της κανονικοποίησης) και χρησιμοποιεί το ξένο κλειδί ενός πίνακα για να αναζητήσει τις τιμές της στήλης χρησιμοποιώντας το πρωτεύον κλειδί σε έναν άλλο πίνακα.
Τα παραπάνω είναι μια εικονική αναπαράσταση μιας ΛΕΙΤΟΥΡΓΙΑΣ ΕΝΩΣΗΣ που απεικονίζει ότι κάθε εγγραφή στο σύνολο αποτελεσμάτων είναι μια σειρά από έναν από τους δύο πίνακες. Έτσι, το αποτέλεσμα της ΕΝΩΣΗΣ έχει συνδυάσει τις σειρές από τον Πίνακα Α και τον Πίνακα Β.
Περαιτέρω ανάγνωση = >> Το MySQL UNION εξήγησε με παραδείγματα
συμπέρασμα
Σε αυτό το άρθρο, έχουμε δει τις μεγάλες διαφορές μεταξύ του Εσωτερική συμμετοχή και εξωτερική σύνδεση στο SQL . Είδαμε επίσης την ταξινόμηση της Εξωτερικής Συμμετοχής, δηλαδή Αριστερή ένωση, Δεξιά ένωση και Πλήρης ένταξη. Έχουμε δει πώς λειτουργούν καθεμία από αυτές τις ενώσεις και πώς διαφέρουν μεταξύ τους.
Κάναμε επίσης κάποια σύγκριση απόδοσης μεταξύ αυτών των τύπων σύνδεσης. Συζητήσαμε επίσης πώς η ένωση είναι διαφορετική από μια ένωση.
Διαβάστε επίσης = >> Τύποι συμμετοχής MySQL
Ελπίζω ότι αυτό το άρθρο θα σας βοήθησε να ξεκαθαρίσετε τις αμφιβολίες σας σχετικά με τις διαφορές μεταξύ των διαφόρων τύπων συμμετοχής. Είμαστε σίγουροι ότι αυτό θα σας κάνει να αποφασίσετε από ποιον τύπο συμμετοχής θα διαλέξετε με βάση το επιθυμητό σύνολο αποτελεσμάτων.
Συνιστώμενη ανάγνωση
- Ακριβής διαφορά μεταξύ επαλήθευσης και επικύρωσης με παραδείγματα
- Modem Vs Router: Μάθετε την ακριβή διαφορά
- Διαφορά μεταξύ SQL Vs MySQL Vs SQL Server (με παραδείγματα)
- Εκμάθηση Python DateTime με παραδείγματα
- LAN Vs WAN Vs MAN: Ακριβής διαφορά μεταξύ τύπων δικτύου
- Αποκοπή εντολής στο Unix με παραδείγματα
- Unix Cat Command Syntax, Επιλογές με παραδείγματα
- Χρήση του δρομέα στο MongoDB με παραδείγματα