MySQL Σύνδεση: Εσωτερική, Εξωτερική, Αριστερή, Δεξιά, Σταυρωτή

⚡ Έξυπνη Σύνοψη

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

  • 🔗 Βασική Αρχή: Μια JOIN αντιστοιχίζει γραμμές σε όλους τους πίνακες χρησιμοποιώντας σχέσεις πρωτεύοντος κλειδιού και ξένου κλειδιού.
  • Γιατί έχει σημασία: Ένα ερώτημα JOIN χρησιμοποιεί ευρετηρίαση και μειώνει τις διαδρομές μετ' επιστροφής του διακομιστή σε σύγκριση με πολλά ξεχωριστά ερωτήματα.
  • Συμπεριφορά Cross JOIN: Κάθε γραμμή του πρώτου πίνακα συνδυάζεται με κάθε γραμμή του δεύτερου, παράγοντας ένα καρτεσιανό γινόμενο.
  • 🎯 Συμπεριφορά εσωτερικής σύνδεσης: Επιστρέφονται μόνο οι γραμμές που ικανοποιούν την αντίστοιχη συνθήκη και στους δύο πίνακες.
  • ↔️ Συμπεριφορά εξωτερικής σύνδεσης: Οι συναρτήσεις LEFT και RIGHT JOIN επιστρέφουν επίσης μη ταιριασμένες γραμμές και συμπληρώνουν τις στήλες που λείπουν με NULL.
  • 🧩 ΕΝΕΡΓΟΠΟΙΗΣΗ έναντι ΧΡΗΣΗΣ: Η συνάρτηση USING απαιτεί πανομοιότυπα ονόματα στηλών, ενώ η συνάρτηση ON υποστηρίζει οποιαδήποτε αντίστοιχη παράσταση.

MySQL ΣΥΝΔΕΣΕΙΣ

Τι είναι τα 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
Note: Null is returned for non-matching rows on right

ΔΕΞΙΑ ΣΥΝΔΕΣΗ

Το 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
Note: Null is returned for non-matching rows on left

Ρήτρες "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Κ.λπ.

Συχνές Ερωτήσεις

Μια ΣΥΝΔΕΣΗ συνδυάζει στήλες από δύο πίνακες δίπλα-δίπλα, με αντίστοιχες γραμμές σε ένα κλειδί. Μια ΣΥΝΔΕΣΗ στοιβάζει τα αποτελέσματα δύο ερωτημάτων κάθετα και απαιτεί αντίστοιχους αριθμούς και τύπους στηλών.

Ναι. Συνδέστε αλυσιδωτά επιπλέον όρους JOIN, καθεμία με τη δική της συνθήκη ON. MySQL ενώνει τους δύο πρώτους πίνακες, στη συνέχεια ενώνει αυτό το ενδιάμεσο αποτέλεσμα στον επόμενο πίνακα και ούτω καθεξής.

Μια συνάρτηση SELF JOIN ενώνει έναν πίνακα με τον εαυτό του χρησιμοποιώντας δύο ψευδώνυμα. Συγκρίνει γραμμές μέσα σε έναν πίνακα, όπως αντιστοιχίζοντας μια γραμμή υπαλλήλου με τη γραμμή του διευθυντή αυτού του υπαλλήλου.

Ναι. Βοηθοί τεχνητής νοημοσύνης ενσωματωμένοι σε προγράμματα επεξεργασίας, όπως π.χ. MySQL Πάγκος εργασίας μπορεί να συντάξει ερωτήματα JOIN από μια απλή γλώσσα προτροπής. Να ελέγχετε πάντα τις δημιουργημένες συνθήκες ON, καθώς ένα λανθασμένο κλειδί παράγει σιωπηλά λανθασμένα αποτελέσματα.

Εν μέρει. Οι σύμβουλοι τεχνητής νοημοσύνης προτείνουν ευρετήρια και καλύτερες εντολές σύνδεσης, οι οποίες συχνά μειώνουν τον χρόνο εκτέλεσης. Ο βελτιστοποιητής εξακολουθεί να επιλέγει το τελικό σχέδιο, επομένως η σωστή δημιουργία ευρετηρίου στα κλειδιά σύνδεσης παραμένει ο σημαντικότερος παράγοντας.

Συνοψίστε αυτήν την ανάρτηση με: