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
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".

Στα παραπάνω παραδείγματα ερωτήματος 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 κ.λπ.