✦ 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àng và Sả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ảng | Vai trò | Khóa chính | Khóa ngoại |
---|---|---|---|
customers | Danh sách khách hàng | customer_id | – |
orders | Thông tin đơn hàng | order_id | customer_id |
order_items | Chi tiết sản phẩm trong mỗi đơn | item_id | order_id , product_id |
products | Danh sách sản phẩm | product_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_id | customer_name | product_name | quantity | price | total_line |
---|---|---|---|---|---|
1001 | Nguyễn Văn A | Laptop Dell | 1 | 1500 | 1500 |
1001 | Nguyễn Văn A | Chuột Logitech | 2 | 30 | 60 |
1002 | Trần Thị B | Bàn phím Cơ | 1 | 70 | 70 |
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
- 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.
- Hiển thị các đơn hàng chứa sản phẩm “Chuột Logitech”.
- 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