MySQL Σύνδεση: Εσωτερική, Εξωτερική, Αριστερή, Δεξιά, Σταυρωτή
⚡ Έξυπνη Σύνοψη
MySQL Οι ΣΥΝΔΕΣΕΙΣ συνδυάζουν γραμμές από δύο ή περισσότερους σχετικούς πίνακες σε ένα ενιαίο σύνολο αποτελεσμάτων. Αυτός ο πόρος εξηγεί τις ΣΥΝΔΕΣΕΙΣ CROSS, INNER, LEFT, RIGHT και OUTER με εκτελέσιμα ερωτήματα, δείγματα δεδομένων και σαφείς πίνακες εξόδου για πρακτική εργασία σε βάσεις δεδομένων.

Τι είναι τα JOINS;
Οι συνδέσεις βοηθούν στην ανάκτηση δεδομένων από δύο ή περισσότερους πίνακες βάσεων δεδομένων.
Οι πίνακες συνδέονται μεταξύ τους χρησιμοποιώντας πρωτεύοντα και ξένα κλειδιά.
Σημείωση: Το JOIN είναι το πιο παρεξηγημένο θέμα μεταξύ των μαθητών SQL. Για λόγους απλότητας και ευκολίας κατανόησης, θα χρησιμοποιήσουμε μια νέα βάση δεδομένων για να εξασκηθούμε σε ένα δείγμα. Όπως φαίνεται παρακάτω.
Κάθε παράδειγμα παρακάτω χρησιμοποιεί αυτούς τους δύο πίνακες. movie_id στήλη μέσα μέλη δείχνει στο id στήλη μέσα κινηματογράφος — η σχέση στην οποία αντιστοιχεί κάθε JOIN.
μέλη
| id | όνομα | επίθετο | movie_id |
|---|---|---|---|
| 1 | Αδάμ | Σιδεράς | 1 |
| 2 | Ravi | Kumar | 2 |
| 3 | Susan | Davidson | 5 |
| 4 | Κλωστική μηχανή | Adrianna | 8 |
| 5 | Υπήνεμος | Πονγκ | 10 |
κινηματογράφος
| id | τίτλος | κατηγορία |
|---|---|---|
| 1 | ASSASSIN'S CREED: EMBERS | κινούμενα σχέδια |
| 2 | Real Steel (2012) | κινούμενα σχέδια |
| 3 | Alvin και το Chipmunks | κινούμενα σχέδια |
| 4 | Οι περιπέτειες του Tin Tin | κινούμενα σχέδια |
| 5 | Ασφαλές (2012) | Ενέργειες |
| 6 | Safe House (2012) | Ενέργειες |
| 7 | GIA | 18 + |
| 8 | Προθεσμία 2009 | 18 + |
| 9 | Η βρώμικη εικόνα | 18 + |
| 10 | Ο Μάρλεϊ και εγώ | Ρομαντισμός |
Γιατί πρέπει να χρησιμοποιούμε JOINS;
Πριν εξετάσουμε κάθε τύπο JOIN, αξίζει να γνωρίζουμε γιατί προτιμάται ένας JOIN έναντι της εκτέλεσης πολλών ερωτημάτων.
Τώρα μπορείτε να σκεφτείτε γιατί χρησιμοποιούμε JOIN όταν μπορούμε να κάνουμε την ίδια εργασία εκτελώντας ερωτήματα. Ειδικά αν έχετε κάποια εμπειρία στον προγραμματισμό βάσεων δεδομένων, ξέρετε ότι μπορούμε να εκτελέσουμε ερωτήματα ένα προς ένα, χρησιμοποιήστε την έξοδο του καθενός σε διαδοχικά ερωτήματα. Φυσικά, αυτό είναι δυνατό. Αλλά χρησιμοποιώντας τα JOIN, μπορείτε να ολοκληρώσετε τη δουλειά χρησιμοποιώντας μόνο ένα ερώτημα με οποιεσδήποτε παραμέτρους αναζήτησης. Αφ 'ετέρου MySQL μπορεί να επιτύχει καλύτερη απόδοση με JOIN καθώς μπορεί να χρησιμοποιήσει την ευρετηρίαση. Η απλή χρήση ενός ερωτήματος JOIN αντί της εκτέλεσης πολλαπλών ερωτημάτων μειώνει την επιβάρυνση του διακομιστή. Αντίθετα, η χρήση πολλαπλών ερωτημάτων οδηγεί σε περισσότερες μεταφορές δεδομένων μεταξύ MySQL και εφαρμογές (λογισμικό). Επιπλέον, απαιτεί περισσότερους χειρισμούς δεδομένων στο τέλος της εφαρμογής επίσης.
Είναι σαφές ότι μπορούμε να πετύχουμε καλύτερα MySQL και επιδόσεις εφαρμογών με χρήση JOIN.
Τύποι ΣΥΝΔΕΣΕΩΝ
MySQL Υποστηρίζει διάφορους τύπους JOIN, καθένας από τους οποίους απαντά σε διαφορετική ερώτηση σχετικά με τους ίδιους δύο πίνακες. Ο παρακάτω πίνακας τους συγκρίνει. Κάθε τύπος παρουσιάζεται στη συνέχεια με ένα ερώτημα και την έξοδό του.
| Τύπος ΣΥΝΔΕΣΗΣ | Επιστρεφόμενες γραμμές | NULLs στο αποτέλεσμα; | Τυπική χρήση |
|---|---|---|---|
| ΕΓΓΡΑΦΕΙΤΕ ΣΤΑΥΡΟΣ | Κάθε γραμμή του πίνακα Α σε συνδυασμό με κάθε γραμμή του πίνακα Β | Οχι | Δημιουργία όλων των πιθανών συνδυασμών |
| ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ | Μόνο γραμμές που αντιστοιχούν στη συνθήκη και στους δύο πίνακες | Οχι | Μέλη που νοίκιασαν μια ταινία |
| ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ | Όλες οι γραμμές από τον αριστερό πίνακα, συν τις αντιστοιχίσεις από τα δεξιά | Ναι, στη δεξιά πλευρά | Όλες οι ταινίες, ακόμα και αυτές που δεν έχουν ενοικιαστεί ποτέ, δεν έχουν νοικιαστεί ποτέ. |
| ΔΕΞΙΑ ΣΥΝΔΕΣΗ | Όλες οι γραμμές από τον δεξιό πίνακα, συν τις αντιστοιχίσεις από τα αριστερά | Ναι, στην αριστερή πλευρά | Όλες οι ταινίες, ακόμα και χωρίς κανένα μέλος συνδεδεμένο |
ΕΓΓΡΑΦΕΙΤΕ ΣΤΑΥΡΟΣ
Το Cross JOIN είναι μια απλούστερη μορφή JOIN που ταιριάζει κάθε σειρά από έναν πίνακα βάσης δεδομένων σε όλες τις σειρές ενός άλλου.
Με άλλα λόγια, μας δίνει συνδυασμούς κάθε σειράς του πρώτου πίνακα με όλες τις εγγραφές στον δεύτερο πίνακα.
Ας υποθέσουμε ότι θέλουμε να συγκεντρώσουμε όλες τις εγγραφές μελών έναντι όλων των εγγραφών ταινιών, μπορούμε να χρησιμοποιήσουμε το σενάριο που φαίνεται παρακάτω για να έχουμε τα επιθυμητά αποτελέσματα.
SELECT * FROM `movies` CROSS JOIN `members`
Εκτέλεση του παραπάνω σεναρίου στο MySQL πάγκος εργασίας μας δίνει τα παρακάτω αποτελέσματα.
| id | title | id | first_name | last_name | movie_id | |
|---|---|---|---|---|---|---|
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
| 2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
| 2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
| 2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
| 2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
| 2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
| 3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
| 3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
| 3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
| 3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
| 3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
| 4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
| 4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
| 4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
| 4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
| 4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
| 5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
| 5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
| 5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
| 5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
| 5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
| 6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
| 6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
| 6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
| 6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
| 6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
| 7 | GIA | 18+ | 1 | Adam | Smith | 1 |
| 7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
| 7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
| 7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
| 7 | GIA | 18+ | 6 | Lee | Pong | 10 |
| 8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
| 8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
| 8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
| 8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
| 8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
| 9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
| 9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
| 9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
| 9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
| 9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
| 10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
| 10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
| 10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
| 10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
| 10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ
Μια CROSS JOIN επιστρέφει κάθε πιθανό ζεύγος, κάτι που σπάνια είναι αυτό που θέλετε. Μια INNER JOIN περιορίζει το αποτέλεσμα στα ζεύγη που πραγματικά σχετίζονται.
Το εσωτερικό JOIN χρησιμοποιείται για την επιστροφή σειρών και από τους δύο πίνακες που ικανοποιούν τη δεδομένη συνθήκη.
Ας υποθέσουμε ότι θέλετε να λάβετε μια λίστα με μέλη που έχουν νοικιάσει ταινίες μαζί με τους τίτλους των ταινιών που έχουν νοικιάσει. Μπορείτε απλώς να χρησιμοποιήσετε μια ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ για αυτό, η οποία επιστρέφει γραμμές και από τους δύο πίνακες που ικανοποιούν τις δεδομένες συνθήκες.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
Εκτελώντας το παραπάνω σενάριο δίνετε
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
Σημειώστε ότι το παραπάνω σενάριο αποτελεσμάτων μπορεί επίσης να γραφτεί ως εξής για να επιτευχθούν τα ίδια αποτελέσματα.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members` AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
Εξωτερικές ΣΥΝΔΕΣΕΙΣ
Μια ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ (INNER JOIN) διαγράφει σιωπηλά γραμμές που δεν έχουν συνεργαζόμενους συνδέσμους. Όταν αυτές οι μη ταιριαστές γραμμές έχουν σημασία, η ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ (OUTER JOIN) είναι η σωστή επιλογή.
MySQL Οι εξωτερικές συνενώσεις (Outer JOINs) επιστρέφουν όλες τις εγγραφές που ταιριάζουν και από τους δύο πίνακες.
Μπορεί να ανιχνεύσει εγγραφές που δεν έχουν αντιστοιχία στον ενωμένο πίνακα. Επιστρέφει Τιμή NULL τιμές για εγγραφές ενωμένου πίνακα εάν δεν βρεθεί αντιστοίχιση.
Ακούγεται μπερδεμένο; Ας δούμε ένα παράδειγμα –
ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ
Ας υποθέσουμε τώρα ότι θέλετε να λάβετε τίτλους όλων των ταινιών μαζί με τα ονόματα των μελών που τις έχουν νοικιάσει. Είναι σαφές ότι ορισμένες ταινίες δεν έχουν νοικιαστεί από κανέναν. Μπορούμε απλά να χρησιμοποιήσουμε ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ για τον σκοπό.
Το LEFT JOIN επιστρέφει όλες τις σειρές από τον πίνακα στα αριστερά ακόμα κι αν δεν έχουν βρεθεί αντίστοιχες σειρές στον πίνακα στα δεξιά. Όπου δεν έχουν βρεθεί αντιστοιχίες στον πίνακα στα δεξιά, επιστρέφεται NULL.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B ON B.`movie_id` = A.`id`
Εκτέλεση του παραπάνω σεναρίου στο MySQL Το workbench δίνει. Μπορείτε να δείτε ότι στο αποτέλεσμα που επιστρέφεται, το οποίο παρατίθεται παρακάτω, για ταινίες που δεν ενοικιάζονται, τα πεδία ονόματος μέλους έχουν τιμές NULL. Αυτό σημαίνει ότι δεν βρέθηκε αντίστοιχο μέλος στον πίνακα μελών για τη συγκεκριμένη ταινία.
| title | first_name | last_name |
|---|---|---|
| ASSASSIN'S CREED: EMBERS | Adam | Smith |
| Real Steel(2012) | Ravi | Kumar |
| Safe (2012) | Susan | Davidson |
| Deadline(2009) | Jenny | Adrianna |
| Marley and me | Lee | Pong |
| Alvin and the Chipmunks | NULL | NULL |
| The Adventures of Tin Tin | NULL | NULL |
| Safe House(2012) | NULL | NULL |
| GIA | NULL | NULL |
| The Dirty Picture | NULL | NULL |
ΔΕΞΙΑ ΣΥΝΔΕΣΗ
Το RIGHT JOIN είναι προφανώς το αντίθετο του LEFT JOIN. Το RIGHT JOIN επιστρέφει όλες τις στήλες από τον πίνακα στα δεξιά, ακόμα κι αν δεν έχουν βρεθεί αντίστοιχες γραμμές στον πίνακα στα αριστερά. Όπου δεν έχουν βρεθεί αντιστοιχίες στον πίνακα στα αριστερά, επιστρέφεται NULL.
Στο παράδειγμά μας, ας υποθέσουμε ότι πρέπει να λάβετε τα ονόματα των μελών και τις ταινίες που έχουν νοικιάσει. Τώρα έχουμε ένα νέο μέλος που δεν έχει νοικιάσει ακόμα καμία ταινία
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Εκτέλεση του παραπάνω σεναρίου στο MySQL Ο πάγκος εργασίας δίνει τα ακόλουθα αποτελέσματα.
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
| NULL | NULL | Alvin and the Chipmunks |
| NULL | NULL | The Adventures of Tin Tin |
| NULL | NULL | Safe House(2012) |
| NULL | NULL | GIA |
| NULL | NULL | The Dirty Picture |
Ρήτρες "ON" και "USING".
Κάθε ερώτημα μέχρι στιγμής έχει αντιστοιχίσει γραμμές με έναν όρο ON. MySQL προσφέρει μια συντομότερη εναλλακτική όταν οι αντίστοιχες στήλες μοιράζονται ένα όνομα.
Στα παραπάνω παραδείγματα ερωτήματος JOIN, χρησιμοποιήσαμε τον όρο ON για να ταιριάξουμε τις εγγραφές μεταξύ του πίνακα.
Η ρήτρα USING μπορεί επίσης να χρησιμοποιηθεί για τον ίδιο σκοπό. Η διαφορά με ΧΡΗΣΗ είναι πρέπει να έχει πανομοιότυπα ονόματα για τις αντιστοιχισμένες στήλες και στους δύο πίνακες.
Στον πίνακα "movies" μέχρι στιγμής χρησιμοποιούσαμε το πρωτεύον κλειδί του με το όνομα "id". Αναφερθήκαμε στο ίδιο στον πίνακα "μελών" με το όνομα "movie_id".
Ας μετονομάσουμε τους πίνακες "movies" στο πεδίο "id" για να έχουμε το όνομα "movie_id". Αυτό το κάνουμε για να έχουμε πανομοιότυπα αντιστοιχισμένα ονόματα πεδίων.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Στη συνέχεια, ας χρησιμοποιήσουμε το USING με το παραπάνω παράδειγμα LEFT JOIN.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B USING ( `movie_id` )
Εκτός από τη χρήση ON και ΧΡΗΣΗ με JOIN μπορείτε να χρησιμοποιήσετε πολλά άλλα MySQL ρήτρες όπως GROUP BY, ΠΟΥ και μάλιστα λειτουργίες όπως ΑΘΡΟΙΣΜΑ, AVGΚ.λπ.




