Đăng nhập

Bài 20: Dựng ví dụ hệ thống quản lý đơn hàng có JOIN

✦ Mục tiêu bài học:

  • Áp dụng thực tế kiến thức JOIN vào một hệ thống gần gũi: quản lý đơn hàng
  • Làm chủ cách kết nối bảng Khách hàng, Đơn hàng, Chi tiết đơn hàngSản phẩm
  • Rèn luyện tư duy thiết kế dữ liệu có quan hệ, logic và truy xuất hiệu quả

Mô hình hệ thống:

Giả sử bạn làm việc tại một công ty bán hàng online, bạn cần xây dựng hệ thống quản lý đơn đặt hàng. Dưới đây là sơ đồ quan hệ giữa các bảng:

BảngVai tròKhóa chínhKhóa ngoại
customersDanh sách khách hàngcustomer_id
ordersThông tin đơn hàngorder_idcustomer_id
order_itemsChi tiết sản phẩm trong mỗi đơnitem_idorder_id, product_id
productsDanh sách sản phẩmproduct_id

Tạo bảng (DDL)

CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100)
);

CREATE TABLE products (
  product_id INT PRIMARY KEY,
  product_name VARCHAR(100),
  price DECIMAL(10,2)
);

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE,
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

CREATE TABLE order_items (
  item_id INT PRIMARY KEY,
  order_id INT,
  product_id INT,
  quantity INT,
  FOREIGN KEY (order_id) REFERENCES orders(order_id),
  FOREIGN KEY (product_id) REFERENCES products(product_id)
);

Thêm dữ liệu mẫu

-- Khách hàng
INSERT INTO customers VALUES (1, 'Nguyễn Văn A', 'a@gmail.com');
INSERT INTO customers VALUES (2, 'Trần Thị B', 'b@gmail.com');

-- Sản phẩm
INSERT INTO products VALUES (101, 'Laptop Dell', 1500);
INSERT INTO products VALUES (102, 'Chuột Logitech', 30);
INSERT INTO products VALUES (103, 'Bàn phím Cơ', 70);

-- Đơn hàng
INSERT INTO orders VALUES (1001, 1, '2025-07-01');
INSERT INTO orders VALUES (1002, 2, '2025-07-02');

-- Chi tiết đơn hàng
INSERT INTO order_items VALUES (1, 1001, 101, 1);
INSERT INTO order_items VALUES (2, 1001, 102, 2);
INSERT INTO order_items VALUES (3, 1002, 103, 1);

JOIN để truy vấn thông tin đầy đủ của đơn hàng

Câu hỏi: Hiển thị danh sách các đơn hàng, kèm tên khách hàng, sản phẩm, số lượng và tổng tiền của từng dòng hàng.

SELECT 
  o.order_id,
  c.name AS customer_name,
  p.product_name,
  oi.quantity,
  p.price,
  (oi.quantity * p.price) AS total_line
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
ORDER BY o.order_id;

Kết quả mong đợi:

order_idcustomer_nameproduct_namequantitypricetotal_line
1001Nguyễn Văn ALaptop Dell115001500
1001Nguyễn Văn AChuột Logitech23060
1002Trần Thị BBàn phím Cơ17070

Tính tổng giá trị từng đơn hàng

SELECT 
  o.order_id,
  c.name AS customer_name,
  SUM(p.price * oi.quantity) AS order_total
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
GROUP BY o.order_id, c.name;

Phân tích thêm

  • Bạn có thể mở rộng hệ thống với trạng thái đơn hàng, ngày giao hàng, khuyến mãi…
  • JOIN là công cụ cực kỳ mạnh để kết nối dữ liệu giữa nhiều bảng. Không thể thiếu nếu bạn xây dựng một hệ quản trị thực tế.

Bài tập tự luyện

  1. Viết truy vấn liệt kê tất cả khách hàng và tổng số sản phẩm họ đã mua.
  2. Hiển thị các đơn hàng chứa sản phẩm “Chuột Logitech”.
  3. Liệt kê đơn hàng có tổng tiền > 100.

Kết luận

Bài này là cột mốc quan trọng vì bạn kết hợp toàn bộ kiến thức JOIN và GROUP BY để xử lý một tình huống thực tế. Hãy thực hành nhiều để nhuần nhuyễn hơn, và tưởng tượng bạn đang xây một hệ thống bán hàng thật.

Thảo luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Đăng ký nhận tin mới

Nhận bài học, tài nguyên và cơ hội việc làm qua email hàng tuần.

Chúng tôi cam kết không spam. Bạn có thể hủy bất cứ lúc nào.