Το SQLite υποστηρίζει διαφορετικούς τύπους SQL Joins, όπως INNER JOIN, LEFT OUTER JOIN και CROSS JOIN. Κάθε τύπος JOIN χρησιμοποιείται για διαφορετική κατάσταση όπως θα δούμε σε αυτό το σεμινάριο.
Σε αυτό το σεμινάριο, θα μάθετε-
- Εισαγωγή στην ενότητα SQLite JOIN
- ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ
- ΕΓΓΡΑΦΕΙΤΕ ... ΧΡΗΣΗ
- ΦΥΣΙΚΗ ΣΥΝΔΕΣΗ
- ΑΡΙΣΤΕΡΑ ΕΓΓΡΑΦΗ
- ΕΓΓΡΑΦΕΙΤΕ ΣΤΑΥΡΟΣ
Εισαγωγή στην ενότητα SQLite JOIN
Όταν εργάζεστε σε μια βάση δεδομένων με πολλούς πίνακες, συχνά πρέπει να λαμβάνετε δεδομένα από αυτούς τους πολλαπλούς πίνακες.
Με τη ρήτρα JOIN, μπορείτε να συνδέσετε δύο ή περισσότερους πίνακες ή υποερωτήματα συνδέοντας τους. Επίσης, μπορείτε να ορίσετε με ποια στήλη θα πρέπει να συνδέσετε τους πίνακες και με ποιες συνθήκες.
Οποιαδήποτε ρήτρα JOIN πρέπει να έχει την ακόλουθη σύνταξη:
Κάθε ρήτρα συμμετοχής περιέχει:
- Ένας πίνακας ή ένα υποερώτημα που είναι ο αριστερός πίνακας. τον πίνακα ή το ερώτημα πριν από τον όρο ένταξης (στα αριστερά του).
- JOIN operator - καθορίστε τον τύπο σύνδεσης (είτε INNER JOIN, LEFT OUTER JOIN ή CROSS JOIN).
- ΣΥΝΔΕΣΗ-περιορισμός - αφού καθορίσετε τους πίνακες ή τα δευτερεύοντα ερωτήματα για συμμετοχή, πρέπει να καθορίσετε έναν περιορισμό σύνδεσης, ο οποίος θα είναι μια κατάσταση στην οποία θα επιλεγούν οι αντίστοιχες σειρές που ταιριάζουν με αυτήν την κατάσταση ανάλογα με τον τύπο σύνδεσης.
Σημειώστε ότι, για όλα τα ακόλουθα παραδείγματα, πρέπει να εκτελέσετε το sqlite3.exe και να ανοίξετε μια σύνδεση με το δείγμα βάσης δεδομένων ως ροή:
Βήμα 1) Σε αυτό το βήμα,
- Ανοίξτε τον υπολογιστή μου και μεταβείτε στον ακόλουθο κατάλογο " C: \ sqlite " και
- Στη συνέχεια, ανοίξτε το " sqlite3.exe ":
Βήμα 2) Ανοίξτε τη βάση δεδομένων " TutorialsSampleDB.db " με την ακόλουθη εντολή:
Τώρα είστε έτοιμοι να εκτελέσετε οποιοδήποτε είδος ερωτήματος στη βάση δεδομένων.
SQLite INNER JOIN
Το INNER JOIN επιστρέφει μόνο τις σειρές που ταιριάζουν με την κατάσταση σύνδεσης και εξαλείφει όλες τις άλλες σειρές που δεν ταιριάζουν με την κατάσταση σύνδεσης.
Παράδειγμα
Στο ακόλουθο παράδειγμα, θα ενώσουμε τους δύο πίνακες " Φοιτητές " και " Τμήματα " με το DepartmentId για να λάβουμε το όνομα του τμήματος για κάθε μαθητή, ως εξής:
ΕΠΙΛΕΓΩΦοιτητές. Όνομα σπουδαστή,Τμήματα. Όνομα τμήματοςΑΠΟ ΦοιτητέςINNER JOIN Τμήματα ON Students.DepartmentId = Departments.DepartmentId;
Επεξήγηση κωδικού:
Το INNER JOIN λειτουργεί ως εξής:
- Στη ρήτρα Select, μπορείτε να επιλέξετε όσες στήλες θέλετε να επιλέξετε από τους δύο πίνακες αναφοράς.
- Η ρήτρα INNER JOIN γράφεται μετά τον πρώτο πίνακα που αναφέρεται με τη φράση "From".
- Στη συνέχεια, ο όρος σύνδεσης καθορίζεται με το ON
- Τα ψευδώνυμα μπορούν να καθοριστούν για πίνακες αναφοράς.
- Η λέξη INNER είναι προαιρετική, μπορείτε απλώς να γράψετε JOIN.
Παραγωγή:
- Το INNER JOIN παράγει τις εγγραφές και από τους δύο - τους μαθητές και τους πίνακες του τμήματος που ταιριάζουν με την κατάσταση που είναι " S tudents.DepartmentId = Departments.DepartmentId ". Οι ασύγκριτες σειρές θα αγνοηθούν και δεν θα συμπεριληφθούν στο αποτέλεσμα.
- Γι 'αυτό μόνο 8 μαθητές από 10 μαθητές επέστρεψαν από αυτό το ερώτημα με τμήματα πληροφορικής, μαθηματικών και φυσικής. Ενώ οι μαθητές "Jena" και "George" δεν συμπεριλήφθηκαν, επειδή έχουν μηδενικό αναγνωριστικό τμήματος, το οποίο δεν ταιριάζει με τη στήλη departmentId από τον πίνακα τμημάτων. Ως εξής:
SQLite ΕΓΓΡΑΦΕΙΤΕ… ΧΡΗΣΗ
Το INNER JOIN μπορεί να γραφτεί χρησιμοποιώντας τη ρήτρα "ΧΡΗΣΗ" για να αποφευχθεί ο πλεονασμός, οπότε αντί να γράφετε "ON Students.DepartmentId = Departments.DepartmentId", μπορείτε απλώς να γράψετε "USING (DepartmentID)".
Μπορείτε να χρησιμοποιήσετε το "JOIN… USING" όποτε οι στήλες που θα συγκρίνετε στην συνθήκη συνένωσης είναι το ίδιο όνομα. Σε τέτοιες περιπτώσεις, δεν χρειάζεται να τα επαναλάβετε χρησιμοποιώντας την κατάσταση συνθήκης και απλώς δηλώστε τα ονόματα στηλών και το SQLite θα το εντοπίσει.
Η διαφορά μεταξύ του INNER JOIN και JOIN… ΧΡΗΣΗ:
Με το "JOIN
… ΧΡΗΣΙΜΟΠΟΙΗΣΗ "δεν γράφετε μια συνθήκη συνένωσης, απλώς γράφετε τη στήλη σύνδεσης που είναι κοινό μεταξύ των δύο ενωμένων πινάκων, αντί να γράφετε τον πίνακα1" INNER JOIN table2 ON table1.cola = table2.cola "το γράφουμε σαν" table1 JOIN table2 ΧΡΗΣΗ (κόλα) "Παράδειγμα
Στο ακόλουθο παράδειγμα, θα ενώσουμε τους δύο πίνακες " Φοιτητές " και " Τμήματα " με το DepartmentId για να λάβουμε το όνομα του τμήματος για κάθε μαθητή, ως εξής:
ΕΠΙΛΕΓΩΦοιτητές. Όνομα σπουδαστή,Τμήματα. Όνομα τμήματοςΑΠΟ ΦοιτητέςINNER JOIN Τμήματα ΧΡΗΣΗ (DepartmentId)?
Εξήγηση
- Σε αντίθεση με το προηγούμενο παράδειγμα, δεν γράψαμε " ON Students.DepartmentId = Departments.DepartmentId ". Μόλις γράψαμε " USING (DepartmentId) ".
- Το SQLite εισάγει αυτόματα την κατάσταση σύνδεσης και συγκρίνει το DepartmentId και από τους δύο πίνακες - Φοιτητές και Τμήματα
- Μπορείτε να χρησιμοποιήσετε αυτήν τη σύνταξη όποτε οι δύο στήλες που συγκρίνετε είναι με το ίδιο όνομα.
Παραγωγή
- Αυτό θα σας δώσει το ίδιο ακριβές αποτέλεσμα με το προηγούμενο παράδειγμα:
SQLite NATURAL JOIN
Μια ΦΥΣΙΚΗ ΣΥΝΔΕΣΗ είναι παρόμοια με μια ΣΥΝΔΕΣΗ… ΧΡΗΣΗ, η διαφορά είναι ότι ελέγχει αυτόματα την ισότητα μεταξύ των τιμών κάθε στήλης που υπάρχει και στους δύο πίνακες.
Η διαφορά μεταξύ INNER JOIN και NATURAL JOIN:
- I n INNER JOIN, θα πρέπει να καθορίσετε μια συνθήκη συνένωσης που η εσωτερική ενταχθούν χρήσεις να ενώσει τους δύο πίνακες. Ενώ στη φυσική ένωση, δεν γράφετε συνθήκη ένταξης. Απλώς γράφετε τα ονόματα των δύο πινάκων χωρίς καμία συνθήκη. Στη συνέχεια, η φυσική ένωση θα ελέγξει αυτόματα την ισότητα μεταξύ των τιμών για κάθε στήλη που υπάρχει και στους δύο πίνακες. Η φυσική ένωση εισάγει αυτόματα την κατάσταση σύνδεσης.
- Στο NATURAL JOIN, όλες οι στήλες και από τους δύο πίνακες με το ίδιο όνομα θα ταιριάζουν μεταξύ τους. Για παράδειγμα, εάν έχουμε δύο πίνακες με δύο κοινά ονόματα στηλών (οι δύο στήλες υπάρχουν με το ίδιο όνομα στους δύο πίνακες), τότε η φυσική ένωση θα ενώσει τους δύο πίνακες συγκρίνοντας τις τιμές και των δύο στηλών και όχι μόνο από έναν στήλη.
Παράδειγμα
ΕΠΙΛΕΓΩΦοιτητές. Όνομα σπουδαστή,Τμήματα. Όνομα τμήματοςΑΠΟ ΦοιτητέςΦυσικά ΤΜΗΜΑΤΑ
Εξήγηση
- Δεν χρειάζεται να γράψουμε μια συνθήκη σύνδεσης με ονόματα στηλών (όπως κάναμε στο INNER JOIN). Δεν χρειαζόταν καν να γράψουμε το όνομα της στήλης μία φορά (όπως κάναμε στο JOIN USING).
- Η φυσική ένωση θα σαρώσει και τις δύο στήλες από τους δύο πίνακες. Θα ανιχνεύσει ότι η συνθήκη θα πρέπει να αποτελείται από τη σύγκριση του DepartmentId και από τους δύο πίνακες Φοιτητές και Τμήματα.
Παραγωγή
- Το Natural JOIN θα σας δώσει την ίδια ακριβή έξοδο με την έξοδο που λάβαμε από τα παραδείγματα INNER JOIN και JOIN USING. Επειδή στο παράδειγμά μας και τα τρία ερωτήματα είναι ισοδύναμα. Αλλά σε ορισμένες περιπτώσεις, η έξοδος θα είναι διαφορετική από την εσωτερική ένωση και έπειτα σε μια φυσική ένωση. Για παράδειγμα, εάν υπάρχουν περισσότεροι πίνακες με τα ίδια ονόματα, τότε η φυσική ένωση θα ταιριάζει με όλες τις στήλες μεταξύ τους. Ωστόσο, η εσωτερική ένωση θα ταιριάζει μόνο με τις στήλες στην κατάσταση σύνδεσης (περισσότερες λεπτομέρειες στην επόμενη ενότητα. Η διαφορά μεταξύ της εσωτερικής σύνδεσης και της φυσικής σύνδεσης).
SQLite ΑΡΙΣΤΕΡΑ ΕΓΓΡΑΦΗ
Το πρότυπο SQL ορίζει τρεις τύπους OUTER JOIN: LEFT, RIGHT και FULL, αλλά το SQLite υποστηρίζει μόνο το LEFT OUTER JOIN.
Στο LEFT OUTER JOIN, όλες οι τιμές των στηλών που επιλέγετε από τον αριστερό πίνακα θα συμπεριληφθούν στο αποτέλεσμα του ερωτήματος, οπότε ανεξάρτητα από την τιμή που ταιριάζει με την συνθήκη συνένωσης ή όχι, θα συμπεριληφθεί στο αποτέλεσμα.
Έτσι, εάν ο αριστερός πίνακας έχει σειρές «n», τα αποτελέσματα του ερωτήματος θα έχουν σειρές «n». Ωστόσο, για τις τιμές των στηλών που προέρχονται από τον σωστό πίνακα, εάν οποιαδήποτε τιμή δεν ταιριάζει με την συνθήκη συνένωσης, θα περιέχει μια τιμή "null".
Έτσι, θα λάβετε έναν αριθμό σειρών που αντιστοιχούν στον αριθμό των γραμμών στην αριστερή ένωση. Για να λάβετε τις αντίστοιχες σειρές και από τους δύο πίνακες (όπως τα αποτελέσματα ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ), καθώς και τις γραμμές που δεν ταιριάζουν από τον αριστερό πίνακα.
Παράδειγμα
Στο παρακάτω παράδειγμα, θα δοκιμάσουμε το "ΑΡΙΣΤΕΡΟ ΣΥΝΔΕΣΗ" για να ενώσουμε τα δύο τραπέζια "Φοιτητές" και "Τμήματα":
ΕΠΙΛΕΓΩΦοιτητές. Όνομα σπουδαστή,Τμήματα. Όνομα τμήματοςΑΠΟ Φοιτητές - αυτός είναι ο αριστερός πίνακαςΑΡΙΣΤΕΡΑ ΕΓΓΡΑΦΑ ΤΜΗΜΑΤΑ ΣΕ Φοιτητές.DepartmentId = Τμήματα.DepartmentId;
Εξήγηση
- Η σύνταξη LEFT JOIN είναι η ίδια με το INNER JOIN. γράφετε την ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ μεταξύ των δύο πινάκων και, στη συνέχεια, η συνθήκη συνένωσης έρχεται μετά τη ρήτρα ON.
- Ο πρώτος πίνακας μετά τον όρο από τον αριστερό πίνακα. Ενώ ο δεύτερος πίνακας που καθορίζεται μετά την αριστερή ένωση είναι ο σωστός πίνακας.
- Η ρήτρα OUTER είναι προαιρετική. LEFT OUTER JOIN είναι το ίδιο με το LEFT JOIN.
Παραγωγή
- Όπως μπορείτε να δείτε όλες οι σειρές από τον πίνακα μαθητών περιλαμβάνονται οι οποίοι είναι συνολικά 10 μαθητές. Ακόμα κι αν ο τέταρτος και ο τελευταίος μαθητής, η Τζένα και ο Τζωρτζ τμήμα δεν υπάρχουν στον πίνακα Τμημάτων, περιλαμβάνονται επίσης.
- Και σε αυτές τις περιπτώσεις, η τιμή departmentName τόσο για την Jena όσο και για τον George θα είναι "null", επειδή ο πίνακας τμημάτων δεν έχει departmentName που ταιριάζει με την τιμή departmentId.
Ας δώσουμε το προηγούμενο ερώτημα χρησιμοποιώντας τα αριστερά ενώστε μια βαθύτερη εξήγηση χρησιμοποιώντας τα διαγράμματα Van:
Το LEFT JOIN θα δώσει σε όλους τους μαθητές ονόματα από τον πίνακα μαθητών ακόμα και αν ο μαθητής έχει αναγνωριστικό τμήματος που δεν υπάρχει στον πίνακα τμημάτων. Έτσι, το ερώτημα δεν θα σας δώσει μόνο τις αντίστοιχες σειρές όπως το INNER JOIN, αλλά θα σας δώσει το επιπλέον μέρος που έχει τις γραμμές αντιστοίχισης από τον αριστερό πίνακα που είναι ο πίνακας μαθητών.
Σημειώστε ότι οποιοδήποτε όνομα μαθητή δεν έχει αντίστοιχο τμήμα θα έχει τιμή "null" για το όνομα τμήματος, επειδή δεν υπάρχει τιμή αντιστοίχισης για αυτό, και αυτές οι τιμές είναι οι τιμές στις γραμμές που δεν ταιριάζουν.
ΣΥΝΔΕΣΗ SQLite CROSS
Ένα CROSS JOIN δίνει το καρτεσιανό προϊόν για τις επιλεγμένες στήλες των δύο ενωμένων πινάκων, συνδυάζοντας όλες τις τιμές από τον πρώτο πίνακα με όλες τις τιμές από τον δεύτερο πίνακα.
Έτσι, για κάθε τιμή στον πρώτο πίνακα, θα λάβετε αντιστοιχίσεις «n» από τον δεύτερο πίνακα όπου n είναι ο αριθμός των σειρών δεύτερου πίνακα.
Σε αντίθεση με το INNER JOIN και το LEFT OUTER JOIN, με το 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 μεταξύ των πινάκων μαθητών και τμημάτων:
ΕΠΙΛΕΓΩΦοιτητές. Όνομα σπουδαστή,Τμήματα. Όνομα τμήματοςΑΠΟ ΦοιτητέςCROSS JOIN Τμήματα
Εξήγηση
- Στην επιλεγμένη ρήτρα, μόλις επιλέξαμε δύο στήλες "Όνομα μαθητή" από τον πίνακα μαθητών και το "Όνομα τμήματος" από τον πίνακα τμημάτων.
- Για το cross join, δεν καθορίσαμε καμία συνθήκη συνένωσης μόνο τα δύο τραπέζια σε συνδυασμό με CROSS JOIN στη μέση τους.
Παραγωγή:
Όπως μπορείτε να δείτε, το αποτέλεσμα είναι 40 σειρές. 10 τιμές από τον πίνακα μαθητών αντιστοιχίστηκαν με τα 4 τμήματα από τον πίνακα τμημάτων. Ως εξής:
- Τέσσερις τιμές για τα τέσσερα τμήματα από τον πίνακα τμημάτων ταιριάζουν με τον πρώτο μαθητή Michel.
- Τέσσερις τιμές για τα τέσσερα τμήματα από τον πίνακα τμημάτων ταιριάζουν με τον δεύτερο μαθητή John.
- Τέσσερις τιμές για τα τέσσερα τμήματα από τον πίνακα τμημάτων ταιριάζουν με τον τρίτο μαθητή Jack.
… και ούτω καθεξής.
Περίληψη
Χρησιμοποιώντας το SQLite JOIN, μπορείτε να συνδέσετε έναν ή περισσότερους πίνακες ή υποερωτήματα μαζί για να επιλέξετε στήλες και από τους δύο πίνακες ή υποερώματα.