ชีตสรุป 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
SQL joins cheat sheet นี้ทำสิ่งเดียวอย่างละเอียด คืออธิบายทุกวิธีในการรวมตาราง แปดส่วนครอบคลุมประเภท join พื้นฐาน, anti-join สำหรับแถวที่ไม่มีคู่, semi-join สำหรับแถวที่มีคู่, self join, cross join และ join หลายตาราง, ข้อผิดพลาดคลาสสิกของ ON เทียบกับ WHERE, USING, NATURAL และ set operations และ LATERAL join พร้อมหมายเหตุด้านประสิทธิภาพ
join คือจุดที่ผลลัพธ์ SQL ผิดโดยไม่รู้ตัว: LEFT JOIN ที่กรองในส่วน WHERE จะกลายเป็น INNER JOIN แบบเงียบๆ และ NOT IN ที่มี NULL จะไม่คืนค่าอะไรเลย กับดักเหล่านี้มีแถวของตัวเองที่นี่ พร้อมรูปแบบที่ถูกต้องที่ควรใช้แทน
เช่นเดียวกับ cheat sheet ทุกชุดในกลุ่มนี้ ใช้ฟรีและทำงานฝั่งไคลเอนต์: กรองแถวแบบเรียลไทม์ด้วยช่องค้นหา ข้ามระหว่างส่วนต่างๆ ด้วยสารบัญที่ติดอยู่ คัดลอกคำสั่งด้วยคลิกเดียว และพิมพ์หน้านี้ไว้อ้างอิงบนโต๊ะทำงาน
วิธีใช้ ชีตสรุป SQL Joins
- เปิดชีตและดูแต่ละส่วน ตั้งแต่ Basic join types ไปจนถึง LATERAL & performance
- ค้นหาด้วยคำสำคัญ เช่น LEFT JOIN, EXISTS หรือ NOT IN เพื่อกรองทุกแถวแบบเรียลไทม์
- อ่านส่วน ON vs WHERE ก่อนดีบัก LEFT JOIN ที่คืนแถวน้อยเกินไป
- คลิกที่คำสั่งหรือไอคอนคัดลอกเพื่อคัดลอก SQL ไปยังคลิปบอร์ด
- ใช้ Print เพื่อพิมพ์เอกสารอ้างอิง joins ฉบับเต็มลงกระดาษ