MySQL JOINS Tutorial: ΕΣΩΤΕΡΙΚΟ, ΕΞΩΤΕΡΙΚΟ, ΑΡΙΣΤΕΡΟ, ΔΕΞΙΟ, ΔΙΑΘΕΣΙΜΟ

Anonim

Τι είναι οι ΕΝΩΣΕΙΣ;

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

Σημείωση: Το 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
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 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
Note: Null is returned for non-matching rows on left

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