Επίσης, πώς ταιριάζουν οι συνδέσεις "LEFT JOIN", "RIGHT JOIN" και "FULL JOIN";
Υποθέτοντας ότι ενώνετε στήλες χωρίς διπλότυπα, που είναι μια πολύ συνηθισμένη περίπτωση:
Μια εσωτερική ένωση των A και B δίνει το αποτέλεσμα A intersect B, δηλαδή το εσωτερικό μέρος μιας τομής διάγραμμα Venn.
Μια εξωτερική ένωση των A και B δίνει τα αποτελέσματα του A union B, δηλαδή τα εξωτερικά μέρη μιας ένωσης διαγράμματος Venn.
Παραδείγματα
Ας υποθέσουμε ότι έχετε δύο πίνακες, με μία στήλη ο καθένας, και δεδομένα ως εξής:
A B
- -
1 3
2 4
3 5
4 6
Σημειώστε ότι τα (1,2) είναι μοναδικά για τον Α, τα (3,4) είναι κοινά και τα (5,6) είναι μοναδικά για τον Β.
Εσωτερική ένωση
Μια εσωτερική ένωση με χρήση ενός από τα ισοδύναμα ερωτήματα δίνει την τομή των δύο πινάκων, δηλαδή τις δύο γραμμές που έχουν κοινές.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
Αριστερή εξωτερική σύνδεση
Μια αριστερή εξωτερική ένωση θα δώσει όλες τις γραμμές στο Α, συν τυχόν κοινές γραμμές στο Β.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
Δεξιά εξωτερική ένωση
Μια δεξιά εξωτερική ένωση θα δώσει όλες τις γραμμές στο Β, συν οποιεσδήποτε κοινές γραμμές στο Α.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
Πλήρης εξωτερική σύνδεση
Μια πλήρης εξωτερική ένωση θα σας δώσει την ένωση των Α και Β, δηλαδή όλες τις γραμμές στο Α και όλες τις γραμμές στο Β. Αν κάτι στο Α δεν έχει αντίστοιχο δεδομένο στο Β, τότε το τμήμα του Β είναι μηδενικό και το αντίστροφο.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
Μια εσωτερική σύνδεση εμφανίζει γραμμές μόνο εάν υπάρχει μια αντίστοιχη εγγραφή στην άλλη (δεξιά) πλευρά της σύνδεσης.
Μια (αριστερή) εξωτερική σύνδεση εμφανίζει γραμμές για κάθε εγγραφή στην αριστερή πλευρά, ακόμη και αν δεν υπάρχουν αντίστοιχες γραμμές στην άλλη (δεξιά) πλευρά της σύνδεσης. Εάν δεν υπάρχει καμία αντίστοιχη γραμμή, οι στήλες για την άλλη (δεξιά) πλευρά θα εμφανίζουν NULLs.
Οι εσωτερικές συνδέσεις απαιτούν την ύπαρξη μιας εγγραφής με σχετικό αναγνωριστικό στον εντασσόμενο πίνακα.
Οι εξωτερικές συνδέσεις θα επιστρέψουν εγγραφές για την αριστερή πλευρά ακόμη και αν δεν υπάρχει τίποτα για τη δεξιά πλευρά.
Για παράδειγμα, έχετε έναν πίνακα Orders και έναν OrderDetails. Σχετίζονται με ένα "OrderID".
Orders
OrderDetails
Η αίτηση
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
θα επιστρέψει μόνο Παραγγελίες που έχουν επίσης κάτι στον πίνακα OrderDetails.
Αν το αλλάξετε σε OUTER LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
τότε θα επιστρέψει εγγραφές από τον πίνακα Orders ακόμα και αν δεν έχουν εγγραφές OrderDetails.
Μπορείτε να το χρησιμοποιήσετε αυτό για να βρείτε Παραγγελίες που δεν έχουν κανένα OrderDetails που υποδεικνύει μια πιθανή ορφανή παραγγελία προσθέτοντας μια ρήτρα where όπως WHERE OrderDetails.OrderID IS NULL
.