Helaian Rujukan SQL Joins
Rujukan sql joins yang boleh dicari dan dicetak: inner, left, right, full, anti dan semi join, self join, ON vs WHERE dan LATERAL. Percuma.
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
Tiada entri sepadan dengan “:q”.
Mengenai Helaian Rujukan SQL Joins
Helaian rujukan sql joins ini melakukan satu perkara secara menyeluruh: ia menerangkan setiap cara untuk menggabungkan jadual. Lapan bahagian merangkumi jenis join asas, anti-join untuk baris tanpa padanan, semi-join untuk baris yang mempunyai padanan, self join, cross dan multi-table join, perangkap klasik ON berbanding WHERE, USING, NATURAL dan operasi set, serta LATERAL join berserta nota prestasi.
Join adalah tempat hasil SQL secara senyap tersasar: LEFT JOIN yang ditapis dalam klausa WHERE secara senyap bertukar menjadi INNER JOIN, dan NOT IN dengan NULL memulangkan tiada apa-apa. Perangkap itu mendapat barisnya sendiri di sini, bersebelahan corak yang betul untuk digunakan sebagai gantinya.
Seperti setiap helaian rujukan dalam kumpulan ini, ia percuma dan di sisi klien: tapis baris secara langsung dengan kotak carian, lompat antara bahagian dengan senarai kandungan yang melekat, salin sebarang penyataan dengan satu klik dan cetak halaman untuk rujukan di meja anda.
Cara menggunakan Helaian Rujukan SQL Joins
- Buka helaian itu dan semak bahagiannya, dari Basic join types hingga LATERAL & performance.
- Cari kata kunci seperti LEFT JOIN, EXISTS atau NOT IN untuk menapis setiap baris secara langsung.
- Baca bahagian ON vs WHERE sebelum mengesan pepijat pada LEFT JOIN yang memulangkan terlalu sedikit baris.
- Klik sesuatu penyataan atau ikon salinnya untuk menyalin SQL itu ke papan keratan anda.
- Gunakan Print untuk salinan bercetak bagi keseluruhan rujukan joins.