Συνοπτικός οδηγός SQL Joins
Μια αναζητήσιμη, εκτυπώσιμη αναφορά SQL joins: inner, left, right, full, anti και semi joins, self joins, ON vs WHERE και LATERAL. Δωρεάν.
Basic join types
9SELECT * FROM a INNER JOIN b ON a.id = b.a_id;
SELECT * FROM a LEFT JOIN b ON a.id = b.a_id;
SELECT * FROM a RIGHT JOIN b ON a.id = b.a_id;
SELECT * FROM a FULL OUTER JOIN b ON a.id = b.a_id;
JOIN = INNER JOIN
LEFT OUTER JOIN = LEFT JOIN
LEFT JOIN ... UNION ... RIGHT JOIN ...
ON a.id = b.a_id AND a.type = b.type
ON a.qty BETWEEN p.min_qty AND p.max_qty
Anti-joins (no match)
8LEFT JOIN b ON a.id = b.a_id WHERE b.a_id IS NULL
WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)
WHERE a.id NOT IN (SELECT a_id FROM b)
WHERE a.id NOT IN (SELECT a_id FROM b WHERE a_id IS NOT NULL)
RIGHT JOIN a ... WHERE a.id IS NULL
SELECT id FROM a EXCEPT SELECT a_id FROM b;
users without orders = LEFT JOIN + IS NULL
Prefer NOT EXISTS over NOT IN
Semi-joins (has a match)
8WHERE EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)
WHERE a.id IN (SELECT a_id FROM b)
JOIN b ... GROUP BY a.id
SELECT DISTINCT a.* FROM a JOIN b ON ...
EXISTS stops at the first match
EXISTS (SELECT 1 ...) vs (SELECT * ...)
IN: uncorrelated / EXISTS: correlated
users WITH orders = EXISTS subquery
Self joins
8FROM emp e JOIN emp m ON e.manager_id = m.id
FROM emp e LEFT JOIN emp m ON e.manager_id = m.id
SELECT e.name, m.name AS manager FROM ...
ON a.id < b.id
ON a.id <> b.id
ON b.day = a.day + INTERVAL 1 DAY
ON a.city = b.city AND a.id <> b.id
WITH RECURSIVE tree AS (... UNION ALL ...)
Cross & multi-table joins
8SELECT * FROM sizes CROSS JOIN colors;
FROM sizes, colors
FROM users u JOIN orders o ON ... JOIN items i ON ...
JOIN dates d CROSS JOIN users u LEFT JOIN ...
u LEFT JOIN o ON ... LEFT JOIN i ON i.o_id = o.id
u LEFT JOIN o ... INNER JOIN i ON i.o_id = o.id
FROM a JOIN (b LEFT JOIN c ON ...) ON ...
Written order is logical, not execution order
ON vs WHERE (the gotcha)
8LEFT JOIN b ON a.id = b.a_id AND b.status = 1
LEFT JOIN b ON a.id = b.a_id WHERE b.status = 1
WHERE b.a_id IS NULL OR b.status = 1
LEFT JOIN b ON ... AND a.type = 'x'
WHERE a.type = 'x'
INNER JOIN: ON and WHERE are equivalent
COALESCE(b.total, 0)
COUNT(b.id) vs COUNT(*)
USING, NATURAL & set ops
9JOIN b USING (user_id)
USING outputs ONE shared column
NATURAL JOIN b
Avoid NATURAL JOIN in production
SELECT ... UNION SELECT ...
UNION ALL
JOIN adds columns, UNION adds rows
INTERSECT
UNION needs same column count and types
LATERAL & performance
9CROSS JOIN LATERAL (SELECT ... WHERE b.a_id = a.id LIMIT 3) t
LEFT JOIN LATERAL (...) t ON TRUE
CROSS APPLY / OUTER APPLY
LATERAL sees columns of preceding tables
CREATE INDEX idx ON orders (user_id);
EXPLAIN SELECT ...;
Filter early: join the smallest set first
ON DATE(a.created_at) = b.day
Join on same-type, same-collation columns
Καμία καταχώριση δεν ταιριάζει με «:q».
Σχετικά με το Συνοπτικός οδηγός SQL Joins
Αυτό το cheat sheet των SQL joins κάνει ένα πράγμα διεξοδικά: εξηγεί κάθε τρόπο συνδυασμού πινάκων. Οκτώ ενότητες καλύπτουν τους βασικούς τύπους join, τα anti-joins για γραμμές χωρίς αντιστοιχία, τα semi-joins για γραμμές που έχουν αντιστοιχία, τα self joins, τα cross και multi-table joins, την κλασική παγίδα ON έναντι WHERE, το USING, το NATURAL και τις πράξεις συνόλων, και τα LATERAL joins με σημειώσεις απόδοσης.
Τα joins είναι εκεί όπου τα αποτελέσματα SQL πηγαίνουν σιωπηλά στραβά: ένα LEFT JOIN που φιλτράρεται στην πρόταση WHERE γίνεται σιωπηλά ένα INNER JOIN, και το NOT IN με ένα NULL δεν επιστρέφει τίποτα. Αυτές οι παγίδες έχουν τη δική τους γραμμή εδώ, δίπλα στο σωστό μοτίβο που πρέπει να χρησιμοποιήσετε αντ' αυτού.
Όπως κάθε cheat sheet σε αυτή την ομάδα, είναι δωρεάν και λειτουργεί στην πλευρά του πελάτη: φιλτράρετε γραμμές ζωντανά με το πλαίσιο αναζήτησης, μετακινηθείτε μεταξύ ενοτήτων με τον σταθερό πίνακα περιεχομένων, αντιγράψτε οποιαδήποτε δήλωση με ένα κλικ και εκτυπώστε τη σελίδα για αναφορά στο γραφείο σας.
Πώς να χρησιμοποιήσετε το Συνοπτικός οδηγός SQL Joins
- Ανοίξτε το φύλλο και εξετάστε τις ενότητες, από τους Βασικούς τύπους join έως το LATERAL & απόδοση.
- Αναζητήστε μια λέξη-κλειδί όπως LEFT JOIN, EXISTS ή NOT IN για να φιλτράρετε κάθε γραμμή ζωντανά.
- Διαβάστε την ενότητα ON vs WHERE πριν κάνετε debug σε ένα LEFT JOIN που επιστρέφει πολύ λίγες γραμμές.
- Κάντε κλικ σε μια δήλωση ή στο εικονίδιο αντιγραφής της για να αντιγράψετε το SQL στο πρόχειρό σας.
- Χρησιμοποιήστε το Εκτύπωση για ένα χάρτινο αντίγραφο της πλήρους αναφοράς joins.