Professional Documents
Culture Documents
4. RBTV (QUÂN)
5. TRIGGER (DUY)
6. ĐÁNH GIÁ + KẾT THÚC(VỸ)
1
h. Gom nhóm
i. Gom nhóm có điều kiện
PHẦN 3: CÀI ĐẶT CƠ SỞ DỮ LIỆU
1. Lệnh mô tả dữ liệu : DDL
a. Tạo database
b. Tạo các table dựa trên các quan hệ đã cho trên database
c. Thay đổi cấu trúc bảng:
2. Lệnh Thao Tác Dữ Liệu: DDL
a. Thêm dữ liệu vào các table bằng lệnh SQL:
b. Cập nhật dữ liệu bằng câu lệnh SQL:
c. Xóa dữ liệu bằng câu lệnh SQL:
3. Lệnh truy vấn dữ liệu: SQL
a. Truy vấn sử dụng 1 bảng
b. Truy vấn sử dụng nhiều bảng
c. Truy vấn có điều kiện (AND, OR, LIKE, BETWEEN...)
d. Truy vấn có tính toán
e. Truy vấn có gom nhóm (GROUP BY)
f. Truy vấn gom nhóm có điều kiện (GROUP BY + HAVING)
g. Truy vấn sử dụng điều kiện WHERE + GROUP BY + ORDER BY
h. Truy vấn có sử dụng EXCEPT, INTERSECT, UNION
i. Truy vấn con
4. Trigger
a. Kiểm tra mã hàng có tồn tại trong đơn hàng tương ứng và số lượng trả không vượt
quá số lượng đã mua trong đơn hàng tương ứng
b. Kiểm tra số lượng trong đơn đặt phải nhỏ hơn số lượng tồn và thực hiện trừ đi
lượng đặt vào hàng tồn
c. Cập nhật tòn kho khi nhập hàng
d. Dòng hàng nhập phải của đúng nhà sản xuất
e. Giá bán phải lớn hơn giá nhập
f. Nhân viên trên 18 tuổi
g. Ngày có thể lấy phải sau ngày đặt hàng
h. Khi thay đổi cột số lượng trong bảng CHITIET_PDH thì cập nhật lại số lượng tồn
trong bảng DONG_DONGHO
PHẦN 4: Tổng kết:
1. Ưu điểm
2. Nhược điểm
3. Hướng phát triển
KẾT LUẬN
2
LỜI MỞ ĐẦU
Có thể nói rằng, Việt Nam sau thời kỳ Đổi mới đã có những bước nhảy vọt về tất cả mọi
lĩnh vực trong cuộc sống với tôn chỉ dùng công nghệ và khoa học làm mũi nhọn cho sự phát
triển. Mục tiêu công nghiệp hóa theo hướng hiện đại, vươn lên trình độ tiên tiến của thế giới;
sử dụng có hiệu quả và tăng nhanh tiềm lực khoa học và công nghệ của đất nước để bắt kịp
với các cường quốc, không phải là một lý thuyết suông. Nhìn vào thực tế cuộc sống, chúng ta
có thể cảm nhận rằng đời sống xã hội của chúng ta đã có những chuyển biến rất sâu sắc và
nhanh chóng. Một người trong xã hội Việt Nam ở thế kỷ 20 sẽ khó có thể nào sinh tồn được
trong không - thời gian của thế kỷ 21 bởi sự khác biệt gần như là toàn thể so với bối cảnh họ
sinh sống. Và chính khoa học và công nghệ là trụ cột chính cho sự biến chuyển này.
Liệu rằng sự công nghiệp hoá, hiện đại hoá này là một điều tốt hứa hẹn về một tương lai
tươi sáng đang chờ đợi hay trước bão giông là bầu trời bình yên, đây là câu hỏi cần nhiều trăn
trở. Nhưng, thế hệ chúng ta thật khó để phủ nhận rằng sự tiện ích mà công nghệ đem lại đã
khiến cuộc sống linh động hơn rất nhiều. Thời gian để truyền tải đi một thông điệp cách nửa
vòng trái đất được tính bằng tích tắc đồng hồ, không còn cảnh ngồi chờ mong ngóng ngày
này qua tháng nọ như thời trước. Một cú nhấp chuột là mọi hàng hoá trên thế giới đều sở hữu
trong tay bạn.
Và sự bùng nổ của đại dịch COVID 19 đã đánh dấu sự bùng nổ mạnh mẽ hơn nữa trong việc
sử dụng công nghệ làm xương sống cho mọi khía cạnh của cuộc sống. Những ứng dụng theo
dõi, cập nhật về tình hình di chuyển của người dân trở thành một phần không thể thiếu trong
chính sách chống dịch. Các sàn thương mại điện tử đã trực thuộc trong cuộc sống hằng ngày
của người dân khi thời điểm phong toả và cách ly thực hiện nghiêm ngặt hơn bao giờ hết. Và
có lẽ dù muốn hay không, đây là một quá trình không thể đảo ngược và cuộc sống của chúng
ta phụ thuộc rất nhiều vào nó.
Bài đồ án của nhóm chúng em cũng chính là minh chứng cho sự quan tâm, sự tìm tòi về
những công nghệ, ứng dụng đang góp phần thay đổi chính cuộc sống của chính chúng ta. Với
sự hứng thú về mảng chủ đề thời trang nói chung hay trang sức đồng hồ nói riêng là động lực
khiến tụi em đã lựa chọn chủ đề: Thiết kế cơ sở dữ liệu của hệ thống bán đồng hồ. Nhận
thấy rằng trên thị trường hiện nay tuy xuất hiện nhiều cửa hàng bán đồng hồ nhưng trải
nghiệm dịch vụ mua bán hàng chưa đạt được hết đến tiềm năng mà nó có thể có, nhóm chúng
em đã quyết định chọn chủ đề này nhằm bổ sung cho những hạn chế hiện nay.
3
LỜI CẢM ƠN
Chúng em xin được gửi lời cảm ơn sâu sắc đến giảng viên bộ môn Cơ sở dữ liệu – Th.S Bùi
Xuân Huy đã dạy dỗ, truyền đạt những kiến thức quý báu cho em trong suốt thời gian học tập
vừa qua. Trong suốt thời gian tham gia lớp học Cơ sở dữ liệu của thầy chúng em đã có thêm
cho mình nhiều kiến thức bổ ích cùng với đó là tinh thần học tập hiệu quả, nghiêm túc. Đây
chắc chắn sẽ là những kiến thức quý báu, là hành trang để em có thể vững bước sau này.
Môn Cơ sở dữ liệu là môn học thú vị, vô cùng bổ ích và có tính thực tế cao khi kiến thức
của nó không chỉ giúp em nâng cao kỹ năng mà còn đem đến sự thay đổi trong tư duy nhận
thức. Nhờ có sự giảng dạy của thầy ở bộ môn này mà chúng em được đảm bảo cung cấp đủ
kiến thức, gắn liền với nhu cầu thực tiễn của sinh viên khoa Công Nghệ Thông Tin Kinh
Doanh. Những sai sót vẫn có thể xuất hiện do vốn kiến thức còn nhiều hạn chế đi cùng với
việc chưa được trải nghiệm môi trường thực tế. Mặc dù chúng em đã cố gắng hết sức nhưng
chắc chắn bài đồ án này khó có thể tránh khỏi những thiếu sót và nhiều chỗ còn chưa chính
xác, kính mong thầy xem xét và góp ý để bài đồ án cuối kỳ của tụi em được hoàn thiện hơn.
1. Mô tả bài toán:
Cửa hàng linh kiện bán đồng hồ Kim Jisoo tại TP. Hồ Chí Minh chuyên bán đa dạng các
mẫu mã đồng hồ. Cửa hàng cần thiết kế một website bán hàng với mục đích giúp khách hàng
có thể đặt trước sản phẩm online và đồng thời cửa hàng có thể quản lý các nguồn cung cấp,
sản phẩm khách hàng đặt mua, quản lý số lượng sản phẩm,... Để quy trình này diễn ra một
cách thuận lợi nhất thì cửa hàng cần một cơ sở dữ liệu hoàn chỉnh để đáp ứng những nhu cầu
này, bao gồm các phần sau đây:
4
+ Nhân viên sau đó sẽ xử lý đơn hàng theo phiếu đặt và đính kèm những dịch vụ sau khi
mua hàng, bao gồm:
● Bảo hành: Khách hàng có thể đem đồng hồ đến sửa chữa, bảo trì đồng hồ trong thời
hạn bảo hành.
● Trả hàng: Trong vòng 7 ngày tính từ thời điểm mua, nếu khách hàng thay đổi ý định
có thể trả lại đồng hồ đã đặt. Sau thời gian này chính sách trả hàng sẽ hết hiệu lực.
Dữ liệu về Dòng Đồng Hồ: mã dòng đồng hồ để phân biệt các dòng đồng hồ khác nhau, tên
dòng đồng hồ, giá bán cho mỗi dòng, số lượng tồn của mỗi dòng. Mỗi dòng đồng hồ có một
mã dòng duy nhất.
Dữ liệu về Đồng Hồ: Mỗi đồng hồ có một seri đồng hồ, kích cỡ, màu sắc và mã dòng đồng
hồ. Mỗi đồng hồ có một seri duy nhất.
Dữ liệu về Nhà Sản Xuất: Mỗi nhà sản xuất có một mã nhà sản xuất, tên nhà cung cấp, địa
chỉ, email, số điện thoại. Mã nhà sản xuất là duy nhất để phân biệt với nhà cung cấp khác.
Dữ liệu về Nhân Viên: Mỗi nhân viên có một mã nhân viên, họ và tên, giới tính, ngày sinh,
địa chỉ, số điện thoại, email, mức lương. Bên cạnh đó, mỗi một nhân viên còn bị giám sát bởi
một người quản lý cũng là nhân viên của cửa hàng. Mã nhân viên là độc nhất để phân biệt
với những nhân viên khác.
Dữ liệu về Khách Hàng: Các thông tin về khách hàng sẽ bao gồm mã khách hàng, họ và tên,
giới tính, ngày sinh, địa chỉ, số điện thoại, email. Mã khách hàng là riêng biệt dùng để phân
biệt các khách hàng với nhau.
5
Dữ liệu về Phiếu Nhập: Mỗi đơn nhập hàng từ nhà sản xuất phải có một mã phiếu nhập,
ngày nhập hàng, mã nhân viên nhập hàng. Mỗi đơn nhập hàng chỉ gắn duy nhất với một mã
phiếu nhập, mã nhân viên nhập hàng và mã nhà sản xuất.
Dữ liệu về Chi Tiết Phiếu Nhập: Chi tiết về phiếu nhập sẽ bao gồm mã phiếu nhập và mã
dòng đồng hồ. Bên cạnh đó những thông tin về số lượng sản phẩm và giá đồng hồ khi nhập
cũng được ghi nhận tại đây.
Dữ liệu về Phiếu Đặt Hàng: Thông tin về mã phiếu đặt hàng, ngày đặt hàng, ngày khách có
thể đến lấy, trạng thái đơn hàng sẽ được lưu trữ trên phiếu đặt hàng. Ngoài ra thông tin về mã
khách hàng, mã nhân viên cũng sẽ hiển thị trên đây. Mã phiếu đặt hàng là duy nhất để phân
biệt với những phiếu đặt hàng khác nhau.
Dữ liệu về Chi Tiết Phiếu Đặt Hàng: Chi tiết về phiếu đặt hàng sẽ bao gồm mã phiếu đặt
hàng và mã dòng đồng hồ. Số lượng đặt và thông tin về phần trăm giảm giá sẽ được hiển thị
trên đây.
Dữ liệu về Phiếu Trả: Mỗi một phiếu trả sẽ chứa những thông tin về mã phiếu trả, mã nhân
viên, mã hoá đơn. Mỗi phiếu trả sẽ có một mã phiếu trả riêng biệt để phân biệt những trả
khác nhau.
Dữ liệu về Chi Tiết Phiếu Trả: Mã phiếu trả, mã dòng đồng hồ, số lượng trả và thời gian
trả hàng sẽ được ghi nhận ở chi tiết phiếu trả.
Dữ liệu về Hoá Đơn: Hoá đơn sẽ bao gồm Mã hoá đơn, ngày lập hoá đơn. Mỗi hoá đơn chỉ
gắn với duy nhất mỗi mã nhân viên và mã phiếu đặt hàng.
6
Mối quan hệ Trả hàng
● Thực thể tham gia: Hóa đơn, Phiếu trả hàng
● Một hóa đơn có thể có nhiều phiếu trả hàng. Mỗi phiếu trả hàng chỉ thuộc về một hóa
đơn
Mối quan hệ Chi tiết trả hàng
● Thực thể tham gia: Phiếu trả hàng, Dòng đồng hồ
● Mỗi phiếu trả hàng có thể bao gồm nhiều dòng đồng hồ. Mỗi đồng hồ thuộc về nhiều
phiếu trả hàng
Mối quan hệ Nhập hàng
● Thực thể tham gia: Nhà sản xuất, Phiếu nhập hàng
● Mỗi nhà sản xuất có nhiều phiếu nhập hàng. Mỗi phiếu nhập hàng chỉ thuộc về một
nhà sản xuất
Mối quan hệ Chi tiết phiếu nhập hàng
● Thực thể tham gia: Phiếu nhập hàng, Dòng đồng hồ
Mối quan hệ Thuộc
● Thực thể tham gia: Nhà sản xuất, Dòng đồng hồ
● Mỗi nhà sản xuất có nhiều dòng đồng hồ. Mỗi dòng đồng hồ chỉ thuộc về một nhà sản
xuất
Mối quan hệ Lập
● Thực thể tham gia: Nhân viên, Phiếu nhập hàng
● Mỗi nhân viên có thể lập nhiều phiếu nhập hàng. Mỗi phiếu nhập hàng do một nhân
viên lập
Mối quan hệ Lập
● Thực thể tham gia: Nhân viên, Phiếu đặt hàng
● Mỗi nhân viên có thể lập nhiều phiếu đặt hàng. Mỗi phiếu đặt hàng do một nhân viên
lập
Mối quan hệ Lập
● Thực thể tham gia: Nhân viên, Phiếu trả hàng
● Mỗi nhân viên có thể lập nhiều phiếu trả hàng. Mỗi phiếu trả hàng do một nhân viên
lập
Mối quan hệ Lập
● Thực thể tham gia: Nhân viên, Hóa đơn
● Mỗi nhân viên có thể lập nhiều hóa đơn. Mỗi hóa đơn do một nhân viên lập
Mối quan hệ Có
● Thực thể tham gia: Dòng đồng hồ, Đồng hồ
● Mỗi dòng đồng hồ có nhiều đồng hồ. Mỗi đồng hồ thuộc về một dòng đồng hồ
7
PHẦN 2: XÂY DỰNG CSDL
1. Mô hình thực thể kết hợp
2. Lược đồ quan hệ
DONG_DONGHO (Ma_dong, Ten_dong, Gia_dong , SoLuongTon, ThoihanBH, MaNSX)
DONGHO (Seri, Size, Color, Ma_dong, MaHD)
NHASANXUAT(MaNSX, TenNSX, DiaChiNSX, EmailNSX, SdtNSX)
NHANVIEN(MaNV, HoTenNV, Phai, NgSinhNV, SdtNV, DiaChiNV, EmailNV,
MucLuong, MaNVquanly)
KHACHHANG(MaKH, HoTenKH, GioiTinhKH, NgSinhKH, SdtKH, DiaChiKH,
EmailKH)
PHIEUNHAP(MaPN, NgayPN, MaNSX, MaNV)
CHITIET_PN(MaPN, Ma_dong, SoLgSP, GiaNhap )
PHIEUDATHANG ( MaPDH, NgayDat, Ngaycothelay, TrangThaiDH, MaKH, MaNV)
8
Ma_dong Mã dòng đồng hồ char(4) Khóa chính
Bảng DONGHO
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc
Bảng NHASANXUAT
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc
Bảng NHANVIEN
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc
9
MaNV Mã nhân viên char(4) Khóa chính
Bảng KHACHHANG
Tên thuộc tính Mô tả Kiểu dữ liệu Độ dài
Bảng PHIEUNHAP
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc
10
MaNV Mã nhân viên lập phiếu char(4) Khóa ngoại
Bảng CHITIET_PN
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc
Bảng PHIEUDATHANG
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc
Bảng CHITIET_PDH
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc
11
Bảng PHIEUTRA
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc
Bảng CHITIET_PT
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc
Bảng HOADON
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc
12
5. Ràng buộc toàn vẹn
a. Mã dòng đồng hồ không được phép trùng nhau
- Ngữ cảnh: DONGHO
- Điều kiện: ∀ a, b ∈ DONGHO (a <> b ∧ a.Ma_dong <> b.Ma_dong)
- Bảng tầm ảnh hưởng
Thêm Xóa Sửa
b. Mã phiếu nhập và mã dòng đồng hồ trên 2 dòng bất kỳ trong bảng CHITIET_PN
không được phép trùng nhau
- Điều kiện: ∀ a, b ∈ CHITIET_PN ( a <> b ∧ a.(MaPN, Ma_dong) <> b.(MaPN,
Ma_dong))
Thêm Xóa Sửa
c. Khách hàng chỉ được đặt những hàng hóa có trong danh mục hàng hóa của công
ty và số lượng đặt phải nhỏ hơn hay bằng số lượng tồn kho của mặt hàng đó.
- Ngữ cảnh: DONG_DONGHO, CHITIET_PDH
- Điều kiện: ∀ d ∈ DONG_DONGHO, Ǝ c ∈ CHITIET_PDH ( d.SoLuongTon >
c.SLgDat ∧ d.Ma_dong = c.Ma_dong ∧ d.Ma_dong IS NOT NULL )
13
- Bảng tầm ảnh hưởng
Thêm Xóa Sửa
d. Ngày đặt đơn phải nhỏ hơn ngày có thể lấy hàng
- Ngữ cảnh: PHIEUDATHANG
- Điều kiện: ∀ a ∈ PHIEUDATHANG ( a.NgayCoTheLay > a.NgayDat)
- Bảng tầm ảnh hưởng
Thêm Xóa Sửa
14
KẾT QUẢ ← πMaKH (KHACHHANG) ∩ πMaKH (PHIEUDATHANG)
d. Phép hội
Phép toán 1: Cho biết danh sách mã nhân viên của nhân viên lập phiếu đặt hàng có mã là
ORD1 hoặc ORD3
KẾT QUẢ ← πMaNV (σMaPDH = ‘ORD1’ (PHIEUDATHANG)) ∪ πMaNV (σMaPDH = ‘ORD3’
(PHIEUDATHANG))
Phép toán 2: Cho biết danh sách các mã nhân viên của nhân viên có tham gia lập phiếu nhập
hàng hoặc không.
KẾT QUẢ ← πMaNV (NHANVIEN) ∪ πMaNV (PHIEUNHAP)
Phép toán 3: Cho biết danh sách mã dòng đồng hồ được khách hàng mua hoặc không được
mua.
KẾT QUẢ ← πMa_dong (DONG_DONGHO) ∪ πMa_dong (CHITIET_PDH)
e. Phép trừ
Phép toán 1: Cho biết danh sách mã nhân viên của các nhân viên lập phiếu đặt hàng có mã là
ORD1 nhưng không lập phiếu đặt hàng có mã là ORD3
KẾT QUẢ ← πMaNV (σMaPDH = ‘ORD1’ (PHIEUDATHANG)) − πMaNV (σMaPDH = ‘ORD3’
(PHIEUDATHANG))
Phép toán 2: Cho biết danh sách mã nhân viên không tham gia vào việc lập bất cứ hóa đơn
nào.
KẾT QUẢ ← πMaNV (NHANVIEN) − πMaNV (HOADON)
Phép toán 3: Cho biết danh sách mã dòng đồng hồ không được mua lần nào.
KẾT QUẢ ← πMa_dong (DONG_DONGHO) − πMa_dong (CHITIET_PDH)
15
Phép toán 3: Cho biết thông tin các nhân viên nữ lập phiếu trả hàng vào ngày 1/2/2022.
KẾT QUẢ ← σgender = ‘Nữ’ and date = ‘1/2/2022’ (STAFF ⋈ STAFF_SERVICE)
h. Gom nhóm
Phép toán 1: Cho biết số lượng nhân viên và mức lương trung bình của tất cả nhân viên.
KẾT QUẢ ← YMaNV, Count (MaNV), Avg(MucLuong) (NHANVIEN)
Phép toán 2: Cho biết tổng số phiếu nhập hàng từ nhà sản xuất.
KẾT QUẢ ← YMaPN, Count (MaPN) (PHIEUNHAP)
Phép toán 3: Cho biết tổng số đồng hồ đã được đặt mua.
KẾT QUẢ ← YSLgDat, sum (SLgDat) (CHITIET_PDH)
i. Gom nhóm có điều kiện
Phép toán 1: Cho biết số lượng dòng đồng hồ có giá bán lớn hơn 3,000,000.
KẾT QUẢ ← YCount (Ma_dong) (σ Gia_dong > 3000000 (DONG_DONGHO))
Phép toán 2: Cho biết tổng số phiếu đặt hàng đã bị hủy.
KẾT QUẢ ← YCount (MaPDH) (σ TrangThaiDH = N‘Đã hủy’ (PHIEUDATHANG)
Phép toán 3: Cho biết mức lương trung bình của các nhân viên nam.
KẾT QUẢ ← Y Avg(MucLuong) (σPhai = N‘Nam’ (NHANVIEN)
b. Tạo các table dựa trên các quan hệ đã cho trên database
1.1. Tạo bảng NHASANXUAT (Nhà Sản Xuất):
CREATE TABLE NHA_SAN_XUAT_ DONG_HO
(
MaNSX CHAR(4) PRIMARY KEY,
TenNSX NVARCHAR(255) not null,
DiaChiNSX NVARCHAR(255),
EmailNSX NVARCHAR(50),
SdtNSX VARCHAR(15) not null
);
16
Ten_dong NVARCHAR(20) not null,
Gia_dong REAL not null,
SoLuongTon INT not null,
ThoihanBH INT not null,
MaNSX CHAR(4) references NHASANXUAT(MaNSX) not null
);
17
1.6. Tạo bảng CHITIET_PN (Chi Tiết Phiếu Nhập):
CREATE TABLE CHITIET_PN
(
MaPN CHAR(4) references PHIEUNHAP(MaPN) not null,
Ma_dong CHAR(4) references DONG_DONGHO(Ma_dong) not null,
SoLgSP INT not null,
GiaNhap REAL not null,
PRIMARY KEY(MaPN, Ma_dong)
);
18
1.10. Tạo bảng PHIEUTRA (Phiếu Trả):
CREATE TABLE PHIEUTRA
(
MaPT CHAR(4) PRIMARY KEY,
MaNV CHAR(4) references NHANVIEN(MaNV) not null ,
MaHD CHAR(4) references HOADON(MaHD) not null
);
19
2. Lệnh Thao Tác Dữ Liệu: DDL
a. Thêm dữ liệu vào các table bằng lệnh SQL:
1.1. Thêm dữ liệu vào bảng Nhà Sản Xuất:
KẾT QUẢ
20
SoLuongTon, ThoihanBH, MaNSX)
VALUES ('D005', 'HUBLOT', 7500000, 10, 5,'000D');
INSERT INTO DONG_DONGHO (Ma_dong, Ten_dong, Gia_dong,
SoLuongTon, ThoihanBH, MaNSX)
VALUES ('D006', 'ROLEX', 80000000, 1, 10,'000D');
KẾT QUẢ
KẾT QUẢ
21
VALUES ('C001', N'VÕ PHƯƠNG DUY', N'NAM', '2003-7-8',
'0936452312', 'TPHCM', 'duyvo@gmail.com');
INSERT INTO KHACHHANG (MaKH, HoTenKH, GioiTinhKH,
NgSinhKH, SdtKH, DiaChiKH, EmailKH)
VALUES ('C002', N'LÊ NGỌC THIÊN KIM', N'NỮ', '2003-7-8',
'0936452312', 'TPHCM', 'duyvo@gmail.com');
INSERT INTO KHACHHANG (MaKH, HoTenKH, GioiTinhKH,
NgSinhKH, SdtKH, DiaChiKH, EmailKH)
VALUES ('C003', N'LÊ MINH QUÂN', N'NAM', '2003-7-5',
'0981027320', NULL, 'quanle@gmail.com');
INSERT INTO KHACHHANG (MaKH, HoTenKH, GioiTinhKH,
NgSinhKH, SdtKH, DiaChiKH, EmailKH)
VALUES ('C004', N'PHAN DUY TRỌNG', 'NAM', '2003-8-
14','0956327777', NULL, 'trongphan@gmail.com');
INSERT INTO KHACHHANG (MaKH, HoTenKH, GioiTinhKH,
NgSinhKH, SdtKH, DiaChiKH, EmailKH)
VALUES ('C005', N'NGUYỄN THU VIỆC', N'NỮ', '2003-6-10',
'0981027355', N'ĐẮK LẮK', 'viecnguyencutie@gmail.com');
INSERT INTO KHACHHANG (MaKH, HoTenKH, GioiTinhKH,
NgSinhKH, SdtKH, DiaChiKH, EmailKH)
VALUES ('C006', N'NGUYỄN THU NGÂN', N'NỮ', '2003-7-15',
'0981027489', N'BÌNH DƯƠNG', 'ngannguyen@gmail.com');
KẾT QUẢ
22
KẾT QUẢ
KẾT QUẢ
23
KẾT QUẢ
24
KẾT QUẢ
1.9. Thêm dữ liệu vào bảng Chi Tiết Phiếu Đặt Hàng:
CODE INSERT INTO CHITIET_PDH (MaPDH, Ma_dong, SLgDat,
Giamgia_phantram)
VALUES ('ORD1', 'D001', 4, 10);
INSERT INTO CHITIET_PDH (MaPDH, Ma_dong, SLgDat,
Giamgia_phantram)
VALUES ('ORD2', 'D003', 5, 0);
INSERT INTO CHITIET_PDH (MaPDH, Ma_dong, SLgDat,
Giamgia_phantram)
VALUES ('ORD3', 'D002', 4, 20);
INSERT INTO CHITIET_PDH (MaPDH, Ma_dong, SLgDat,
Giamgia_phantram)
VALUES ('ORD4', 'D002', 1, 10);
INSERT INTO CHITIET_PDH (MaPDH, Ma_dong, SLgDat,
Giamgia_phantram)
VALUES ('ORD4', 'D001', 3, 0);
INSERT INTO CHITIET_PDH (MaPDH, Ma_dong, SLgDat,
Giamgia_phantram)
VALUES ('ORD5', 'D001', 3, 0);
INSERT INTO CHITIET_PDH (MaPDH, Ma_dong, SLgDat,
Giamgia_phantram)
VALUES ('ORD6', 'D003', 5, 20);
25
KẾT QUẢ
KẾT QUẢ
KẾT QUẢ
26
CODE INSERT INTO DONGHO (Seri, Size, Color, Ma_dong, MaHD)
VALUES ('SR0001', '25mm', N'ĐEN', 'D003',’BIL1’);
INSERT INTO DONGHO (Seri, Size, Color, Ma_dong, MaHD)
VALUES ('SR0002', '42mm', N'XÁM', 'D001',’BIL2’);
INSERT INTO DONGHO (Seri, Size, Color, Ma_dong, MaHD)
VALUES ('SR0003', '36mm', N'TRẮNG', 'D002',’BIL3’);
KẾT QUẢ
YÊU CẦU: Cập nhật địa chỉ nhân viên có mã nhân viên là EAA1:
27
Sau khi chạy:
28
Sau khi chạy:
Câu 1: Cho biết danh sách nhân viên bao gồm những thông tin sau: Họ tên nhân viên, mã
nhân viên, email, mã nhân viên quản lý của nhân viên đó.
Kết quả
Câu 2: Cho biết danh sách nhân viên được quản lý bởi Nguyễn Ngọc Hoàng (Mã nhân
viên: EBB2). Thông tin hiển thị bao gồm: Họ tên nhân viên, mã nhân viên, email, mã nhân
viên quản lý.
29
Kết quả
Câu 3: Cho biết danh sách khách hàng có họ Lê. Thông tin hiển thị bao gồm: Họ tên khách
hàng, mã khách hàng, giới tính.
Kết quả
Câu 1: Cho biết tên dòng đồng hồ, số lượng, giá bán, mức giảm giá có mã phiếu đặt hàng
là 'ORD2'
Kết quả
Câu 2: Trả về tất cả các thông tin từ bảng KHACHHANG và PHIEUDATHANG, thông tin
gồm họ tên khách hàng, số phiếu đặt hàng, ngày đặt hàng, trạng thái đơn hàng và ngày
khách hàng có thể đến lấy tại cửa hàng.
30
Kết quả
Câu 3: Hiển thị họ tên nhân viên, mã đơn đặt hàng, ngày đặt hàng, trạng thái đơn hàng và
ngày khách hàng có thể đến lấy tại cửa hàng có trong bảng PHIEUDATHANG
Kết quả
Câu 4. Phiếu đặt hàng mã ORD1 do ai đặt và do nhân viên nào lập, thời gian khách hàng
có thể đến lấy tại cửa hàng là khi nào?
Kết quả
31
Câu 1: Cho biết danh sách tất cả các khách hàng trong tên có chữ 'Duy'. Thông tin hiển thị
bao gồm: Họ tên khách hàng, mã khách hàng, giới tính.
Kết quả
Câu 2: Hiển thị các dòng đồng hồ có giá từ 2000000 đến 3000000, thông tin hiển thị gồm
mã dòng đồng hồ, tên dòng đồng hồ, giá và tên nhà sản xuất dòng đồng hồ đó.
Kết quả
Câu 3: Hiển thị 2 sản phẩm đầu tiên trong bảng DONG_DONGHO, thông tin gồm mã
dòng, tên dòng đồng hồ, giá và tên nhà sản xuất dòng đồng hồ đó.
Kết quả
32
d. Truy vấn có tính toán
Câu 1: Trong phiếu đặt hàng mã ORD4 đặt mua những dòng đồng hồ nào và số tiền mà
khách hàng phải trả cho mỗi dòng là bao nhiêu?
Kết quả
Câu 2: Hiển thị mức lương thấp nhất của nhân viên.
Kết quả
Câu 3: Hiển thị giá bán trung bình của các dòng đồng hồ.
Kết quả
Câu 1: Tổng số tiền mà khách hàng phải trả cho mỗi phiếu đặt hàng là bao nhiêu?
33
Code select p.MaPDH, sum(ct.SLgDat*Gia_dong*(1-Giamgia_phantram/100)) as
N'Tổng tiền theo từng phiếu đặt hàng'
from PHIEUDATHANG p, DONG_DONGHO dh, CHITIET_PDH ct
WHERE p.MaPDH = ct.MaPDH and ct.Ma_dong = dh.Ma_dong
GROUP BY p.MaPDH
Kết quả
Câu 2: Hãy cho biết mỗi một khách hàng đã phải bỏ ra bao nhiêu tiền để đặt mua đồng hồ
của cửa hàng?
Kết quả
Câu 3: Cập nhật tổng giá trị của từng hóa đơn vào bảng chi tiết hóa đơn khi khách hàng
đã tới lấy hàng.
34
select p.MaPDH, ct.Ma_dong, SLgDat, Gia_dong, Giamgia_phantram ,
sum(ct.SLgDat*Gia_dong*(1-Giamgia_phantram/100)) as total
from PHIEUDATHANG p, DONG_DONGHO dh, CHITIET_PDH ct,
HOADON hd
WHERE p.MaPDH = ct.MaPDH and ct.Ma_dong = dh.Ma_dong and
hd.MaPDH = P.MaPDH and TrangThaiDH = N'ĐÃ LẤY'
GROUP BY p.MaPDH, ct.Ma_dong, SLgDat, Gia_dong, Giamgia_phantram
) as R
on HOADON.MaPDH = R.MaPDH
Câu 4: Kiểm tra các đồng hồ mà khách hàng đã mua còn hạn bảo hành hay không?
Code select distinct dh.Seri, (case when DATEDIFF (Year, NgayHD, Getdate()) <=
ThoiHanBH then N'Còn Bảo hành!' else N'Đã hết hạn Bảo hành!' end) as
N'Tình trạng bảo hành'
from DONGHO dh, HOADON hd, DONG_DONGHO ddh
where ddh.Ma_dong = dh.Ma_dong and dh.MaHD = hd.MaHD
group by dh.Seri, hd.NgayHD, ddh.ThoiHanBH
35
Kết quả
Câu 1: Cho biết mã phiếu đặt hàng nào chỉ đặt duy nhất một dòng đồng hồ.
Kết quả
Câu 2: Trong năm 2022, những dòng đồng hồ nào chỉ được đặt mua đúng một lần.
Kết quả
36
Câu 3: Cho biết nhân viên nào đã lập từ 2 phiếu nhập hàng trở lên.Thông tin hiển thị bao
gồm: Mã nhân viên, tên nhân viên, số lượng phiếu đã lập.
Kết quả
Câu 1: Cho biết tổng số đơn hàng của nhân viên bán được có trạng thái phiếu đặt hàng là
'ĐÃ LẤY' theo thứ tự tăng dần.
Kết quả
Câu 2: Cho biết tổng số tiền hàng theo thứ tự tăng dần mà cửa hàng phải trả cho nhà cung
cấp trong mỗi tháng của năm 2022.
37
Kết quả
Câu 3: Hãy cho biết tổng số tiền lời mà cửa hàng thu được từ mỗi dòng đồng hồ trong năm
2022 theo thứ tự giảm dần (thời được gian tính theo ngày xuất hóa đơn).
Kết quả
Câu 1: Cho biết những nhân viên nào chưa từng lập bất kỳ một hoá đơn nào, thông tin
gồm mã nhân viên, tên nhân viên và số điện thoại.
38
Kết quả
Câu 2: Cho biết danh sách nhân viên được quản lý bởi Nguyễn Ngọc Hoàng (Mã nhân
viên: EBB2). Thông tin hiển thị bao gồm: Mã nhân viên, tên nhân viên, mã nhân viên quản
lý.
Kết quả
Câu 3: Mỗi một nhân viên của cửa hàng đã lập bao nhiêu hóa đơn? (nếu nhân viên chưa
hề lập một hoá đơn nào thì cho kết quả là 0)
Kết quả
39
i. Truy vấn con
Câu 1: Trong cửa hàng có những nhân viên nào có cùng ngày sinh?
Kết quả
Câu 2: Những dòng đồng hồ nào chưa từng được khách hàng đặt mua?
Kết quả
Câu 3: Những nhân viên nào của cửa hàng có mức lương cao nhất?
Kết quả
40
4. Trigger
a. Kiểm tra mã hàng có tồn tại trong đơn hàng tương ứng và số lượng trả không
vượt quá số lượng đã mua trong đơn hàng tương ứng
CREATE TRIGGER trgg_kiemtratrahangvatanghangton ON CHITIET_PT
FOR INSERT
AS
BEGIN
DECLARE @mahd char(4)
DECLARE @mapdh char(4)
DECLARE @madongtra char(4)
DECLARE @ngaytra date
DECLARE @ngaydat int
SELECT @mahd=MaHD FROM PHIEUTRA WHERE
PHIEUTRA.MaPT=(SELECT MaPT FROM inserted)
SELECT @mapdh=MaPDH FROM HOADON WHERE MaHD=@mahd
SELECT @madongtra=Ma_dong FROM inserted
SELECT @ngaytra=NgayPT FROM inserted
SELECT @ngaydat=NgayPDH FROM CHITIET_PDH WHERE
MaPDH=@mapdh AND Ma_dong=@madongtra
IF @ngaytra>DATEADD(day, 7, @ngaydat)
BEGIN
PRINT N'KHÔNG HỢP LỆ, VUI LÒNG KIỂM TRA LẠI NGÀY
TRẢ
ROLLBACK TRAN
END
END
ELSE
BEGIN
PRINT N’OKE MÀY’
END
END
b. Kiểm tra số lượng trong đơn đặt phải nhỏ hơn số lượng tồn và thực hiện trừ đi
lượng đặt vào hàng tồn
CREATE TRIGGER tr_kiemtratonkhovagiamhangton ON CHITIET_PDH
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @soluongton int
41
DECLARE @soluongdat int
DECLARE @madong char(4)
SELECT @madong=Ma_dong FROM inserted
SELECT @soluongton= SoLuongTon FROM DONG_DONGHO WHERE
Ma_dong=@madong
SELECT @soluongdat= SLgDat FROM inserted
IF (@soluongdat <= @soluongton)
BEGIN
UPDATE DONG_DONGHO
SET DONG_DONGHO.SoLuongTon = DONG_DONGHO.SoLuongTon -
inserted.SLgDat
FROM DONG_DONGHO INNER JOIN inserted
ON DONG_DONGHO.Ma_dong = inserted.Ma_dong
END
ELSE
BEGIN
PRINT N'Số lượng tồn không đủ cho đơn đặt hàng này'
ROLLBACK TRANSACTION
END
END
42
PHIEUNHAP.MaPN=(SELECT MaPN FROM inserted)
SELECT @madongnhap=Ma_dong FROM inserted
IF @madongnhap NOT IN (SELECT Ma_dong FROM DONG_DONGHO
WHERE MaNSX=@mansx)
BEGIN
PRINT N'NSX của đơn nhập hàng này không sản xuất loại đồng hồ vừa
nhập'
ROLLBACK TRAN
END
END
43
DECLARE @tuoinhanvien int
SELECT @tuoinhanvien = (YEAR(GETDATE()) - YEAR(NgSinhNV)) FROM
inserted
IF @tuoinhanvien <= 18
BEGIN
PRINT N'Nhân viên phải trên 18 tuổi'
ROLLBACK TRANSACTION
END
END
h. Khi thay đổi cột số lượng trong bảng CHITIET_PDH thì cập nhật lại số lượng tồn
trong bảng DONG_DONGHO
create trigger tr_suaCTDH on CHITIET_PDH
for update
as
declare @D int
select @D = count(*) from DONG_DONGHO dh, deleted d, inserted i
where dh.Ma_dong = d.Ma_dong and dh.Ma_dong = i.Ma_dong
and dh.SoLuongTon + d.SLgDat - i.SLgDat <0
if(@D>0)
begin
44
print N'Số lượng tồn không đủ cho đơn đặt hàng này'
rollback transaction
end
update DONG_DONGHO set SoLuongTon = dh.SoLuongTon + d.SLgDat - i.SLgDat
from DONG_DONGHO dh, deleted d, inserted i where dh.Ma_dong = i.Ma_dong
KẾT LUẬN
Qua bài báo cáo này tụi em đã hiểu được cách để tạo được một hệ quản trị cơ sở dữ liệu với
nhiều tính năng chi tiết hơn, kế thừa từ môn cơ sở dữ liệu. Hệ cơ sở dữ liệu của tụi em còn
chưa được tối ưu hoá và còn nhiều thiếu xót mong thầy đọc và góp ý để chúng em rút kinh
nghiệm và phát triển hệ cơ sở dữ liệu này một cách hoàn thiện hơn.
Tụi em xin cảm ơn thầy đã dành thời gian cùng bọn em trong đồ án này.
45
SELECT @mahd=MaHD FROM PHIEUTRA WHERE
PHIEUTRA.MaPT=(SELECT MaPT FROM inserted)
SELECT @ngaytra= TgianTra FROM inserted
SELECT @ngaydat=NgayHD FROM HOADON WHERE MaHD=@mahd
IF @ngaytra>DATEADD(day, 7, @ngaydat)
BEGIN
PRINT N'KHÔNG HỢP LỆ, VUI LÒNG KIỂM TRA LẠI NGÀY TRẢ'
ROLLBACK TRAN
END
ELSE
BEGIN
PRINT N'OKE MÀY'
END
END
46