VieTopik
Tiếng HànTiếng AnhIT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
SQL với OracleNối bảng
Bài 8/16
5 phút

INNER JOIN

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 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;
  • JOIN là viết tắt của INNER JOIN.
  • ON c.customer_id = o.customer_id: ghép mỗi đơn với đúng khách của nó.
  • o và c là 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ả:

Đơn 1 An (1) Đơn 2 Đơn 3 Bình (2) Đơn 4 Chi (3) Dũng (4)
INNER JOIN chỉ giữ các cặp đơn và khách khớp nhau

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ện ghé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 AS trướ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âu
Câu 1

Muốn lấy tên sản phẩm cho mỗi dòng hàng. Điều kiện ON nào đúng?

Câu 2

Đơ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?

Câu 3

SELECT customer_id FROM orders o JOIN customers c ON c.customer_id = o.customer_id; báo lỗi ORA-00918. Vì sao?

Khoá ngoại và quan hệLEFT JOIN

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt