Τι είναι οι ΕΝΩΣΕΙΣ;
Οι συνδέσεις βοηθούν στην ανάκτηση δεδομένων από δύο ή περισσότερους πίνακες βάσης δεδομένων. Οι πίνακες σχετίζονται μεταξύ τους χρησιμοποιώντας πρωτεύοντα και ξένα κλειδιά.Σημείωση: Το JOIN είναι το πιο παρεξηγημένο θέμα μεταξύ των SQL. Για λόγους απλότητας και ευκολίας κατανόησης, θα χρησιμοποιήσουμε μια νέα βάση δεδομένων για την πρακτική του δείγματος. Οπως φαίνεται παρακάτω
ταυτότητα | όνομα | επίθετο | movie_id |
---|---|---|---|
1 | Αδάμ | Σιδηρουργός | 1 |
2 | Ράβι | Κουμάρ | 2 |
3 | Σούζαν | Ντέιβιντσον | 5 |
4 | Κλωστική μηχανή | Adrianna | 8 |
6 | Υπήνεμος | Πονγκ | 10 |
ταυτότητα | τίτλος | κατηγορία |
---|---|---|
1 | Η ΔΗΜΙΟΥΡΓΙΑ ΤΗΣ ASSASSIN: ΠΕΡΜΑΤΑ | Κινούμενα σχέδια |
2 | Real Steel (2012) | Κινούμενα σχέδια |
3 | Ο Alvin και οι Chipmunks | Κινούμενα σχέδια |
4 | Οι περιπέτειες του κασσίτερου | Κινούμενα σχέδια |
5 | Ασφαλές (2012) | Δράση |
6 | Safe House (2012) | Δράση |
7 | ΓΙΑ | 18+ |
8 | Προθεσμία 2009 | 18+ |
9 | Η βρώμικη εικόνα | 18+ |
10 | Η Μάρλεϊ και εγώ | Ειδύλλιο |
Τύποι συμμετοχών
Διασταυρώστε
Το 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 χρησιμοποιείται για την επιστροφή σειρών και από τους δύο πίνακες που ικανοποιούν τη δεδομένη κατάσταση.
Ας υποθέσουμε ότι θέλετε να λάβετε μια λίστα με τα μέλη που έχουν νοικιάσει ταινίες μαζί με τίτλους ταινιών που έχουν νοικιάσει. Μπορείτε απλά να χρησιμοποιήσετε ένα INNER JOIN για αυτό, το οποίο επιστρέφει σειρές και από τους δύο πίνακες που ικανοποιούν τις δεδομένες συνθήκες.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE 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 AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Εξωτερικές συνδέσεις
Το MySQL Outer JOIN επιστρέφει όλες τις εγγραφές που ταιριάζουν και από τους δύο πίνακες.
Μπορεί να εντοπίσει εγγραφές που δεν ταιριάζουν στον ενωμένο πίνακα. Επιστρέφει NULL τιμές για εγγραφές του ενωμένου πίνακα εάν δεν βρεθεί αντιστοιχία.
Ακούγεται σύγχυση; Ας δούμε ένα παράδειγμα -
ΑΡΙΣΤΕΡΑ ΕΓΓΡΑΦΗ
Ας υποθέσουμε ότι θέλετε να λάβετε τίτλους όλων των ταινιών μαζί με ονόματα μελών που τα έχουν νοικιάσει. Είναι σαφές ότι ορισμένες ταινίες δεν έχουν ενοικιαστεί από καμία. Μπορούμε απλά να χρησιμοποιήσουμε το LEFT JOIN για το σκοπό αυτό.
Το LEFT JOIN επιστρέφει όλες τις σειρές από τον πίνακα στα αριστερά, ακόμη και αν δεν έχουν βρεθεί αντίστοιχες σειρές στον πίνακα στα δεξιά. Όταν δεν βρέθηκαν αγώνες στον πίνακα στα δεξιά, επιστρέφεται το NULL.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON 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 ARIGHT JOIN `movies` AS BON 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 query, χρησιμοποιήσαμε τον όρο ON για να ταιριάξουμε τις εγγραφές μεταξύ του πίνακα.
Ο όρος USING μπορεί επίσης να χρησιμοποιηθεί για τον ίδιο σκοπό. Η διαφορά με το USING είναι ότι πρέπει να έχει πανομοιότυπα ονόματα για αντιστοιχισμένες στήλες και στους δύο πίνακες.
Στον πίνακα "ταινίες" μέχρι τώρα χρησιμοποιήσαμε το πρωτεύον κλειδί του με το όνομα "id". Αναφέραμε το ίδιο στον πίνακα "μέλη" με το όνομα "movie_id".
Ας μετονομάσουμε το πεδίο "ταινίες" πίνακες "id" για να έχουμε το όνομα "movie_id". Αυτό το κάνουμε για να έχουμε πανομοιότυπα αντίστοιχα ονόματα πεδίων.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Στη συνέχεια ας χρησιμοποιήσουμε το ΧΡΗΣΗ με το παραπάνω ΑΡΙΣΤΕΡΟ ΣΥΝΔΕΣΗ παράδειγμα
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Εκτός από τη χρήση ON και ΧΡΗΣΗ με ΣΥΝΔΕΣΕΙΣ, μπορείτε να χρησιμοποιήσετε πολλές άλλες ρήτρες MySQL όπως GROUP BY, WHERE και ακόμη και λειτουργίες όπως SUM , AVG κ.λπ.
Γιατί πρέπει να χρησιμοποιούμε συνδέσεις;
Τώρα μπορείτε να σκεφτείτε, γιατί χρησιμοποιούμε το JOIN όταν μπορούμε να κάνουμε την ίδια εργασία εκτελώντας ερωτήματα. Ειδικά αν έχετε κάποια εμπειρία στον προγραμματισμό βάσεων δεδομένων γνωρίζετε ότι μπορούμε να εκτελέσουμε ερωτήματα ένα προς ένα, να χρησιμοποιήσουμε κάθε ένα σε διαδοχικά ερωτήματα. Φυσικά, αυτό είναι δυνατό. Αλλά χρησιμοποιώντας το JOIN, μπορείτε να ολοκληρώσετε τη δουλειά χρησιμοποιώντας μόνο ένα ερώτημα με οποιεσδήποτε παραμέτρους αναζήτησης. Από την άλλη πλευρά, η MySQL μπορεί να επιτύχει καλύτερη απόδοση με τους JOIN καθώς μπορεί να χρησιμοποιήσει την ευρετηρίαση. Η απλή χρήση ενός ερωτήματος μεμονωμένο JOIN αντί της εκτέλεσης πολλαπλών ερωτημάτων μειώνει τα γενικά έξοδα διακομιστή. Αντίθετα, η χρήση πολλαπλών ερωτημάτων οδηγεί σε περισσότερες μεταφορές δεδομένων μεταξύ MySQL και εφαρμογών (λογισμικό). Επιπλέον απαιτεί περισσότερους χειρισμούς δεδομένων στο τέλος της εφαρμογής επίσης.
Είναι σαφές ότι μπορούμε να επιτύχουμε καλύτερες επιδόσεις MySQL και εφαρμογών με τη χρήση JOIN.
Περίληψη
- Το JOINS μας επιτρέπει να συνδυάζουμε δεδομένα από περισσότερους από έναν πίνακες σε ένα σύνολο αποτελεσμάτων.
- Το JOINS έχει καλύτερη απόδοση σε σύγκριση με τα υπο ερωτήματα
- Το INNER JOINS επιστρέφει μόνο σειρές που πληρούν τα δεδομένα κριτήρια.
- OOTER JOINS μπορούν επίσης να επιστρέψουν σειρές όπου δεν έχουν βρεθεί αγώνες. Οι μη αντιστοιχισμένες σειρές επιστρέφονται με τη λέξη-κλειδί NULL.
- Οι κύριοι τύποι JOIN περιλαμβάνουν Inner, Left Outer, Right Outer, Cross JOINS κ.λπ.
- Η ρήτρα που χρησιμοποιείται συχνά στις λειτουργίες JOIN είναι "ON". Ο όρος "ΧΡΗΣΗ" απαιτεί οι αντίστοιχες στήλες να έχουν το ίδιο όνομα.
- Το JOINS μπορεί επίσης να χρησιμοποιηθεί σε άλλες ρήτρες όπως GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS κ.λπ.