Quản lý kho & bán hàng – SQL Server
Yêu cầu
Bạn hãy xây dựng hệ thống quản lý kho và bán hàng gồm các bảng: Khách hàng, Đơn hàng, Sản phẩm, Chi tiết đơn hàng. Thực hiện đầy đủ các yêu cầu sau.
Phần 1: Thiết kế Cơ sở dữ liệu & Tạo bảng
-
Tạo database có tên
WarehouseManagement
. -
Tạo các bảng:
-
tblCustomer
-
CustomerID: INT NOT NULL
-
CustomerName: NVARCHAR(100)
-
Email: NVARCHAR(100)
-
BirthDate: DATE
-
-
tblProduct
-
ProductID: INT NOT NULL
-
ProductName: NVARCHAR(100)
-
StockQuantity: INT
-
Price: DECIMAL(10,2)
-
Description: NVARCHAR(255)
-
-
tblOrder
-
OrderID: INT NOT NULL
-
CustomerID: INT NOT NULL
-
OrderDate: DATETIME
-
-
tblOrderLine
(chi tiết đơn)-
OrderID: INT NOT NULL
-
ProductID: INT NOT NULL
-
Quantity: INT
-
UnitPrice: DECIMAL(10,2)
-
-
-
Thiết lập:
-
Khóa chính (PRIMARY KEY) cho các bảng phù hợp.
-
Khóa ngoại (FOREIGN KEY) giữa
tblOrder.CustomerID
→tblCustomer.CustomerID
, vàtblOrderLine
liên kết vớitblOrder
&tblProduct
. -
Ràng buộc
UNIQUE
choEmail
trong bảngtblCustomer
. -
Ràng buộc CHECK để đảm bảo:
-
tblProduct.StockQuantity >= 0
-
tblOrder.OrderDate
không được trong tương lai (<= GETDATE()).
-
-
-
Tạo index (clustered hoặc non-clustered) nếu thấy hợp lý để tối ưu các truy vấn liên quan đến tìm sản phẩm theo tên hoặc tìm đơn hàng theo ngày.
Phần 2: Dữ liệu mẫu
Insert dữ liệu giả lập:
-
Ít nhất 6 khách hàng, với ngày sinh khác nhau.
-
Ít nhất 5 sản phẩm, với số lượng trong kho và giá khác nhau.
-
Ít nhất 7 đơn hàng, mỗi đơn có ít nhất một chi tiết đơn hàng.
-
Chi tiết đơn hàng bao gồm số lượng sản phẩm và đơn giá (có thể bằng giá sản phẩm hoặc khác nếu cần).
Phần 3: Các nghiệp vụ và truy vấn
Hãy viết các câu lệnh SQL thực hiện:
-
Cập nhật giá sản phẩm có
ProductID = 3
, giảm giá 20 % so với giá hiện tại. -
Truy xuất danh sách gồm:
CustomerID
,CustomerName
,OrderID
,OrderDate
,ProductName
,Quantity
,UnitPrice
cho tất cả các đơn hàng. -
Truy vấn sử dụng
LEFT JOIN
để hiển thị tất cả đơn hàng ngay cả khi chưa có chi tiết đơn hàng nào. -
Truy vấn sử dụng
INNER JOIN
để chỉ lấy các đơn hàng có chi tiết sản phẩm. -
Tạo VIEW tên
view_TopProducts
để hiển thị top 3 sản phẩm bán được nhiều nhất (theo tổngQuantity
trong tất cả chi tiết đơn hàng), gồm các trường: ProductID, ProductName, TổngSốLượngBán. -
Tạo Stored Procedure
sp_FindProductsByMaxPrice
:-
Tham số vào là
@MaxPrice
kiểu DECIMAL(10,2). -
Tham số output
@Count
kiểu INT. -
Thực hiện tìm tất cả sản phẩm có giá <=
@MaxPrice
, và trả ra số lượng sản phẩm tìm được qua@Count
.
-
-
Tạo Trigger
trg_Product_PriceUpdate
trên bảngtblProduct
:-
Khi có update trên cột
Price
, nếu giá mới thấp hơn 5.00, thì rollback transaction và cảnh báo (print) một thông báo như “Giá sản phẩm không được thấp hơn 5.00”.
-
-
Tạo Trigger
trg_Customer_EmailUpdate
trên bảngtblCustomer
:-
Khi update cột
Email
, nếu giá trị mới không có dấu'@'
thì rollback transaction và cảnh báo (print) “Email không hợp lệ”.
-
Phần 4: Các câu hỏi lý thuyết
A. Giải thích sự khác nhau giữa INNER JOIN
, LEFT JOIN
, RIGHT JOIN
.
B. Khi nào nên dùng CHECK
constraint và DEFAULT
constraint? Cho ví dụ.
C. Ưu điểm của việc tạo index là gì? Khi nào index lại có thể khiến hiệu suất giảm?
D. Sự khác biệt giữa VIEW và Stored Procedure là gì?
E. Giải thích trigger là gì, và khi nào nên (và không nên) dùng trigger trong thực tế.