Γραφική αναπαράσταση των SQL join

05 Οκτ 2011 | Web Development

Δεν επιτρέπονται τα σχόλια.


Πολλές φορές χρειάζεται να εκτελέσουμε ερωτήματα στην SQL για να πάρουμε τα αποτελέσματα από δυο ή/και περισσότερα. Ο ποιο απλός τρόπος είναι τρέξουμε μια SELECT που θα χρησιμοποιεί περισσότερους από ένα πίνακες. Αλλά τι πραγματικά συμβαίνει όταν θέλουμε ποιο πολύπλοκα ερωτήματα με ποιο κατανοητά ερωτήματα;

Στο σημερινό άρθρο θα προσπαθήσω να σας παρουσιάσω με γραφικά τη χρήση των εντολών JOIN της SQL. Οι JOIN είναι πολύ ισχυρές και επιτρέπουν να διαλέξετε δεδομένα ανάλογα με τις ανάγκες σας, εύκολα, γρήγορα και με καθαρό κώδικα.

Για το παράδειγμα μας θα υποθέσουμε πως έχουμε δυο πίνακες. Ο ένας πίνακας έχει μέσα τα ονόματα κατηγοριών και ονομάζεται categories και ο άλλος έχει προϊόντα που ανήκουν σε κατηγορίες και ονομάζεται products. Οι πίνακες έχουν επίσης και δεδομένα και τα δεδομένα τους είναι τα ακόλουθα :

categories                           products
-------------------------------      ------------------------------------------
| ID | CATEGORY               |      | ID | CATEGORY        | PRODUCT         |
-------------------------------      ------------------------------------------
| 1  | CPU                    |      | 1  | CPU             | 2 GHz           |
| 2  | MOUSE                  |      | 2  | HD              | 2 TB            |
| 3  | HD                     |      | 3  | External HD     | 1 TB            |
| 4  | MONITOR                |      | 4  | MONITOR         | 24" Monitor     |
| 5  | MODEM                  |      | 5  | CPU             | 1 GHz           |
| 6  | RAM                    |      | 1  | CPU             | 3 GHz           |
-------------------------------      ------------------------------------------

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

Inner Join

Η Inner Join παράγει αποτελέσματα που οι κατηγορία υπάρχει τόσο στον πίνακα categories όσο και στον πίνακα products. Το παρακάτω ερώτημα θα έχει τα αποτελέσματα που ακολουθούν.

    SELECT * FROM categories INNER JOIN products ON categories.caregory = products.category

τα αποτελέσματα είναι αυτά :

-----------------------------------------------------------------------------
| ID | CATEGORY           | ID | CATEGORY           | PRODUCT               |
-----------------------------------------------------------------------------
| 1  | CPU                | 1  | CPU                | 2 GHz                 |
| 3  | HD                 | 2  | HD                 | 2 TB                  |
| 4  | MONITOR            | 4  | MONITOR            | 24" Monitor           |
| 1  | CPU                | 5  | CPU                | 1 GHz                 |
| 1  | CPU                | 6  | CPU                | 3 GHz                 |
-----------------------------------------------------------------------------

και η εικονική αναπαράσταση είναι η ακόλουθη :

Inner Join

 

Full Outer Join

Η Full Outer Join παράγει αποτελέσματα με τις κατηγορίες που υπάρχουν και στους δυο πίνακες. Αν για μια κατηγορία δεν υπάρχουν εγγραφές στον δεύτερο πίνακα, τότε οι αντίστοιχες γραμμές του άλλου πίνακα συμπληρώνονται με null. Το ερώτημα που ακολουθεί θα έχει τα αποτελέσματα που είναι αμέσως μετά.

    SELECT * FROM categories FULL OUTER JOIN products ON categories.caregory = products.category

τα αποτελέσματα είναι αυτά :

----------------------------------------------------------------------------
| ID   | CATEGORY           | ID   | CATEGORY         | PRODUCT            |
----------------------------------------------------------------------------
| 1    | CPU                | 1    | CPU              | 2 GHz              |
| 1    | CPU                | 5    | CPU              | 1 GHz              |
| 1    | CPU                | 6    | CPU              | 3 GHz              |
| 2    | MOUSE              | null | null             | null               |
| 3    | HD                 | 2    | HD               | 2 TB               |
| 4    | MONITOR            | 4    | MONITOR          | 24" MONITOR        |
| 5    | MODEM              | null | null             | null               |
| 6    | RAM                | null | null             | null               |
| null | null               | 3    | External HD      | 1 TB               |
----------------------------------------------------------------------------

και η εικονική αναπαράσταση είναι η ακόλουθη :

Full Outer Join

Left Outer Join

Η Left Outer Join παράγει σαν αποτέλεσμα το σύνολο των γραμμών από τον πίνακα categories σε αντιστοιχία με τις γραμμές του πίνακα products. Θα πρέπει να σημειωθεί πως οι εγγραφές του πίνακα categories που δεν έχουν αντίστοιχες εγγραφές στον πίνακα products θα ανακτηθούν και στης αντίστοιχες εγγραφές του πίνακα products θα δημιουργήσει τα πεδία με τιμές null. Το ερώτημα που ακολουθεί θα δημιουργήσει τα αποτελέσματα που είναι μετά το ερώτημα.

    SELECT * FROM categories LEFT OUTER JOIN products ON categories.caregory = products.category

Τα αποτελέσματα είναι αυτά :

----------------------------------------------------------------------------
| ID   | CATEGORY           | ID   | CATEGORY         | PRODUCT            |
----------------------------------------------------------------------------
| 1    | CPU                | 1    | CPU              | 2 GHz              |
| 1    | CPU                | 5    | CPU              | 1 GHz              |
| 1    | CPU                | 6    | CPU              | 3 GHz              |
| 2    | MOUSE              | null | null             | null               |
| 3    | HD                 | 2    | HD               | 2 TB               |
| 4    | MONITOR            | 4    | MONITOR          | 24" MONITOR        |
| 5    | MODEM              | null | null             | null               |
| 6    | RAM                | null | null             | null               |
----------------------------------------------------------------------------

και η εικονική αναπαράσταση είναι η ακόλουθη :

Left Outer Join

Αν θέλετε να έχετε το σύνολο των αποτελεσμάτων που υπάρχουν στον πίνακα categories αλλά δεν έχουν αντίστοιχες εγγραφές στον πίνακα products μπορούμε να εκτελέσουμε το ίδιο ερώτημα με Left Outer Join αλλά χρησιμοποιείστε και το WHERE για να επιλέξετε μόνο τις εγγραφές του πίνακα products που θέλετε εσείς. Έτσι έχουνε το ακόλουθο ερώτημα που παράγει τις εγγραφές που θα βρείτε παρακάτω:

    SELECT * FROM categories LEFT OUTER JOIN products ON categories.caregory = products.category WHERE products.id IS NULL

Τα αποτελέσματα είναι αυτά :

----------------------------------------------------------------------------
| ID   | CATEGORY           | ID   | CATEGORY         | PRODUCT            |
----------------------------------------------------------------------------
| 2    | MOUSE              | null | null             | null               |
| 5    | MODEM              | null | null             | null               |
| 6    | RAM                | null | null             | null               |
----------------------------------------------------------------------------

και η εικονική αναπαράσταση είναι η ακόλουθη :

Left Outer Join Where

Τέλος αν θέλετε να επιλέξετε μόνο τις εγγραφές από τους δυο πίνακες που δεν έχουν την αντίστοιχη εγγραφή στον άλλο πίνακα τότε μπορείτε να επεκτείνεται τα ορίσματα της WHERE. Το παρακάτω ερώτημα θα ανακτήσει τις εγγραφές και από τους δυο πίνακες που δεν έχουν αντίστοιχη εγγραφή στον άλλο πίνακα.

    SELECT * FROM categories FULL OUTER JOIN products ON categories.caregory = products.category WHERE products.id IS NULL OR category.id IS NULL
----------------------------------------------------------------------------
| ID   | CATEGORY           | ID   | CATEGORY         | PRODUCT            |
----------------------------------------------------------------------------
| 2    | MOUSE              | null | null             | null               |
| 5    | MODEM              | null | null             | null               |
| 6    | RAM                | null | null             | null               |
| null | null               | 3    | External HD      | 1 TB               |
----------------------------------------------------------------------------

και η εικονική αναπαράσταση είναι η ακόλουθη :

Full Outer Join Where

Περισσότερα για τον CorfuGmr

CorfuGmr

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








Σχόλια



24 Οκτωβρίου 2011

Μια ερώτηση θα’θελα να κάνω.Το left join είναι ίδιο με το LEFT OUTER JOIN ? Έχει κάποια διαφορά?


Συγνώμη, τα σχόλια για αυτό το άρθρο είναι κλειστά.



^
Top
css.php