Skip to content

การ JOIN ใน SQL อธิบาย

เปรียบเทียบประเภท JOIN ของ SQL: inner, outer, cross, self, lateral, natural — แต่ละแบบคืนค่าอะไร พร้อมตัวอย่างหนึ่งบรรทัด

การ JOIN รวมแถวจากสองตารางเข้าด้วยกันด้วยคีย์ที่ใช้ร่วมกัน ประเภทของ join จะกำหนดว่าแถวใดจะอยู่รอดเมื่อคีย์ตรงกัน ไม่ตรงกัน หรือซ้ำกัน

ตารางอ้างอิง · 8 รายการ
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;
ทุกแถวจากทั้งสองตาราง ฝั่งที่ไม่ตรงกันจะถูกเติมด้วย NULLSELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross และ self
ผลคูณคาร์ทีเซียน ทุกแถวฝั่งซ้ายจับคู่กับทุกแถวฝั่งขวา ไม่มีเงื่อนไข ONSELECT u.name, o.total FROM users u CROSS JOIN orders o;
ตารางถูก join กับตัวเองผ่าน 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;
join บนคอลัมน์ที่มีชื่อเหมือนกัน ไม่มีเงื่อนไข ON ระวังการชนกันของคีย์ที่ไม่ได้ตั้งใจSELECT u.name, o.total FROM users u NATURAL JOIN orders o;