Σύγκριση των τύπων JOIN της SQL: inner, outer, cross, self, lateral, natural — τι επιστρέφει ο καθένας, με παράδειγμα μίας γραμμής.
Τα joins συνδυάζουν γραμμές από δύο πίνακες μέσω κοινού κλειδιού. Ο τύπος του join καθορίζει ποιες γραμμές επιβιώνουν όταν τα κλειδιά ταιριάζουν, λείπουν ή επαναλαμβάνονται.
Πίνακας αναφοράς · 8 καταχωρήσεις
Joins SQLExplained
8 of 8 rows
Inner και outer
Μόνο γραμμές όπου η συνθήκη ON ταιριάζει και στους δύο πίνακες. Οι γραμμές χωρίς ταίριασμα σε οποιαδήποτε πλευρά απορρίπτονται.
SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Όλες οι γραμμές του αριστερού πίνακα. Οι στήλες του δεξιού είναι NULL όπου δεν υπάρχει ταίριασμα.
SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Όλες οι γραμμές του δεξιού πίνακα. Οι στήλες του αριστερού είναι NULL όπου δεν υπάρχει ταίριασμα.
SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Όλες οι γραμμές και από τους δύο πίνακες. Οι πλευρές χωρίς ταίριασμα συμπληρώνονται με NULL.
SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross και self
Καρτεσιανό γινόμενο. Κάθε αριστερή γραμμή ζευγαρώνει με κάθε δεξιά. Χωρίς όρο ON.
SELECT u.name, o.total FROM users u CROSS JOIN orders o;
Ένας πίνακας ενώνεται με τον εαυτό του μέσω alias. Συγκρίνει γραμμές μέσα σε έναν πίνακα.
SELECT a.id AS o1, b.id AS o2 FROM orders a JOIN orders b ON a.user_id = b.user_id WHERE a.id < b.id;
Για προχωρημένους
Υποερώτημα στο FROM που αποτιμάται ανά εξωτερική γραμμή. Μπορεί να αναφέρεται στις στήλες του εξωτερικού πίνακα.
SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Ενώνει μέσω στηλών με κοινό όνομα. Χωρίς όρο ON. Προσοχή στις ανεπιθύμητες συγκρούσεις κλειδιών.
SELECT u.name, o.total FROM users u NATURAL JOIN orders o;