SQLite Σύνδεση: Φυσικό αριστερό εξωτερικό, εσωτερικό, σταυρός με τραπέζια Παράδειγμα
SQLite υποστηρίζει διαφορετικούς τύπους SQL Ενώσεις, όπως ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ, ΑΡΙΣΤΕΡΗ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ και ΣΥΝΔΕΣΗ ΣΥΝΔΕΣΗΣ. Κάθε τύπος JOIN χρησιμοποιείται για διαφορετική κατάσταση όπως θα δούμε σε αυτό το σεμινάριο.
Εισαγωγή στην SQLite Ρήτρα ΣΥΜΜΕΤΟΧΗΣ
Όταν εργάζεστε σε μια βάση δεδομένων με πολλούς πίνακες, συχνά χρειάζεται να λαμβάνετε δεδομένα από αυτούς τους πολλούς πίνακες.
Με την ρήτρα JOIN, μπορείτε να συνδέσετε δύο ή περισσότερους πίνακες ή υποερωτήματα συνδέοντάς τους. Επίσης, μπορείτε να ορίσετε με ποια στήλη πρέπει να συνδέσετε τους πίνακες και με ποιες συνθήκες.
Οποιοσδήποτε όρος JOIN πρέπει να έχει την ακόλουθη σύνταξη:

Κάθε ρήτρα συμμετοχής περιέχει:
- Ένας πίνακας ή ένα υποερώτημα που είναι ο αριστερός πίνακας. τον πίνακα ή το υποερώτημα πριν από την ρήτρα σύνδεσης (στα αριστερά του).
- Χειριστής JOIN – καθορίστε τον τύπο σύνδεσης (είτε ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ, ΑΡΙΣΤΕΡΗ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ ή CROSS JOIN).
- Περιορισμός JOIN – αφού καθορίσετε τους πίνακες ή τα δευτερεύοντα ερωτήματα προς ένταξη, πρέπει να καθορίσετε έναν περιορισμό σύνδεσης, ο οποίος θα είναι μια συνθήκη στην οποία θα επιλεγούν οι αντίστοιχες σειρές που ταιριάζουν με αυτήν τη συνθήκη, ανάλογα με τον τύπο ένωσης.
Σημειώστε ότι, για όλα τα παρακάτω SQLite Παραδείγματα πινάκων JOIN, πρέπει να εκτελέσετε το sqlite3.exe και να ανοίξετε μια σύνδεση με το δείγμα βάσης δεδομένων όπως ρέει:
Βήμα 1) Στο στάδιο αυτό,
- Ανοίξτε τον Υπολογιστή μου και μεταβείτε στον ακόλουθο κατάλογο "C:\sqlite" και
- Στη συνέχεια ανοίξτε "sqlite3.exe"
Βήμα 2) Ανοίξτε τη βάση δεδομένων "TutorialsSampleDB.db” με την ακόλουθη εντολή:
Τώρα είστε έτοιμοι να εκτελέσετε οποιοδήποτε τύπο ερωτήματος στη βάση δεδομένων.
SQLite ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ
Η ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ επιστρέφει μόνο τις σειρές που ταιριάζουν με τη συνθήκη σύνδεσης και εξαλείφει όλες τις άλλες σειρές που δεν ταιριάζουν με τη συνθήκη σύνδεσης.
Παράδειγμα
Στο παρακάτω παράδειγμα, θα ενώσουμε τους δύο πίνακες "Φοιτητές"Και"Τμήματα” με DepartmentId για να λάβετε το όνομα τμήματος για κάθε μαθητή, ως εξής:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Επεξήγηση κώδικα
Το INNER JOIN λειτουργεί ως εξής:
- Στον όρο Επιλογή, μπορείτε να επιλέξετε όποιες στήλες θέλετε να επιλέξετε από τους δύο πίνακες που αναφέρονται.
- Ο όρος ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ γράφεται μετά τον πρώτο πίνακα που αναφέρεται με τον όρο «Από».
- Στη συνέχεια, η συνθήκη σύνδεσης καθορίζεται με ON.
- Μπορούν να καθοριστούν ψευδώνυμα για πίνακες αναφοράς.
- Η λέξη ΕΣΩΤΕΡΙΚΟ είναι προαιρετική, μπορείτε απλώς να γράψετε JOIN.
Παραγωγή
- Το INNER JOIN παράγει τις εγγραφές και από τους πίνακες των φοιτητών και του τμήματος που ταιριάζουν με την συνθήκη που είναι «Students.DepartmentId = Τμήματα.DepartmentId ". Οι μη αντιστοιχισμένες σειρές θα αγνοηθούν και δεν θα συμπεριληφθούν στο αποτέλεσμα.
- Γι' αυτό μόνο 8 μαθητές από 10 μαθητές επιστράφηκαν από αυτό το ερώτημα με τμήματα πληροφορικής, μαθηματικών και φυσικής. Ενώ οι μαθητές «Jena» και «George» δεν συμπεριλήφθηκαν, επειδή έχουν ένα μηδενικό αναγνωριστικό τμήματος, το οποίο δεν ταιριάζει με τη στήλη Id τμήματος από τον πίνακα τμημάτων. Ως εξής:
SQLite ΕΓΓΡΑΦΕΙΤΕ… ΧΡΗΣΗ
Η ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ μπορεί να γραφτεί χρησιμοποιώντας την ρήτρα "ΧΡΗΣΗ" για να αποφευχθεί ο πλεονασμός, επομένως αντί να γράψετε "ON Students.DepartmentId = Departments.DepartmentId", μπορείτε απλώς να γράψετε "USING(DepartmentID)".
Μπορείτε να χρησιμοποιήσετε το "JOIN .. USING" όποτε οι στήλες που θα συγκρίνετε στη συνθήκη σύνδεσης έχουν το ίδιο όνομα. Σε τέτοιες περιπτώσεις, δεν χρειάζεται να τα επαναλάβετε χρησιμοποιώντας την προϋπόθεση και απλώς αναφέρετε τα ονόματα των στηλών και SQLite θα το εντοπίσει.
Η διαφορά μεταξύ της ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ και της ΣΥΝΔΕΣΗΣ .. ΧΡΗΣΗ:
Με το “JOIN … USING” δεν γράφετε συνθήκη σύνδεσης, απλώς γράφετε τη στήλη ένωσης που είναι κοινή μεταξύ των δύο ενωμένων πινάκων, αντί να γράφετε τον πίνακα 1 “INNER JOIN table2 ON table1.cola = table2.cola” γράφουμε σαν "table1 JOIN table2 USING(cola)".
Παράδειγμα
Στο παρακάτω παράδειγμα, θα ενώσουμε τους δύο πίνακες "Φοιτητές"Και"Τμήματα” με DepartmentId για να λάβετε το όνομα τμήματος για κάθε μαθητή, ως εξής:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments USING(DepartmentId);
εξήγηση
- Σε αντίθεση με το προηγούμενο παράδειγμα, δεν γράψαμε "ON Students.DepartmentId = Τμήματα.DepartmentId". Μόλις γράψαμε "USING(DepartmentId)".
- SQLite συμπεραίνει αυτόματα τη συνθήκη ένωσης και συγκρίνει το αναγνωριστικό τμήματος και από τους πίνακες – Μαθητές και Τμήματα.
- Μπορείτε να χρησιμοποιήσετε αυτήν τη σύνταξη κάθε φορά που οι δύο στήλες που συγκρίνετε είναι με το ίδιο όνομα.
Παραγωγή
- Αυτό θα σας δώσει το ίδιο ακριβώς αποτέλεσμα με το προηγούμενο παράδειγμα:
SQLite ΦΥΣΙΚΗ ΣΥΝΔΕΣΗ
Μια ΦΥΣΙΚΗ ΣΥΝΔΕΣΗ είναι παρόμοια με μια ΣΥΝΔΕΣΗ…ΧΡΗΣΗ, η διαφορά είναι ότι ελέγχει αυτόματα για ισότητα μεταξύ των τιμών κάθε στήλης που υπάρχει και στους δύο πίνακες.
Η διαφορά μεταξύ ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ και ΦΥΣΙΚΗΣ ΣΥΝΔΕΣΗΣ:
- Στην ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ, πρέπει να καθορίσετε μια συνθήκη ένωσης την οποία χρησιμοποιεί η εσωτερική ένωση για να ενώσει τους δύο πίνακες. Ενώ στη φυσική ένωση, δεν γράφετε συνθήκη σύνδεσης. Απλώς γράφετε τα ονόματα των δύο πινάκων χωρίς καμία προϋπόθεση. Στη συνέχεια, η φυσική ένωση θα ελέγξει αυτόματα για ισότητα μεταξύ των τιμών για κάθε στήλη που υπάρχει και στους δύο πίνακες. Η φυσική ένωση συνάγει αυτόματα την συνθήκη σύνδεσης.
- Στο NATURAL JOIN, όλες οι στήλες και από τους δύο πίνακες με το ίδιο όνομα θα αντιστοιχιστούν μεταξύ τους. Για παράδειγμα, αν έχουμε δύο πίνακες με δύο κοινά ονόματα στηλών (οι δύο στήλες υπάρχουν με το ίδιο όνομα στους δύο πίνακες), τότε η φυσική ένωση θα ενώσει τους δύο πίνακες συγκρίνοντας τις τιμές και των δύο στηλών και όχι μόνο από τη μία στήλη.
Παράδειγμα
SELECT Students.StudentName, Departments.DepartmentName FROM Students Natural JOIN Departments;
εξήγηση
- Δεν χρειάζεται να γράψουμε μια συνθήκη ένωσης με ονόματα στηλών (όπως κάναμε στην ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ). Δεν χρειάστηκε καν να γράψουμε το όνομα της στήλης μία φορά (όπως κάναμε στο JOIN USING).
- Η φυσική ένωση θα σαρώσει και τις δύο στήλες από τους δύο πίνακες. Θα ανιχνεύσει ότι η συνθήκη θα πρέπει να αποτελείται από σύγκριση DepartmentId και από τους δύο πίνακες Students και Departments.
Παραγωγή
- Το Natural JOIN θα σας δώσει την ίδια ακριβή έξοδο με την έξοδο που πήραμε από τα παραδείγματα ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ και JOIN USING. Επειδή στο παράδειγμά μας και τα τρία ερωτήματα είναι ισοδύναμα. Αλλά σε ορισμένες περιπτώσεις, η έξοδος θα είναι διαφορετική από την εσωτερική ένωση μετά από μια φυσική ένωση. Για παράδειγμα, εάν υπάρχουν περισσότεροι πίνακες με τα ίδια ονόματα, τότε η φυσική ένωση θα ταιριάζει με όλες τις στήλες μεταξύ τους. Ωστόσο, η εσωτερική ένωση θα ταιριάζει μόνο με τις στήλες στη συνθήκη σύνδεσης (περισσότερες λεπτομέρειες στην επόμενη ενότητα, η διαφορά μεταξύ της εσωτερικής ένωσης και της φυσικής ένωσης).
SQLite ΑΡΙΣΤΕΡΑ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ
Το πρότυπο SQL ορίζει τρεις τύπους ΕΞΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ: LEFT, RIGHT και FULL SQLite υποστηρίζει μόνο τη φυσική ΑΡΙΣΤΕΡΑ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ.
Στο LEFT OUTER JOIN, όλες οι τιμές των στηλών που επιλέγετε από τον αριστερό πίνακα θα συμπεριληφθούν στο αποτέλεσμα του απορία, επομένως ανεξάρτητα από το εάν η τιμή ταιριάζει με τη συνθήκη σύνδεσης ή όχι, θα συμπεριληφθεί στο αποτέλεσμα.
Έτσι, εάν ο αριστερός πίνακας έχει γραμμές 'n', τα αποτελέσματα του ερωτήματος θα έχουν γραμμές 'n'. Ωστόσο, για τις τιμές των στηλών που προέρχονται από τον δεξιό πίνακα, εάν οποιαδήποτε τιμή δεν ταιριάζει με τη συνθήκη σύνδεσης, θα περιέχει μια τιμή "null".
Έτσι, θα λάβετε έναν αριθμό σειρών που ισοδυναμεί με τον αριθμό των σειρών στην αριστερή ένωση. Έτσι, θα λάβετε τις αντίστοιχες σειρές και από τους δύο πίνακες (όπως τα αποτελέσματα ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ), συν τις μη αντιστοιχισμένες σειρές από τον αριστερό πίνακα.
Παράδειγμα
Στο παρακάτω παράδειγμα, θα δοκιμάσουμε το “LEFT JOIN” για να ενώσει τους δύο πίνακες “Students” και “Departments”:
SELECT Students.StudentName, Departments.DepartmentName FROM Students -- this is the left table LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
εξήγηση
- SQLite Η σύνταξη LEFT JOIN είναι η ίδια με την ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ. γράφετε το LEFT JOIN μεταξύ των δύο πινάκων και, στη συνέχεια, η συνθήκη ένωσης έρχεται μετά τον όρο ON.
- Ο πρώτος πίνακας μετά την ρήτρα από είναι ο αριστερός πίνακας. Ενώ ο δεύτερος πίνακας που ορίζεται μετά το φυσικό LEFT JOIN είναι ο σωστός πίνακας.
- Η ρήτρα OUTER είναι προαιρετική. Το LEFT natural OUTER JOIN είναι το ίδιο με το LEFT JOIN.
Παραγωγή
- Όπως μπορείτε να δείτε περιλαμβάνονται όλες οι σειρές από τον πίνακα μαθητών που είναι 10 μαθητές συνολικά. Ακόμα κι αν ο τέταρτος και ο τελευταίος φοιτητής, Jena, και George DepartmentIds δεν υπάρχουν στον πίνακα των Τμημάτων, περιλαμβάνονται επίσης.
- Και σε αυτές τις περιπτώσεις, η τιμή DepartmentName τόσο για την Jena όσο και για τον George θα είναι "μηδενική", επειδή ο πίνακας των τμημάτων δεν έχει ένα DepartmentName που να ταιριάζει με την τιμή του DepartmentId.
Ας δώσουμε στο προηγούμενο ερώτημα χρησιμοποιώντας την αριστερή ένωση μια βαθύτερη εξήγηση χρησιμοποιώντας διαγράμματα Van:
Το LEFT JOIN θα δώσει τα ονόματα όλων των μαθητών από τον πίνακα μαθητών ακόμα κι αν ο μαθητής έχει αναγνωριστικό τμήματος που δεν υπάρχει στον πίνακα τμημάτων. Έτσι, το ερώτημα δεν θα σας δώσει μόνο τις αντίστοιχες σειρές ως ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ, αλλά θα σας δώσει το επιπλέον μέρος που έχει τις μη αντιστοιχισμένες σειρές από τον αριστερό πίνακα που είναι ο πίνακας μαθητών.
Σημειώστε ότι οποιοδήποτε όνομα μαθητή δεν έχει αντίστοιχο τμήμα θα έχει τιμή "μηδενική" για το όνομα τμήματος, επειδή δεν υπάρχει αντίστοιχη τιμή για αυτό και αυτές οι τιμές είναι οι τιμές στις μη αντιστοιχισμένες σειρές.
SQLite ΕΓΓΡΑΦΕΙΤΕ ΣΤΑΥΡΟΣ
Ένα CROSS JOIN δίνει το καρτεσιανό γινόμενο για τις επιλεγμένες στήλες των δύο ενωμένων πινάκων, αντιστοιχίζοντας όλες τις τιμές από τον πρώτο πίνακα με όλες τις τιμές από τον δεύτερο πίνακα.
Έτσι, για κάθε τιμή στον πρώτο πίνακα, θα λάβετε αντιστοιχίες 'n' από τον δεύτερο πίνακα όπου n είναι ο αριθμός των σειρών του δεύτερου πίνακα.
Σε αντίθεση με την ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ και την ΑΡΙΣΤΕΡΗ ΕΞΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ, με CROSS JOIN, δεν χρειάζεται να καθορίσετε μια συνθήκη σύνδεσης, επειδή SQLite δεν το χρειάζεται για το CROSS JOIN.
Τα Διαχωριστικά SQLite θα οδηγήσει σε λογικά αποτελέσματα που ορίζονται συνδυάζοντας όλες τις τιμές από τον πρώτο πίνακα με όλες τις τιμές από τον δεύτερο πίνακα.
Για παράδειγμα, εάν επιλέξατε μια στήλη από τον πρώτο πίνακα (colA) και μια άλλη στήλη από τον δεύτερο πίνακα (colB). Το colA περιέχει δύο τιμές (1,2) και το colB περιέχει επίσης δύο τιμές (3,4).
Τότε το αποτέλεσμα του CROSS JOIN θα είναι τέσσερις σειρές:
- Δύο σειρές συνδυάζοντας την πρώτη τιμή από το colA που είναι 1 με τις δύο τιμές του colB (3,4) που θα είναι (1,3), (1,4).
- Ομοίως, δύο σειρές συνδυάζοντας τη δεύτερη τιμή από το colA που είναι 2 με τις δύο τιμές του colB (3,4) που είναι (2,3), (2,4).
Παράδειγμα
Στο παρακάτω ερώτημα θα δοκιμάσουμε CROSS JOIN μεταξύ των πινάκων Φοιτητών και Τμημάτων:
SELECT Students.StudentName, Departments.DepartmentName FROM Students CROSS JOIN Departments;
εξήγηση
- Στο SQLite επιλέξτε από πολλούς πίνακες, απλώς επιλέξαμε δύο στήλες «όνομα μαθητή» από τον πίνακα μαθητών και το «Όνομα τμήματος» από τον πίνακα τμημάτων.
- Για τη σταυρωτή ένωση, δεν καθορίσαμε καμία συνθήκη σύνδεσης μόνο τα δύο τραπέζια σε συνδυασμό με CROSS JOIN στη μέση τους.
Παραγωγή
Όπως μπορείτε να δείτε, το αποτέλεσμα είναι 40 σειρές. 10 τιμές από τον πίνακα μαθητών ταιριάζουν με τα 4 τμήματα από τον πίνακα τμημάτων. Ως εξής:
- Τέσσερις τιμές για τα τέσσερα τμήματα από τον πίνακα τμημάτων ταιριάζουν με τον πρώτο μαθητή Michel.
- Τέσσερις τιμές για τα Τέσσερα τμήματα από τον πίνακα τμημάτων ταιριάζουν με τον δεύτερο μαθητή John.
- Τέσσερις τιμές για τα Τέσσερα τμήματα από τον πίνακα τμημάτων ταιριάζουν με τον τρίτο μαθητή Τζακ… και ούτω καθεξής.
Σύνοψη
Χρησιμοποιώντας SQLite Ερώτημα JOIN, μπορείτε να συνδέσετε έναν ή περισσότερους πίνακες ή υποερωτήματα για να επιλέξετε στήλες και από τους δύο πίνακες ή υποερωτήματα.