JuniorKỹ thuậtSQL
Giải thích INNER, LEFT và FULL OUTER JOIN
Thử trả lời trước
Đáp án mẫu
Join kết hợp các dòng của hai bảng dựa trên một điều kiện. Kiểu join quyết định cách xử lý các dòng không có cặp khớp.
- INNER JOIN chỉ trả về các dòng khớp ở cả hai phía.
- LEFT JOIN trả về mọi dòng của bảng bên trái. Khi bên phải không khớp, các cột của nó là NULL.
- FULL OUTER JOIN trả về mọi dòng của cả hai bảng, ghép nếu có thể và điền NULL nếu không.
-- khách hàng kèm đơn hàng; khách chưa có đơn sẽ hiện NULL
SELECT c.name, o.id AS order_id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- khách hàng chưa từng đặt hàng
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;
Điều kiện lọc trên bảng bên phải trong mệnh đề WHERE có thể biến LEFT JOIN thành INNER JOIN, nên hãy đặt các điều kiện đó trong ON. Một số hệ quản trị như MySQL không hỗ trợ trực tiếp FULL OUTER JOIN.
Ý chính
- INNER chỉ giữ các dòng khớp
- LEFT giữ mọi dòng bên trái và điền NULL cho cột bên phải bị thiếu
- FULL OUTER giữ mọi dòng của cả hai phía
- LEFT JOIN cộng WHERE right.id IS NULL tìm các dòng không có cặp khớp
Câu hỏi nối tiếp thường gặp
- Đặt điều kiện trong ON và trong WHERE khác nhau thế nào?
- Điều gì xảy ra nếu khoá join không duy nhất ở một phía?
Lỗi thường gặp
- Lọc bảng bên phải trong WHERE và vô tình biến LEFT thành INNER
- Dòng nhân đôi từ join một-nhiều làm sai các phép tổng hợp