Skip to content

Join trong SQL được giải thích

So sánh các kiểu JOIN trong SQL: inner, outer, cross, self, lateral, natural — mỗi kiểu trả về gì, kèm một ví dụ một dòng.

Join kết hợp các dòng từ hai bảng theo một khóa chung. Kiểu join quyết định dòng nào còn lại khi khóa khớp, không khớp hoặc lặp lại.

Bảng tham chiếu · 8 mục
8 of 8 rows
Inner và outer
Chỉ những dòng thỏa điều kiện ON ở cả hai bảng. Dòng không khớp ở bất kỳ phía nào bị loại bỏ.SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Mọi dòng từ bảng bên trái. Cột bên phải là NULL ở nơi không có giá trị khớp.SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Mọi dòng từ bảng bên phải. Cột bên trái là NULL ở nơi không có giá trị khớp.SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Mọi dòng từ cả hai bảng. Phía không khớp được điền bằng NULL.SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross và self
Tích Descartes. Mỗi dòng bên trái ghép với mỗi dòng bên phải. Không có mệnh đề ON.SELECT u.name, o.total FROM users u CROSS JOIN orders o;
Một bảng được join với chính nó qua alias. So sánh các dòng trong cùng một bảng.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;
Nâng cao
Truy vấn con trong FROM được tính cho mỗi dòng ngoài. Truy vấn con có thể tham chiếu cột của bảng ngoài.SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Join trên các cột trùng tên. Không có mệnh đề ON. Cẩn thận va chạm khóa ngoài ý muốn.SELECT u.name, o.total FROM users u NATURAL JOIN orders o;