SQL – JOINs
Όταν πρέπει να επιλέξουμε δεδομένα από δύο πίνακες σε μια βάση δεδομένων για να δημιουργήσουμε ένα πιο σύνθετο αποτέλεσμα, θα πρέπει να κάνουμε μια συνένωση / σύνδεση (join) μεταξύ τους. [ms_alert icon=”fa-info” box_shadow=”no” dismissable=”no” class=”” id=””]Μια SQL JOIN συνένωση χρησιμοποιείται για να συνδυάσει σειρές από δύο ή περισσότερους πίνακες, με βάση ΕΝΑ ΚΟΙΝΟ ΠΕΔΙΟ μεταξύ τους.[/ms_alert]
Ο πιο κοινός τύπος ένωσης είναι η SQL INNER JOIN (απλή εσωτερική συνένωση / σύνδεση). Μια SQL INNER JOIN σύνδεση, επιστρέφει όλες τις γραμμές από διάφορους πίνακες, όπου φυσικά ικανοποιείται ΚΑΠΟΙΑ ΣΥΝΘΗΚΗ συνένωσης. Οι πίνακες μιας βάσης δεδομένων μπορούν να συσχετιστούν μεταξύ τους με κλειδιά (keys).
[ms_alert icon=”fa-info” box_shadow=”no” dismissable=”no” class=”” id=””]Ένα πρωτεύον κλειδί (primary key) είναι μια στήλη με μια ΜΟΝΑΔΙΚΗ τιμή στην κάθε γραμμή.[/ms_alert]
Σκοπός είναι να ενωθούν τα δεδομένα μαζί από διάφορους πίνακες, χωρίς να έχουμε επανάληψη όλων των δεδομένων σε κάθε πίνακα.
Υπάρχουν οι εξής διαφορετικές συνενώσεις SQL JOINs που μπορείτε να χρησιμοποιήσετε:
- INNER JOIN: Επιστρέφει όλες τις γραμμές των πινάκων όπου υπάρχει το κοινό γνώρισμα συνένωσης (εγγραφή) ΚΑΙ στους δύο πίνακες.
- ——————–
- OUTER JOINs:
- ——————–
- LEFT (OUTER) JOIN: Επιστρέφει όλες τις γραμμές από τον αριστερό πίνακα και τις σχετικές εγγραφές από τον δεξί πίνακα του γνωρίσματος συνένωσης.
- ——————–
- RIGHT (OUTER) JOIN: Επιστρέφει όλες τις γραμμές από τον δεξί πίνακα και τις σχετικές εγγραφές από τον αριστερό πίνακα του γνωρίσματος συνένωσης.
- ——————–
- FULL (OUTER) JOIN: Επιστρέφει όλες τις γραμμές των πινάκων αρκεί να υπάρχει τουλάχιστον το γνώρισμα συνένωσης σε ΕΝΑΝ από τους πίνακες.
Σημείωση: Τα INNER και OUTER λεκτικά μπορούν και να μην χρησιμοποιηθούν κατά την δημιουργία ερωτημάτων τα οποία και υπονοούνται.
SQL – JOINs – κατανόηση με παράδειγμα δύο πινάκων
Έστω οι παρακάτω δύο πίνακες. Ο αριστερός πίνακας έχει μέσα κατηγορίες και ονομάζεται categories και ο δεξί πίνακας έχει προϊόντα που ανήκουν σε κατηγορίες και ονομάζεται products:
Εκτελούμε τα παρακάτω ερωτήματα:
Inner Join:
SELECT * FROM categories INNER JOIN products ON categories.caregory = products.category
Το αποτέλεσμα είναι:
Left (Outer) Join:
SELECT * FROM categories LEFT OUTER JOIN products ON categories.caregory = products.category
Το αποτέλεσμα είναι:
Η Left Outer Join συνένωση παράγει σαν αποτέλεσμα το σύνολο των γραμμών από τον πίνακα categories σε αντιστοιχία με τις γραμμές του πίνακα products. Οι εγγραφές του πίνακα categories που δεν έχουν αντίστοιχες εγγραφές στον πίνακα products θα ανακτηθούν και στις αντίστοιχες εγγραφές του πίνακα products θα δημιουργήσει τα πεδία με τιμές NULL. Ανάλογο είναι και το Right (Outer) Join.
Full (Outer) Join:
SELECT * FROM categories FULL OUTER JOIN products ON categories.caregory = products.category
Το αποτέλεσμα είναι:
Η Full Outer Join συνένωση, παράγει αποτελέσματα με τις κατηγορίες που υπάρχουν και στους δυο πίνακες. Αν για μια κατηγορία δεν υπάρχουν εγγραφές στον δεύτερο πίνακα, τότε οι αντίστοιχες γραμμές του άλλου πίνακα συμπληρώνονται με NULL.