Όσον αφορά τις ενώσεις, οι περισσότεροι από εμάς δουλεύουμε κυρίως με το όριο των δύο τραπεζιών και άλλα τέτοια. Ωστόσο, είναι σύνηθες να χρειάζεται να ενώσετε τρεις πίνακες για να αποκτήσετε μια πιο ουσιαστική διάταξη δεδομένων και εικόνα. Πάρτε για παράδειγμα πού θέλετε να ανακτήσετε μια λίστα ταινιών, το αντίστοιχο απόθεμα ενοικίασης και τις πραγματικές λεπτομέρειες ενοικίασης. Κάθε μία από αυτές τις μονάδες, όπως ταινίες, απόθεμα και λεπτομέρειες ενοικίασης βρίσκονται σε μεμονωμένους πίνακες.
Σε αυτό το σεμινάριο, θα σας καθοδηγήσουμε στις διάφορες συνδέσεις και τεχνικές που μπορείτε να χρησιμοποιήσετε για να ενώσετε τρεις πίνακες στην SQL.
Απαιτήσεις:
Για λόγους επίδειξης, θα χρησιμοποιήσουμε την έκδοση 80 της MySQL και το δείγμα βάσης δεδομένων Sakila. Για να ακολουθήσετε, μπορείτε να κάνετε λήψη και να ρυθμίσετε τη βάση δεδομένων Sakila στον διακομιστή MySQL. Μη διστάσετε να χρησιμοποιήσετε οποιοδήποτε άλλο σύνολο δεδομένων που θεωρείτε κατάλληλο.
Τύποι συνδέσεων σε SQL
Πριν φτάσουμε στην εφαρμογή των συνδέσεων, ας ξεκινήσουμε συζητώντας τους διάφορους τύπους συνδέσεων που είναι διαθέσιμοι στις βάσεις δεδομένων SQL.
ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ
Ο πρώτος τύπος ένωσης είναι μια ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ. Αυτός ο τύπος ένωσης επιστρέφει μόνο τις σειρές που περιέχουν μια αντίστοιχη τιμή και στους δύο πίνακες. Είναι ένας πολύ κοινός τύπος ένωσης και είναι ο πιο απλοϊκός όταν ενώνουμε δύο τραπέζια.
Η σύνταξη έχει ως εξής:
ΕΠΙΛΟΓΗ στηλώνΑΠΟ τον πίνακα 1
Πίνακας ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ2 ΕΠΙ table1.column_name = table2.column_name;
ΑΡΙΣΤΕΡΑ ΣΥΜΜΕΤΟΧΗ
Στην περίπτωση ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗΣ, επιστρέφει όλες τις σειρές από τον αριστερό πίνακα και τις αντιστοιχισμένες σειρές από τον δεξιό πίνακα. Εάν δεν υπάρχουν τιμές που να ταιριάζουν από τον δεξιό πίνακα, η ένωση προσθέτει τις τιμές NULL στη θέση τους.
Η σύνταξη έχει ως εξής:
ΕΠΙΛΟΓΗ στηλώνΑΠΟ τον πίνακα 1
ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ πίνακα2 ΕΠΙ table1.column_name = table2.column_name;
ΔΕΞΙΑ ΣΥΝΔΕΣΗ
Όπως μπορείτε να μαντέψετε, το RIGHT JOIN είναι το αντίθετο από το LEFT JOIN. Αυτός ο τύπος συνδέσεων επιστρέφει όλες τις σειρές από τον δεξιό πίνακα και μόνο τις αντίστοιχες σειρές από τον αριστερό πίνακα. Εάν δεν υπάρχουν αντίστοιχες σειρές στον αριστερό πίνακα, η ένωση προσθέτει τις τιμές NULL σε αυτό.
Η παρακάτω είναι η σύνταξη μιας ΔΕΞΙΑΣ ΣΥΝΔΕΣΗΣ:
ΕΠΙΛΟΓΗ στηλώνΑΠΟ τον πίνακα 1
ΔΕΞΙΑ ΕΝΩΣΗ πίνακα2 ΕΠΙ table1.column_name = table2.column_name;
ΠΛΗΡΗΣ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ
Ο επόμενος τύπος σύνδεσης που θα συναντήσετε στις βάσεις δεδομένων SQL είναι μια ΠΛΗΡΗΣ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ. Αυτός ο τύπος ένωσης επιστρέφει όλες τις σειρές όταν υπάρχει αντιστοιχία είτε στον δεξιό είτε στον αριστερό πίνακα. Εάν δεν υπάρχει αντίστοιχη τιμή σε κανένα από τα δύο, επιστρέφει NULL για τις στήλες από τον πίνακα χωρίς την αντιστοίχιση.
Το παρακάτω δείχνει τη σύνταξη μιας ΠΛΗΡΗΣ ΕΞΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ:
ΕΠΙΛΟΓΗ στηλώνΑΠΟ τον πίνακα 1
ΠΛΗΡΗΣ Πίνακας ΕΞΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ2 ΕΠΙ table1.column_name = table2.column_name;
Καλό είναι να έχετε κατά νου ότι δεν υποστηρίζουν όλες οι μηχανές βάσης δεδομένων το FULL OUTER JOINS. Για να το επιτύχετε, ίσως χρειαστεί να εργαστείτε με άλλους τύπους JOINS ή υποερωτήματα.
Παραδείγματα:
Ας διερευνήσουμε μερικά παραδείγματα για το πώς μπορούμε να χρησιμοποιήσουμε αυτούς τους τύπους συνδέσεων για να ενώσουμε τρεις πίνακες στην SQL.
Παράδειγμα 1: Χρήση της ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ
Ξεκινάμε με ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ. Ας υποθέσουμε ότι θέλουμε να ανακτήσουμε μια λίστα ταινιών, το απόθεμα ενοικίασης και τις αντίστοιχες λεπτομέρειες ενοικίασης.
Μπορούμε να χρησιμοποιήσουμε πολλαπλές Εσωτερικές ΣΥΝΔΕΣΕΙΣ στους συσχετιζόμενους πίνακες όπως φαίνεται στο ακόλουθο παράδειγμα:
ΕΠΙΛΕΓΩταινία.τίτλος,
inventory.inventory_id,
rental.rental_date
ΑΠΟ
ταινία
απογραφή ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ ΕΠΙ
film.film_id = inventory.film_id
Ενοικίαση INNER JOIN ΕΠΙ
inventory.inventory_id = rental.inventory_id;
Στο συγκεκριμένο παράδειγμα ερωτήματος, ξεκινάμε ενώνοντας τους πίνακες φιλμ και αποθέματος με βάση τη στήλη 'film_id'. Στη συνέχεια, παίρνουμε το σύνολο που προκύπτει και το ενώνουμε με τον πίνακα ενοικίασης με βάση τη στήλη 'inventory_id'.
Αυτό διασφαλίζει ότι ενώνουμε τρία τραπέζια με ένα βασικό ΕΣΩΤΕΡΙΚΟ ΣΥΝΔΕΣΜΟ. Το σύνολο που προκύπτει έχει ως εξής:
Παράδειγμα 2: Χρήση της ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ και της ΑΡΙΣΤΕΡΗΣ ΣΥΝΔΕΣΗΣ
Ας πούμε ότι τώρα θέλουμε τη λίστα των ταινιών, τη λίστα των αποθεμάτων ενοικίασης (αν υπάρχουν) και τις σχετικές λεπτομέρειες ενοικίασης.
Θέλουμε επίσης να βεβαιωθούμε ότι ακόμα κι αν μια ταινία δεν έχει απόθεμα ενοικίασης, θα το συμπεριλάβουμε στο αποτέλεσμα. Εδώ μπαίνουν στο παιχνίδι η ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ και η ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ.
Εξετάστε το ακόλουθο παράδειγμα:
ΕΠΙΛΕΓΩταινία.τίτλος,
inventory.inventory_id,
rental.rental_date
ΑΠΟ
ταινία
απογραφή ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ ΕΠΙ
film.film_id = inventory.film_id
LEFT JOIN ενοικίαση ΕΠΙ
inventory.inventory_id = rental.inventory_id;
Σε αυτό το παράδειγμα, χρησιμοποιούμε μια ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ για να ενώσουμε τον πίνακα ταινίας και αποθέματος για να διασφαλίσουμε ότι λαμβάνουμε τους τίτλους με το διαθέσιμο απόθεμα. Στη συνέχεια, χρησιμοποιούμε το LEFT JOIN για να συμμετάσχουμε στον πίνακα ενοικίασης για να ανακτήσουμε τα στοιχεία ενοικίασης εάν είναι διαθέσιμα και NULL για οποιονδήποτε τίτλο δεν έχει ιστορικό ενοικίασης.
Το σύνολο που προκύπτει έχει ως εξής:
συμπέρασμα
Σε αυτό το σεμινάριο, μάθαμε για τους διάφορους τύπους JOINS στην SQL, πώς λειτουργούν και πώς μπορούμε να τους χρησιμοποιήσουμε για να συνδυάσουμε τρεις πίνακες.