INNER JOIN
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 5.Tóm tắt
Danh sách đơn hàng chỉ có customer_id, nhưng nhân viên cần thấy tên khách.
Tên nằm ở bảng customers. JOIN ghép hai bảng lại trong một câu truy vấn
dựa trên khoá ngoại.
Khái niệm
🤝 INNER JOIN: ghép dòng của hai bảng theo một điều kiện, chỉ giữ những cặp dòng khớp nhau.
🏷️ Bí danh bảng (table alias): tên ngắn đặt cho bảng trong câu truy vấn, ví dụ orders o, để viết o.status thay vì orders.status.
Ví dụ
SELECT o.order_id, c.name, o.status
FROM orders o
JOIN customers c ON c.customer_id = o.customer_id
ORDER BY o.order_id;JOINlà viết tắt củaINNER JOIN.ON c.customer_id = o.customer_id: ghép mỗi đơn với đúng khách của nó.ovàclà bí danh. Hai bảng có cột trùng tên thì bắt buộc ghi rõ cột của bảng nào.- Muốn nối thêm bảng thứ ba thì viết thêm một
JOIN ... ON ....
Mỗi đơn được ghép với đúng một khách, còn Dũng không khớp đơn nào nên không có trong kết quả:
Thử ngay
Đơn số 3 gồm những sản phẩm nào? Tên sản phẩm nằm ở products, số lượng nằm
ở order_lines:
SELECT p.name, l.quantity
FROM order_lines l
JOIN products p ON p.product_id = l.product_id
WHERE l.order_id = 3
ORDER BY p.name;Đoán trước khi chạy: kết quả có mấy dòng?
Xem kết quả
| NAME | QUANTITY |
|---|---|
| Bút bi | 3 |
| Thước | 2 |
Hai dòng, vì đơn 3 có hai dòng hàng. Mỗi dòng hàng được ghép với đúng sản
phẩm có cùng product_id.
Lỗi hay gặp
Dùng AS cho bí danh bảng. Oracle cho viết AS trước bí danh cột,
nhưng không cho viết trước bí danh bảng, nên câu dưới báo lỗi cú pháp.
-- SAI — lỗi: Oracle không nhận AS trước bí danh bảng
SELECT o.order_id FROM orders AS o;-- ĐÚNG
SELECT o.order_id FROM orders o;Liệt kê hai bảng mà quên điều kiện nối. Câu lệnh không báo lỗi, nhưng mỗi đơn bị ghép với mọi khách: 4 đơn × 4 khách thành 16 dòng vô nghĩa.
-- SAI — 16 dòng, ghép tất cả với tất cả
SELECT o.order_id, c.name
FROM orders o, customers c;Luôn viết JOIN ... ON để điều kiện nối nằm ngay cạnh bảng được nối.
-- ĐÚNG — 4 dòng, mỗi đơn đi với đúng khách của nó
SELECT o.order_id, c.name
FROM orders o
JOIN customers c ON c.customer_id = o.customer_id;Tóm tắt
JOIN bảng ON điều_kiệnghép dòng của hai bảng, chỉ giữ cặp khớp nhau.- Điều kiện nối thường là khoá ngoại bằng khoá chính.
- Đặt bí danh ngắn cho bảng. Oracle không cho viết
AStrước bí danh bảng. - Thiếu điều kiện nối thì mọi dòng ghép với mọi dòng.
Tự kiểm tra
0/3 câuMuốn lấy tên sản phẩm cho mỗi dòng hàng. Điều kiện ON nào đúng?
Đơn 1 có 2 dòng hàng. Chạy SELECT o.order_id, l.product_id FROM orders o JOIN order_lines l ON l.order_id = o.order_id; thì đơn 1 xuất hiện mấy lần?
SELECT customer_id FROM orders o JOIN customers c ON c.customer_id = o.customer_id; báo lỗi ORA-00918. Vì sao?