FREE

PostgreSQL Unit 11 - USING and NATURAL JOIN

Στο σημερινό δωρεάν μάθημα SQL θα δούμε πως μπορούμε να γράψουμε λιγότερες γραμμές κώδικα SQL χρησιμοποιώντας το USING και το NATURAL JOIN.

Πριν ξεκινήσουμε, ας θυμηθούμε λίγο ένα από τα query που είχαμε γράψει σε προηγούμενη ενότητα.

Δωρεάν Μαθήματα και Σεμινάρια SQL και PostgreSQL

Με το συγκεκριμένο query ζητούσαμε να δούμε τους πελάτες που έχουν ήδη πραγματοποιήσει κάποια παραγγελία. Αν δηλαδή υπάρχει ένα customer_id στον πίνακα orders με την ίδια τιμή που έχει και το customer_id στον πίνακα customers τότε σημαίνει ότι έχει γίνει κάποια παραγγελία.

Επειδή και ο πίνακας customers όσο και ο πίνακας orders έχουν μια στήλη με το ίδιο ακριβώς όνομα (customer_id) θα μπορούσαμε να αντικαταστήσουμε την γραμμή ON orders.customer_id = customers.customers_id με λιγότερο κώδικα. Σε αυτό θα μας βοηθήσει η εντολή USING. Η συγκεκριμένη εντολή απλά περιμένει να προσδιορίσουμε το όνομα της κοινής στήλης (που ήδη υπάρχει και στους δύο πίνακες) που θα χρησιμοποιηθεί στην σύγκριση. Δεν χρειάζεται να ορίσουμε την ισότητα γιατί αυτή εννοείται αυτόματα. Οπότε το query μπορεί να αλλάξει ως εξής:

Δωρεάν Μαθήματα και Σεμινάρια SQL και PostgreSQL

Το παραπάνω query είναι πολύ πιο σύντομο συντακτικά από το INNER JOIN που είχαμε γράψει αρχικά. Υπάρχει όμως και ένας συντομότερος τρόπος που ονομάζεται NATURAL. Η χρήση του NATURAL στηρίζεται στις σχέσεις που υπάρχουν ήδη ανάμεσα στους πίνακες. Δηλαδή όταν ένας πίνακας για παράδειγμα χρησιμοποιεί την στήλη ενός άλλου σαν foreign key. Επειδή λοιπόν η βάση θα ανακαλύψει τις σχέσεις των πινάκων και τις κοινές στήλες ανάμεσα τους αυτόματα, τότε δεν χρειάζεται να ορίσουμε εμείς το όνομα της στήλης.

Η γενική σύνταξη ενός NATURAL JOIN είναι η εξής:

FROM table1

NATURAL JOIN table2

Ας δούμε τώρα πως θα μπορούσαμε να τροποποιήσουμε το προηγούμενο query κάνοντας χρήση του NATURAL JOIN.

Δωρεάν Μαθήματα και Σεμινάρια SQL και PostgreSQL

Το αποτέλεσμα για άλλη μια φορά είναι το ίδιο. Αν και το NATURAL JOIN κάποιες φορές φαίνεται να είναι ο ιδανικός τρόπος για να γράψουμε τα query μας, είναι λίγο επικίνδυνο. Ο λόγος είναι ότι ψάχνει να βρει όλες τις κοινές στήλες ανάμεσα σε δύο πίνακες. Στο προηγούμενο παράδειγμα γνωρίζαμε ήδη ότι ο πίνακας customers και orders έχουν μόνο μια κοινή στήλη γιατί μέσα από το γραφικό περιβάλλον της PostgreSQL είχαμε δει τις στήλες από τις οποίες αποτελούνται οι συγκεκριμένοι πίνακες. Όμως αν δεν κάνουμε αυτή την ανάλυση, και υπάρχουν περισσότερες από μια κοινή στήλη ανάμεσα στους πίνακες τότε το αποτέλεσμα θα είναι εντελώς λάθος γιατί το NATURAL JOIN θα χρησιμοποιήσει όλες τις κοινές στήλες για να παράγει το αποτέλεσμα.

Για παράδειγμα ας δούμε την σχέση ανάμεσα στους πίνακες products και order_details.

Δωρεάν Μαθήματα και Σεμινάρια SQL και PostgreSQL

Με μια γρήγορη ματιά στην δομή των πινάκων, θα ανακαλύψουμε ότι υπάρχουν δύο κοινές στήλες ανάμεσα στους δύο αυτούς πίνακες: η product_id και η unit_price. Το NATURAL JOIN λοιπόν δεν είναι σωστή επιλογή εδώ γιατί το αποτέλεσμα θα είναι λάθος. Για να πάρουμε το επιθυμητό αποτέλεσμα θα πρέπει να χρησιμοποιήσουμε είτε USING για να ορίσουμε συγκεκριμένα την στήλη που θα χρησιμοποιηθεί ή το τυπικό JOIN ON όπως το έχουμε δει.

Ας υποστηρίξουμε όμως την θεωρία μας με ένα παράδειγμα. Μπορούμε να τρέξουμε αρχικά ένα NATURAL JOIN query στους δύο αυτούς πίνακες με το count( ) να ζητήσουμε να δούμε τον αριθμό των αποτελεσμάτων.

Δωρεάν Μαθήματα και Σεμινάρια SQL και PostgreSQL

Ο αριθμός είναι το αποτέλεσμα από την σύγκριση των μοναδικών συνδυασμών όλων των customer_id και όλων των unit_price ανάμεσα στους δύο πίνακες. Αν όμως χρησιμοποιήσουμε το JOIN θα ανακαλύψουμε ότι ο πραγματικός αριθμός είναι αρκετά μεγαλύτερος.

Δωρεάν Μαθήματα και Σεμινάρια SQL και PostgreSQL

Προσοχή λοιπόν με την χρήση του NATURAL JOIN. Πάνω από όλα όμως θα ήταν φρόνιμο και λογικό να έχετε μια προσωπική άποψη για την δομή των πινάκων και τις σχέσεις ανάμεσα τους πριν γράψετε κάποιο query.