MySQL Εκμάθηση ΕΝΩΣΕΩΝ: ΕΣΩΤΕΡΙΚΗ, ΕΞΩΤΕΡΙΚΗ, ΑΡΙΣΤΕΡΑ, ΔΕΞΙΑ, ΣΤΑΥΡΟΣ
Τι είναι τα JOINS;
Οι συνδέσεις βοηθούν στην ανάκτηση δεδομένων από δύο ή περισσότερους πίνακες βάσεων δεδομένων.
Οι πίνακες συνδέονται μεταξύ τους χρησιμοποιώντας πρωτεύοντα και ξένα κλειδιά.
Σημείωση: Το JOIN είναι το πιο παρεξηγημένο θέμα μεταξύ των SQL leaners. Για λόγους απλότητας και ευκολίας κατανόησης, θα χρησιμοποιήσουμε μια νέα βάση δεδομένων για την εξάσκηση του δείγματος. Οπως φαίνεται παρακάτω
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 | Ο Μάρλεϊ και εγώ | Ρομαντισμός |
Τύποι ενώσεων
Cross JOIN
Το 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 |
ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ
Το εσωτερικό 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`
Εξωτερικές ΣΥΝΔΕΣΕΙΣ
MySQL Τα εξωτερικά JOIN επιστρέφουν όλες τις εγγραφές που ταιριάζουν και από τους δύο πίνακες.
Μπορεί να ανιχνεύσει εγγραφές που δεν έχουν αντιστοιχία στον ενωμένο πίνακα. Επιστρέφει Τιμή 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 Ο πάγκος εργασίας δίνει. Μπορείτε να δείτε ότι στο επιστρεφόμενο αποτέλεσμα που παρατίθεται παρακάτω για τις ταινίες που δεν νοικιάζονται, τα πεδία ονόματος μέλους έχουν τιμές 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".
Στα παραπάνω παραδείγματα ερωτήματος 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 ρήτρες όπως ΟΜΑΔΑ ΑΝΑ, ΠΟΥ και μάλιστα λειτουργίες όπως ΑΘΡΟΙΣΜΑ, AVGΚ.λπ.
Γιατί πρέπει να χρησιμοποιούμε συνδέσμους;
Τώρα μπορείτε να σκεφτείτε γιατί χρησιμοποιούμε JOIN όταν μπορούμε να κάνουμε την ίδια εργασία εκτελώντας ερωτήματα. Ειδικά αν έχετε κάποια εμπειρία στον προγραμματισμό βάσεων δεδομένων, ξέρετε ότι μπορούμε να εκτελέσουμε ερωτήματα ένα προς ένα, χρησιμοποιήστε την έξοδο του καθενός σε διαδοχικά ερωτήματα. Φυσικά, αυτό είναι δυνατό. Αλλά χρησιμοποιώντας τα JOIN, μπορείτε να ολοκληρώσετε τη δουλειά χρησιμοποιώντας μόνο ένα ερώτημα με οποιεσδήποτε παραμέτρους αναζήτησης. Αφ 'ετέρου MySQL μπορεί να επιτύχει καλύτερη απόδοση με JOIN καθώς μπορεί να χρησιμοποιήσει την ευρετηρίαση. Η απλή χρήση ενός ερωτήματος JOIN αντί της εκτέλεσης πολλαπλών ερωτημάτων μειώνει την επιβάρυνση του διακομιστή. Αντίθετα, η χρήση πολλαπλών ερωτημάτων οδηγεί σε περισσότερες μεταφορές δεδομένων μεταξύ MySQL και εφαρμογές (λογισμικό). Επιπλέον, απαιτεί περισσότερους χειρισμούς δεδομένων στο τέλος της εφαρμογής επίσης.
Είναι σαφές ότι μπορούμε να πετύχουμε καλύτερα MySQL και επιδόσεις εφαρμογών με χρήση JOIN.
Σύνοψη
- Τα JOINS μας επιτρέπουν να συνδυάσουμε δεδομένα από περισσότερους από έναν πίνακες σε ένα ενιαίο σύνολο αποτελεσμάτων.
- Τα JOINS έχουν καλύτερη απόδοση σε σύγκριση με τα δευτερεύοντα ερωτήματα
- Οι ΕΣΩΤΕΡΙΚΟΙ ΣΥΝΔΕΣΜΟΙ επιστρέφουν μόνο σειρές που πληρούν τα δεδομένα κριτήρια.
- Το OUTER JOINS μπορεί επίσης να επιστρέψει σειρές όπου δεν έχουν βρεθεί αντιστοιχίες. Οι μη αντιστοιχισμένες σειρές επιστρέφονται με τη λέξη-κλειδί NULL.
- Οι κύριοι τύποι ΣΥΝΔΕΣΗΣ περιλαμβάνουν Εσωτερικές, Αριστερές Εξωτερικές, Δεξιές Εξωτερικές, Σταυρωτές ΕΝΩΣΕΙΣ κ.λπ.
- Η ρήτρα που χρησιμοποιείται συχνά στις λειτουργίες JOIN είναι "ON". Ο όρος "ΧΡΗΣΗ" απαιτεί οι αντίστοιχες στήλες να έχουν το ίδιο όνομα.
- Το JOINS μπορεί επίσης να χρησιμοποιηθεί σε άλλες ρήτρες όπως GROUP BY, WHERE, SUB UERIES, AGGREGATE FUNCTIONS κ.λπ.