You are on page 1of 46

THUYẾT TRÌNH

1. Giới thiệu + quy trình (HOÀNG)


2. ERD (VY)
3. RD (KIM)
- 2. Lược đồ quan hệ - kèm hình

4. RBTV (QUÂN)
5. TRIGGER (DUY)
6. ĐÁNH GIÁ + KẾT THÚC(VỸ)

PHẦN 1: MÔ TẢ QUY TRÌNH HỆ THỐNG


1. Mô tả bài toán:
2. Mô tả quy trình của hệ thống:
3. Điều kiện lí tưởng đặt ra cho mô hình
4. Mô tả về dữ liệu cần lưu trữ:
a) Mô tả thực thể:
b) Mô tả mối kết hợp giữa các thực thể:
PHẦN 2: XÂY DỰNG CSDL
1. Mô hình thực thể kết hợp
2. Lược đồ quan hệ
3. Diễn giải bảng và thuộc tính
4. Mô hình diễn giải
5. Ràng buộc toàn vẹn
a. Mã dòng đồng hồ không được phép trùng nhau
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
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 đó.
d. Ngày đặt đơn phải nhỏ hơn ngày có thể lấy hàng
6. Xây dựng các phép toán đại số quan hệ:
a. Phép chọn
b. Phép chiếu
c. Phép giao
d. Phép hội
e. Phép trừ
f. Phép Tích Decac
g. Phép kết nối

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.

Chúng em xin chân thành cảm ơn !


Thật hạnh phúc và vui sướng biết bao khi tụi em có một người giảng viên như thầy Bùi
Xuân Huy.

PHẦN 1: MÔ TẢ QUY TRÌNH HỆ THỐNG

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:

2. Mô tả quy trình của hệ thống:

- Nhập hàng từ nhà sản xuất


+ Cửa hàng muốn có đồng hồ để bán thì cần phải nhập đồng hồ từ nhà sản xuất thông
qua phiếu nhập hàng.
+ Sau khi đã kiểm kê đầy đủ phiếu nhập hàng, cửa hàng phân công nhân viên thực hiện
công việc theo dõi trạng thái đơn hàng.

- Khách hàng đặt hàng:


+ Khách hàng có nhu cầu mua sản phẩm sẽ truy cập vào website chọn sản phẩm cần
mua và điền thông tin cá nhân để ghi nhận thông tin thanh toán trên phiếu đặt hàng.

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.

- Khách hàng lấy hàng:


+ Khi khách hàng đến cửa hàng lấy hàng thì nhân viên sẽ lập hóa đơn xác nhận khách
đã nhận hàng. Thời hạn bảo hành và trả hàng sẽ tính từ ngày khách nhận hàng (ngày
lập hoá đơn).

- Sau bán hàng:


+ Khách hàng sẽ nhận được những dịch vụ sau khi mua đồng hồ, cụ thể là phiếu trả
hàng khi khách hàng gặp vấn đề, phiếu bảo hành phòng trường hợp hàng bị hư hại.

3. Điều kiện lí tưởng đặt ra cho mô hình:


- Mọi nhân viên đều được đào tạo bài bản và có tính cẩn thận.
- Khi đặt hàng nhập từ nhà sàn xuất, mọi đơn hàng đều được giao đầy đủ mọi mặt hàng
được đặt và nhập kho ngay trong ngày, vì vậy phiếu đặt hàng cho nhà sản xuất và phiếu
nhập kho có thể dùng chung.
- Giá nhập hàng từ các nhà sản xuất không đổi theo thời gian.
- ….
4. Mô tả về dữ liệu cần lưu trữ:
a) Mô tả thực thể:

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.

b) Mô tả mối kết hợp giữa các thực thể:

Mối quan hệ Đặt hàng


● Thực thể tham gia: Khách hàng, Phiếu đặt hàng
● Mỗi khách hàng có thể có nhiều phiếu đặt hàng. Mỗi phiếu đặt hàng chỉ thuộc về một
khách hàng
Mối quan hệ Chi tiết phiếu đặt hàng
● Thực thể tham gia: Phiếu đặt hàng, Dòng đồng hồ
● Mỗi phiếu đặt hàng bao gồm nhiều dòng đồng hồ. Mỗi dòng đồ hồ có thể thuộc về
nhiều phiếu đặt hàng
Mối quan hệ Thuộc
● Thực thể tham gia: Phiếu đặt hàng, Hóa đơn
● Mỗi phiếu đặt hàng chỉ có một hóa đơn và mỗi hóa đơn chỉ thuộc một phiếu đặt hàng
Mối quan hệ Gồm
● Thực thể tham gia: Hóa đơn, Đồng hồ
● Mỗi phiếu đặt hàng gồm nhiều đồng hồ. Mỗi đồng hồ chỉ thuộc một 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

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)

CHITIET_PDH ( MaPDH, Ma_dong, SLgDat, GiamGia_phantram)

PHIEUTRA(MaPT, MaNV, MaHD)

CHITIET_PT (MaPT, Ma_dong, SLgTra, TgianTra)


HOADON(MaHD, NgayHD, MaNV, MaPDH)
3. Diễn giải bảng và thuộc tính
Bảng DONG_DONGHO
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc

8
Ma_dong Mã dòng đồng hồ char(4) Khóa chính

Ten_dong Tên dòng đồng hồ nvarchar (20)

Gia_dong Giá dòng đồng hồ real

SoLuongTon Số lượng tồn của dòng int


đồng hồ

ThoihanBH Thời hạn bảo hành sản int


phẩm theo năm

MaNSX Mã nhà sản xuất char(4) Khóa ngoại

Bảng DONGHO
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc

Seri số seri của từng đồng hồ varchar(6) Khóa chính

Size Size mặt đồng hồ nvarchar (20)

Color Màu Mặt Số nvarchar (20)

Ma_dong Mã dòng đồng hồ char(4) Khóa ngoại

MaHD Mã hóa đơn char(4) Khóa ngoại

Bảng NHASANXUAT
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc

MaNSX Mã nhà sản xuất char(4) Khóa chính

TenNSX Tên nhà sản xuất (nhãn hiệu nvarchar (255)


đồng hồ)

DiaChiNSX Địa chỉ nvarchar (255)

EmailNSX Email của nhà sản xuất nvarchar (50)

SdtNSX Số điện thoại của nhà sản varchar (15)


xuất

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

HoTenNV Họ tên nhân viên nvarchar (255)

Phai Giới tính nvarchar (3)

NgSinhNV Ngày sinh date

SdtNV Số điện thoại varchar (15)

DiaChiNV Địa chỉ nvarchar (255)

EmailNV Email nhân viên nvarchar (50)

MucLuong Mức lương real

MaNVquanly Mã nhân viên quản lý char(4) Khóa ngoại

Bảng KHACHHANG
Tên thuộc tính Mô tả Kiểu dữ liệu Độ dài

MaKH Mã khách hàng char(4) Khóa chính

HoTenKH Họ tên khách hàng nvarchar (255)

GioiTinhKH Giới tính nvarchar(3)

NgSinhKH Ngày sinh của khách hàng date

SdtKH Số điện thoại của khách varchar (15)


hàng

DiaChiKH Địa chỉ giao hàng nvarchar (255)

EmailKH Email khách hàng nvarchar (50)

Bảng PHIEUNHAP
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc

MaPN Mã của phiếu nhập char(4) Khóa chính

NgayPN ngày phát hành phiếu nhập date


(ngày nhập hàng)

MaNSX Mã nhà sản xuất char(4) Khóa ngoại

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

MaPN Mã của phiếu nhập char(4) Khóa chính (tạo


thành từ 2 khóa
MaSP Mã sản phẩm char(4) ngoại)

SLgSP Số lượng của từng dòng int


đồng hồ cần nhập

GiaNhap Giá nhập của từng dòng real


đồng hồ

Bảng PHIEUDATHANG
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc

MaPDH Mã số của phiếu đặt hàng char(4) Khóa chính

NgayDat Ngày đặt hàng date

Ngaycothelay Ngày khách hàng có thể đến date


lấy hàng

TrangThaiDH Trạng thái đơn hàng nvarchar(50)

MaKH Mã khách hàng char(4) Khóa ngoại

MaNV Mã nhân viên char(4) Khóa ngoại

Bảng CHITIET_PDH
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc

MaPDH Mã số của phiếu đặt hàng char(4) Khóa chính (tạo


thành từ 2 khóa
ngoại)
Ma_dong Mã dòng đồng hồ char(4)

SLgDat Số lượng đặt hàng int

GiamGia_phantram % giảm giá int

11
Bảng PHIEUTRA
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc

MaPT Mã của phiếu trả hàng char(4) Khóa chính

MaNV Mã nhân viên lập phiếu trả char(4) Khóa ngoại

MaHD Mã số hóa đơn char(4) Khóa ngoại

Bảng CHITIET_PT
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc

MaPT Mã của phiếu trả char(4) Khóa chính (tạo


hàng thành từ 2 khóa
ngoại)
Ma_dong Mã dòng đồng hồ char(4)

SLgTra Số lượng trả int

TgianTra Thời gian trả hàng date

Bảng HOADON
Tên thuộc tính Mô tả Kiểu dữ liệu Ràng buộc

MaHD Mã số hóa đơn char(4) Khóa chính

NgayHD Ngày in hóa đơn date

MaNV Mã nhân viên in hóa đơn char(4) Khóa ngoại

MaPDH Mã số của phiếu đặt hàng char(4) Khóa ngoại

4. Mô hình diễn giải

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

DONG_DONGHO +(Ma_dong) +(Ma_dong)


*Tương tự cho các bảng còn lại khi tạo RBTV khóa chính trừ bảng có khóa chính được tạo
từ 2 khóa ngoại trở lên*

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

DONG_DONGHO +MaPN, Ma_dong +MaPN, Ma_dong


*Tương tự cho các bảng có khóa chính được tạo từ 2 khóa ngoại trở lên*
c. Ràng buộc khoá ngoại

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

DONG_DONGHO +SoLuongTon, Ma_dong +SoLuongTon

CHITIET_PDH +SLgDat, Ma_dong +SLgDat, Ma_dong

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

PHIEUDATHANG +NgayDat,NgayCoTheLay +NgayDat,NgayCoTheLay

6. Xây dựng các phép toán đại số quan hệ:


a. Phép chọn
Phép toán 1: Chọn toàn bộ nhân viên có giới tính là nam
KẾT QUẢ ← σPhai = N‘Nam’ (NHANVIEN)
Phép toán 2: Chọn toàn bộ khách hàng có giới tính là nữ và trong tên có chữ ‘’Thị”
KẾT QUẢ ← σGioitinhKH = N‘Nữ’ Λ HoTenKH = N‘%Thị%’ (KHACHHANG)
b. Phép chiếu
Phép toán 1: Cho biết danh sách của toàn bộ nhà sản xuất, thông tin hiển thị bao gồm
mã nhà sản xuất, tên nhà sản xuất và số điện thoại của họ.
KẾT QUẢ ← πMaNSX, TenNSX, SdtNSX (NHASANXUAT)
Phép toán 2: Cho biết danh sách của toàn bộ dòng đồng hồ có thời hạn bảo hành là 2 năm,
thông tin hiển thị bao gồm tên dòng đồng hồ và giá của dòng đó.
KẾT QUẢ ← πTen_dong, Gia_dong (σThoihanBH = 2 (DONG_DONGHO))
c. Phép giao
Phép toán 1: Cho biết danh sách các mã nhân viên của nhân viên lập cả 2 phiếu đặt hàng có
mã là ORD1 và ORD3
KẾT QUẢ ← πMaNV (σMaPDH = ‘ORD1’ (PHIEUDATHANG)) ∩ πMaNV (σMaPDH = ‘ORD3’
(PHIEUDATHANG))
Phép toán 2: Cho biết danh sách nhân viên có người quản lý, thông tin hiển thị bao
gồm mã nhân viên, tên nhân viên.
KẾT QUẢ ← πMaNV, HoTenNV (NHANVIEN) ∩ πMaNV, HoTenNV (σMaNVquanly = ‘NULL’ (NHANVIEN))
Phép toán 3: 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.
KẾT QUẢ ← πMaNV (NHANVIEN) ∩ πMaNV (PHIEUDATHANG)
Phép toán 4: Cho biết danh sách mã khách hàng của khách hàng đã đặt mua dòng đồng hồ
bất kỳ.

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)

f. Phép Tích Decac


Phép toán 1: Cho biết những khách hàng nào đã trả tiền đơn hàng vào ngày 12/12/2022.
Thông tin hiển thị bao gồm tên khách hàng, mã phiếu đặt hàng, ngày đặt hàng.
KẾT QUẢ ← πHoTenKH, MaPDH, NgayDat (σNgayHD = ‘2022-12-12’(KHACHHANG ✖ PHIEUDATHANG
✖ HOADON))
Phép toán 2: Cho biết các nhân viên đã lập hóa đơn vào ngày 10/9/2022. Thông tin
hiển thị bao gồm tên nhân viên, giới tính, số điện thoại, mã nhân viên quản lý của nhân viên
đó.
KẾT QUẢ ← πHoTenNV, Phai, SdtNV, MaNVquanly (σNgayHD = ‘2022-9-10’(NHANVIEN ✖ HOADON))
Phép toán 3: Cho biết thông tin của các phiếu đặt hàng đang giao. Thông tin hiển thị bao
gồm mã phiếu đặt hàng, ngày đặt hàng, mã dòng đồng hồ và số lượng đặt.
KẾT QUẢ ← πMaPDH, NgayDat, Ma_dong, SLgDat (σTrangThaiDH = N‘ĐANG GIAO’(PHIEUDATHANG ✖
CHITIET_PDH))
g. Phép kết nối
Phép toán 1: Cho biết thông tin các dòng đồng hồ có giá bán cao nhất.
R(gia) ← πGia_dong(DONG_DONGHO)
KẾT QUẢ ← σ Gia_dong = MAX(Gia_dong) (DONG_DONGHO ⋈ R)
Phép toán 2: Cho biết thông tin các phiếu nhập hàng của mỗi nhân viên.
KẾT QUẢ ← σMaNV (NHANVIEN) = MaNV (PHIEUNHAP) (NHANVIEN ⋈ PHIEUNHAP)

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)

PHẦN 3: CÀI ĐẶT CƠ SỞ DỮ LIỆU


1. Lệnh mô tả dữ liệu : DDL
a. Tạo database
Dùng lệnh SQL:
CREATE DATABASE Watch_Management
USE Watch_Management

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
);

1.2. Tạo bảng DONG_DONGHO (Dòng Đồng Hồ):


CREATE TABLE DONG_DONGHO
(
Ma_dong CHAR(4) PRIMARY KEY,

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
);

1.3. Tạo bảng NHANVIEN (Nhân Viên):


CREATE TABLE NHANVIEN
(
MaNV CHAR(4) PRIMARY KEY,
HoTenNV NVARCHAR(255) not null,
Phai NVARCHAR(3) CHECK (Phai IN (N'Nam', N'Nữ')),
NgSinhNV DATE not null,
SdtNV VARCHAR (15) not null,
DiaChiNV NVARCHAR(255),
EmailNV NVARCHAR(50) not null,
MucLuong REAL not null,
MaNVquanly INT
);

1.4. Tạo bảng KHACHHANG (Khách Hàng):


CREATE TABLE KHACHHANG
(
MaKH CHAR(4) PRIMARY KEY,
HoTenKH NVARCHAR(255) not null,
GioiTinhKH NVARCHAR(3) DEFAULT(N'Nam'),
NgSinhKH DATE not null,
SdtKH VARCHAR(15) not null,
DiaChiKH NVARCHAR(255),
EmailKH NVARCHAR(50) not null
);

1.5. Tạo bảng PHIEUNHAP (Phiếu Nhập):


CREATE TABLE PHIEUNHAP
(
MaPN CHAR(4) PRIMARY KEY,
NgayPN DATE DEFAULT GETDATE(),
MaNSX CHAR(4) references NHASANXUAT(MaNSX) not null,
MaNV CHAR(4) references NHANVIEN(MaNV)
);

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)
);

1.7. Tạo bảng PHIEUDATHANG (Phiếu Đặt Hàng):


CREATE TABLE PHIEUDATHANG
(
MaPDH CHAR(4) PRIMARY KEY,
NgayDat DATE DEFAULT GETDATE(),
TrangThaiDH NVARCHAR(50) not null,
MaKH CHAR(4) references KHACHHANG(MaKH) not null,
MaNV CHAR(4) references NHANVIEN(MaNV) not null,
NgayCoTheLay DATE not null
);

1.8. Tạo bảng CHITIET_PDH (Chi Tiết Phiếu Đặt Hàng) :


CREATE TABLE CHITIET_PDH
(
MaPDH CHAR(4) references PHIEUDATHANG(MaPDH) not null ,
Ma_dong CHAR(4)references DONG_DONGHO(Ma_dong) not null,
SLgDat INT not null,
Giamgia_phantram INT not null,
PRIMARY KEY (MaPDH, Ma_dong),
);

1.9. Tạo bảng HOADON (Hóa Đơn):


CREATE TABLE HOADON
(
MaHD CHAR(4) PRIMARY KEY,
NgayHD DATE DEFAULT (GETDATE()),
MaPDH CHAR(4) references PHIEUDATHANG(MaPDH) not null,
MaNV CHAR(4)references NHANVIEN(MaNV) not null
);

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
);

1.11. Tạo bảng CHITIET_PT (Chi Tiết Phiếu Trả):


CREATE TABLE CHITIET_PT
(
MaPT CHAR(4) references PHIEUTRA(MaPT) not null,
Ma_dong CHAR(4) references DONG_DONGHO(Ma_dong) not null,
SLgTra INT not null,
TgianTra DATE not null,
PRIMARY KEY (MaPT, Ma_dong),
);

1.12. Tạo bảng DONGHO (Đồng Hồ):


CREATE TABLE DONGHO
(
Seri VARCHAR(6) PRIMARY KEY,
Size NVARCHAR(20) not null,
Color NVARCHAR(20) not null,
Ma_dong CHAR(4) references DONG_DONGHO(Ma_dong),
MaHD CHAR(4) references HOADON(MaHD)
);

c. Thay đổi cấu trúc bảng:


YÊU CẦU: Đổi kiểu dữ liệu MaNVquanly từ INT trong bảng NHANVIEN thành
CHAR(4)

CODE ALTER TABLE NHANVIEN


ALTER COLUMN MaNVquanly CHAR(4);

YÊU CẦU: Thêm cột ThanhTien cho bảng HOADON

CODE ALTER TABLE HOADON


ADD ThanhTien REAL;

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:

CODE INSERT INTO NHASANXUAT (MaNSX, TenNSX, DiaChiNSX,


EmailNSX, SdtNSX)
VALUES ('000A', 'CASIO', 'TPHCM','casiovietnam@gmail.com',
'(0283) 927 3778');
INSERT INTO NHASANXUAT (MaNSX, TenNSX, DiaChiNSX,
EmailNSX, SdtNSX)
VALUES ('000B', 'SEIKO', N'HÀ NỘI',NULL, '(0283) 822 0997');
INSERT INTO NHASANXUAT (MaNSX, TenNSX, DiaChiNSX,
EmailNSX, SdtNSX)
VALUES ('000C', 'Citizen', 'TPHCM','citizenvietnam@gmail.com',
'(0283) 821 8297');
INSERT INTO NHASANXUAT (MaNSX, TenNSX, DiaChiNSX,
EmailNSX, SdtNSX)
VALUES ('000D', 'OlymPianus', N'ĐÀ
NẴNG','citizenwatchvietnam@gmail.com', '(0251) 3514 555');

KẾT QUẢ

1.2. Thêm dữ liệu vào bảng Dòng Đồng Hồ:

CODE INSERT INTO DONG_DONGHO (Ma_dong, Ten_dong, Gia_dong,


SoLuongTon, ThoihanBH, MaNSX)
VALUES ('D001', 'GSHOCK', 2500000, 10, 2, '000A');
INSERT INTO DONG_DONGHO (Ma_dong, Ten_dong, Gia_dong,
SoLuongTon, ThoihanBH, MaNSX)
VALUES ('D002', 'DW', 2700000, 10, 2, '000B');
INSERT INTO DONG_DONGHO (Ma_dong, Ten_dong, Gia_dong,
SoLuongTon, ThoihanBH, MaNSX)
VALUES ('D003', 'BABY-G', 2400000, 10, 1,'000A');
INSERT INTO DONG_DONGHO (Ma_dong, Ten_dong, Gia_dong,
SoLuongTon, ThoihanBH, MaNSX)
VALUES ('D004', 'CURNON', 3200000, 10, 2,'000C');
INSERT INTO DONG_DONGHO (Ma_dong, Ten_dong, Gia_dong,

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Ả

1.3. Thêm dữ liệu vào bảng Nhân Viên:


CODE INSERT INTO NHANVIEN (MaNV, HoTenNV, Phai, NgSinhNV, SdtNV,
DiaChiNV, EmailNV, MucLuong, MaNVquanly)
VALUES ('EAA1',N'BÙI XUÂN VĨ',N'NAM','2000-11-28',
'0375779075', NULL, 'vibui@gmail.com', '5000000', 'EAA2');
INSERT INTO NHANVIEN (MaNV, HoTenNV, Phai, NgSinhNV, SdtNV,
DiaChiNV, EmailNV, MucLuong, MaNVquanly)
VALUES ('EAA2',N'HỒ THỊ YẾN VY',N'NỮ','1999-1-15',
'0937550157', N'TIỀN GIANG', 'vyho@gmail.com','10000000', 'EBB2');
INSERT INTO NHANVIEN (MaNV, HoTenNV, Phai, NgSinhNV, SdtNV,
DiaChiNV, EmailNV, MucLuong, MaNVquanly)
VALUES ('EBB1',N'ĐẶNG LÊ MINH QUÂN',N'NAM','1999-1-15',
'0368912316', 'TPHCM', 'quandang@gmail.com','75000000', 'EBB2');
INSERT INTO NHANVIEN (MaNV, HoTenNV, Phai, NgSinhNV, SdtNV,
DiaChiNV, EmailNV, MucLuong, MaNVquanly)
VALUES ('EBB2',N'NGUYỄN NGỌC HOÀNG',N'NAM','2000-11-
15', '0375123456', N'BÌNH PHƯỚC', 'hoangnguyen@gmail.com', '3500000',
NULL);

KẾT QUẢ

1.4. Thêm dữ liệu vào bảng Khách Hàng:


CODE INSERT INTO KHACHHANG (MaKH, HoTenKH, GioiTinhKH,
NgSinhKH, SdtKH, DiaChiKH, EmailKH)

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Ả

1.5. Thêm dữ liệu vào bảng Hóa Đơn:


CODE INSERT INTO HOADON (MaHD, NgayHD, MaPDH, MaNV)
VALUES ('BIL1', '2022-12-22', 'ORD4', 'EAA2');
INSERT INTO HOADON (MaHD, NgayHD, MaPDH, MaNV)
VALUES ('BIL2', '2022-12-20', 'ORD5', 'EBB2');
INSERT INTO HOADON (MaHD, NgayHD, MaPDH, MaNV)
VALUES ('BIL3', '2022-12-27', 'ORD2', 'EAA1');
INSERT INTO HOADON (MaHD, NgayHD, MaPDH, MaNV)
VALUES ('BIL4', '2022-12-23', 'ORD1', 'EAA1');

22
KẾT QUẢ

1.6. Thêm dữ liệu vào bảng Phiếu Nhập:


CODE INSERT INTO PHIEUNHAP (MaPN, NgayPN, MaNSX, MaNV)
VALUES ('IMP1', '2021-12-12', '000A','EAA1');
INSERT INTO PHIEUNHAP (MaPN, NgayPN, MaNSX, MaNV)
VALUES ('IMP2', '2022-06-12', '000B','EAA1');
INSERT INTO PHIEUNHAP (MaPN, NgayPN, MaNSX, MaNV)
VALUES ('IMP3', '2022-12-12', '000C','EBB1');

KẾT QUẢ

1.7. Thêm dữ liệu vào bảng Chi Tiết Phiếu Nhập:


CODE INSERT INTO CHITIET_PN (MaPN, Ma_dong, SoLgSP,GiaNhap)
VALUES ('IMP1', 'D001', 20, '2200000');
INSERT INTO CHITIET_PN (MaPN, Ma_dong, SoLgSP,GiaNhap)
VALUES ('IMP2','D002',15, '2500000');
INSERT INTO CHITIET_PN (MaPN, Ma_dong, SoLgSP,GiaNhap)
VALUES ('IMP3', 'D004',10, '3000000');
INSERT INTO CHITIET_PN (MaPN, Ma_dong, SoLgSP,GiaNhap)
VALUES ('IMP3', 'D003',20, '2000000');
INSERT INTO CHITIET_PN (MaPN, Ma_dong, SoLgSP,GiaNhap)
VALUES ('IMP1', 'D005',10, '6000000');

23
KẾT QUẢ

1.8. Thêm dữ liệu vào bảng Phiếu Đặt Hàng:


CODE INSERT INTO PHIEUDATHANG (MaPDH, NgayDat, TrangThaiDH,
MaKH, MaNV, NgayCoTheLay)
VALUES ('ORD1', DEFAULT, N'ĐÃ LẤY','C001','EBB1','2022-
12-22');
INSERT INTO PHIEUDATHANG (MaPDH, NgayDat, TrangThaiDH,
MaKH, MaNV, NgayCoTheLay)
VALUES ('ORD2', '2022-12-20', N'ĐÃ LẤY','C002','EAA1','2022-
12-27');
INSERT INTO PHIEUDATHANG (MaPDH, NgayDat, TrangThaiDH,
MaKH, MaNV, NgayCoTheLay)
VALUES ('ORD3', '2022-12-11', N'CHỜ LẤY','C003','EBB2','2022-
12-20');
INSERT INTO PHIEUDATHANG (MaPDH, NgayDat, TrangThaiDH,
MaKH, MaNV, NgayCoTheLay)
VALUES ('ORD4', '2021-12-15', N'ĐÃ LẤY','C003','EBB2','2021-
12-22');
INSERT INTO PHIEUDATHANG (MaPDH, NgayDat, TrangThaiDH,
MaKH, MaNV, NgayCoTheLay)
VALUES ('ORD5', '2022-12-13', N'ĐÃ LẤY','C002','EAA1','2022-
12-20');
INSERT INTO PHIEUDATHANG (MaPDH, NgayDat, TrangThaiDH,
MaKH, MaNV, NgayCoTheLay)
VALUES ('ORD6', '2022-12-13', N'CHỜ LẤY','C001','EBB2','2022-
12-20');

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Ả

1.10. Thêm dữ liệu vào bảng Phiếu Trả:


CODE INSERT INTO PHIEUTRA (MaPT, MaNV, MaHD)
VALUES ('RT01','EAA2','BIL1');
INSERT INTO PHIEUTRA (MaPT, MaNV, MaHD)
VALUES ('RT02','EAA1','BIL2');
INSERT INTO PHIEUTRA (MaPT, MaNV, MaHD)
VALUES ('RT03','EBB1','BIL3');

KẾT QUẢ

1.11. Thêm dữ liệu vào Chi Tiết Phiếu Trả:


CODE INSERT INTO CHITIET_PT (MaPT, Ma_dong, SLgTra, TgianTra)
VALUES ('RT02', 'D003', 1, '2022-12-20');
INSERT INTO CHITIET_PT (MaPT, Ma_dong, SLgTra, TgianTra)
VALUES ('RT01', 'D001', 1, '2022-12-31');

KẾT QUẢ

1.12. Thêm dữ liệu vào bảng Đồng Hồ:

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Ả

b. Cập nhật dữ liệu bằng câu lệnh SQL:

YÊU CẦU: Cập nhật địa chỉ nhân viên có mã nhân viên là EAA1:

CODE UPDATE NHANVIEN


SET DiaChiNV = N'TIỀN GIANG'
WHERE MaNV = 'EAA1';

KẾT QUẢ Trước khi chạy:

Sau khi chạy:

YÊU CẦU: Cập nhật email của nhà sản xuất

CODE UPDATE NHASANXUAT


SET EmailNSX = 'seikovietnam@gmail.com'
WHERE MaNSX = '000B';

KẾT QUẢ Trước khi chạy:

27
Sau khi chạy:

c. Xóa dữ liệu bằng câu lệnh SQL:


YÊU CẦU: Xóa dữ liệu Khách Hàng C006

CODE DELETE FROM KHACHHANG


WHERE MaKH = 'C006';

KẾT QUẢ Trước khi chạy:

Sau khi chạy:

YÊU CẦU: Xóa dữ liệu Dòng Đồng Hồ 0006

CODE DELETE FROM DONG_DONGHO


WHERE Ma_dong = 'D006';

KẾT QUẢ Trước khi chạy:

28
Sau khi chạy:

3. Lệnh truy vấn dữ liệu: SQL


a. Truy vấn sử dụng 1 bảng

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 đó.

Code select HoTenNV, MaNV, EmailNV, MaNVquanly


from NHANVIEN

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ý.

Code select HoTenNV, MaNV, EmailNV, MaNVquanly


from NHANVIEN
where MaNVquanly = 'EBB2'

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.

Code select HoTenKH, MaKH, GioiTinhKH


from KHACHHANG
where HoTenKH like N'Lê%'

Kết quả

b. Truy vấn sử dụng nhiều bảng

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'

Code select s.Ten_dong, c.SLgDat, s.Gia_dong, c.GiamGia_phantram


from DONG_DONGHO s inner join CHITIET_PDH c on c.Ma_dong =
s.Ma_dong where c.MaPDH='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.

Code select k.HoTenKH, p.MaPDH, p.NgayDat,p.TrangThaiDH, p.NgayCoTheLay


from KHACHHANG k
full join PHIEUDATHANG p on k.MaKH = p.MaKH

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

Code select n.HoTenNV, d.MaPDH, d.NgayDat, d.TrangThaiDH, d.NgayCoTheLay


from NHANVIEN n
right join PHIEUDATHANG d
on d.MaNV = n.MaNV

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?

Code select MaPDH, HoTenKH, HoTenNV, NgayCoTheLay


from PHIEUDATHANG p, NHANVIEN n, KHACHHANG k
where p.MaNV = n.MaNV and p.MaKH = k.MaKH and MaPDH = 'ORD1'

Kết quả

c. Truy vấn có điều kiện (AND, OR, LIKE, BETWEEN...)

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.

Code select HoTenKH, MaKH, GioiTinhKH


from KHACHHANG
where HoTenKH like '%Duy%' or HoTenKH like '%DUY%'

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ồ đó.

Code select dh.Ma_dong, dh.Ten_dong, dh.Gia_dong, nsx.TenNSX


from DONG_DONGHO dh, NHASANXUAT nsx
where dh.MaNSX = nsx.MaNSX and dh.Gia_dong between 2000000 and
3000000

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ồ đó.

Code select top(2) dh.Ma_dong, dh.Ten_dong, dh.Gia_dong, nsx.TenNSX


from DONG_DONGHO dh, NHASANXUAT nsx
where dh.MaNSX = nsx.MaNSX

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?

Code select ct.Ma_dong, Ten_dong, Gia_dong, SLgDat, Giamgia_phantram,


(ct.SLgDat*Gia_dong*(1-Giamgia_phantram/100)) as N'Tổng tiền theo từng
dòng đồng hồ'
from PHIEUDATHANG p, DONG_DONGHO dh, CHITIET_PDH ct
where p.MaPDH = ct.MaPDH and ct.Ma_dong = dh.Ma_dong and p.MaPDH
= 'ORD4'

Kết quả

Câu 2: Hiển thị mức lương thấp nhất của nhân viên.

Code SELECT MIN(MucLuong) AS N'Lương nhân viên thấp nhất'


from NHANVIEN

Kết quả

Câu 3: Hiển thị giá bán trung bình của các dòng đồng hồ.

Code SELECT AVG(Gia_dong) AS N'Giá bán trung bình'


from DONG_DONGHO

Kết quả

e. Truy vấn có gom nhóm (GROUP BY)

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?

Code select k.HoTenKH,sum(ct.SLgDat*Gia_dong*(1-Giamgia_phantram/100)) as


N'Tổng'
from PHIEUDATHANG p, CHITIET_PDH ct, KHACHHANG k,
DONG_DONGHO dh
where p.MaKH = K.MaKH and P.MaPDH = ct.MaPDH and ct.Ma_dong =
dh.Ma_dong
group by k.HoTenKH

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.

Code update HOADON


set Thanhtien = total
from HOADON
JOIN (

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

Kết quả Trước khi chạy

Sau khi chạy

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ả

f. Truy vấn gom nhóm có điều kiện (GROUP BY + HAVING)

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ồ.

Code select ct.MaPDH, count(ct.Ma_dong) as 'Số dòng'


from CHITIET_PDH ct
group by ct.MaPDH
having count(*) = 1

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.

Code select Ten_dong, count(ct.Ma_dong) as 'Lần đặt'


from DONG_DONGHO dh, PHIEUDATHANG P, CHITIET_PDH ct
where dh.Ma_dong = ct.Ma_dong and ct.MaPDH = p.MaPDH and
year(NgayDat) = 2022
group by Ten_dong
having count(ct.Ma_dong) = 1

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.

Code select p.MaNV, HotenNV, count(p.MaNV) as 'Số phiếu lập'


from NHANVIEN nv, PHIEUNHAP p
where nv.MaNV = p.MaNV
group by p.MaNV, HotenNV
having count(p.MaNV) >= 2

Kết quả

g. Truy vấn sử dụng điều kiện WHERE + GROUP BY + ORDER BY

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.

Code select p.MaNV, count(*) as 'Tổng đơn hàng'


from PHIEUDATHANG p
where p.TrangThaiDH = N'ĐÃ LẤY'
group by p.MaNV
order by count(*) asc

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.

Code select month(NgayPN) as 'Tháng', sum(SoLgSP*GiaNhap) as 'Tổng tiền hàng'


from CHITIET_PN ctpn, PHIEUNHAP p
where ctpn.MaPN = p.MaPN and year(NgayPN) = 2022
group by month(NgayPN)
order by sum(SoLgSP*GiaNhap) asc

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).

Code select dh.Ma_dong, Ten_dong,


sum(ct.SLgDat*Gia_dong*(1-Giamgia_phantram/100)) as 'Tổng tiền bán
được',
sum(ct.SLgDat * ctpn.GiaNhap ) as 'Tổng tiền hàng nhập vào',
sum(ct.SLgDat*Gia_dong*(1-Giamgia_phantram/100)) - sum(ct.SLgDat *
ctpn.GiaNhap ) as 'Tiền lời'
from CHITIET_PN ctpn, CHITIET_PDH ct, DONG_DONGHO dh,
HOADON hd
where ct.Ma_dong = dh.Ma_dong and ct.MaPDH = hd.MaPDH
and ctpn.Ma_dong = dh.Ma_dong and year(NgayHD) = 2022
group by dh.Ma_dong, Ten_dong
order by sum(ct.SLgDat*Gia_dong*(1-Giamgia_phantram/100)) -
sum(ct.SLgDat * ctpn.GiaNhap ) desc

Kết quả

h. Truy vấn có sử dụng EXCEPT, INTERSECT, UNION

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.

Code SELECT MaNV, HotenNV, SdtNV


FROM NHANVIEN nv
WHERE MaNV IN (SELECT MaNV FROM NHANVIEN EXCEPT SELECT
MaNV FROM HOADON)

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ý.

Code SELECT MaNV, HotenNV, MaNVquanly


FROM NHANVIEN
WHERE MaNVquanly IN (SELECT MaNV FROM NHANVIEN
INTERSECT SELECT
MaNVquanly FROM NHANVIEN WHERE MaNVquanly = 'EBB2')

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)

Code select HotenNV, count(MaHD) as 'Số hóa đơn đã lập'


from NHANVIEN nv, HOADON hd
where nv.MaNV = hd.MaNV
group by HotenNV
UNION
select HotenNV, '0' as 'Số hóa đơn đã lập'
from NHANVIEN nv
where not exists (select MaNV from HOADON where nv.MaNV = MaNV)
group by HotenNV

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?

Code select HoTenNV, NgSinhNV


from NHANVIEN nv
where exists (select NgSinhNV from NHANVIEN
where nv.NgSinhNV = NgSinhNV and
nv.MaNV <> MaNV)

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?

Code select Ma_dong, Ten_dong


from DONG_DONGHO dh
where not exists (select Ma_dong from CHITIET_PDH where dh.Ma_dong =
Ma_dong)

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?

Code select HotenNV, MucLuong


from NHANVIEN
where MucLuong >= all (select max(MucLuong) from NHANVIEN)

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

c. Cập nhật tồn kho khi nhập hàng


CREATE TRIGGER trgg_capnhattonkhokhinhaphang ON CHITIET_PN
FOR INSERT
AS
BEGIN
UPDATE DONG_DONGHO
SET DONG_DONGHO.SoLuongTon = DONG_DONGHO.SoLuongTon +
inserted.SoLgSP
FROM DONG_DONGHO INNER JOIN inserted
ON DONG_DONGHO.Ma_dong = inserted.Ma_dong
END

d. Dòng hàng nhập phải của đúng nhà sản xuất


CREATE TRIGGER trgg_loaihangcuansx ON CHITIET_PN
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @mansx char(4)
DECLARE @madongnhap char(4)
SELECT @mansx = MaNSX FROM PHIEUNHAP WHERE

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

e. Giá bán phải lớn hơn giá nhập


CREATE TRIGGER trgg_loinhuan ON DONG_DONGHO
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @gianhap REAL
DECLARE @giaban REAL
DECLARE @madong char(4)
SELECT @madong=Ma_dong FROM inserted
SELECT DISTINCT @gianhap = GiaNhap FROM CHITIET_PN WHERE
Ma_dong=@madong
SELECT @giaban=Gia_dong FROM inserted
IF (@giaban>@gianhap)
BEGIN
PRINT N'Cập nhật thành công'
END
ELSE
BEGIN
PRINT N'KHÔNG HỢP LỆ, dữ liệu nhập vô phải thỏa "GIÁ BÁN > GIÁ
NHẬP", vui lòng xem và cập nhật lại'
ROLLBACK TRAN
END
END

f. Nhân viên trên 18 tuổi


CREATE TRIGGER trgg_tuoinhanvien ON NHANVIEN
FOR INSERT, UPDATE
AS
BEGIN

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

g. Ngày có thể lấy phải sau ngày đặt hàng


CREATE TRIGGER trgg_ngaydathangvangaylayhang ON PHIEUDATHANG
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @ngaydatdon date
DECLARE @ngaycothelay date;
SELECT @ngaydatdon = Ngaydat, @ngaycothelay = NgayCoTheLay FROM
inserted
IF @ngaydatdon > @ngaycothelay
BEGIN
PRINT N'Ngày có thể lấy phải sau ngày đặt đơn'
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

PHẦN 4: Tổng kết:


1. Ưu điểm
- Hệ thống quản lý đầy đủ các chức năng phục vụ cho việc quản lý, bán hàng.
- Quản lý được hiệu quả vận của cửa hàng.
- Khi bán hàng ra thì sẽ tự động cập nhật dữ liệu tồn trong sản phẩm giúp quản lý dễ
dàng hơn.
- Có phân quyền nhân viên hạn chế truy chức năng truy cập vào dữ liệu giúp bảo đảm
dữ liệu.
- Tự động sao lưu dữ liệu đề phòng những trường hợp dữ liệu bị mất bất khả kháng.
2. Nhược điểm
- Hệ cơ sở dữ liệu chưa được tối ưu.
- Chưa bảo mật tốt
3. Hướng phát triển
- Tiếp tục học tập, nghiên cứu để năng cao kỹ năng và khắc phục được những hạn chế
trên.
- Tìm kiếm phương thức bảo mật dữ liệu tốt hơn.
- Tìm kiếm phương thức trực quan hoá giúp người dùng sử dụng và quản trị bộ cơ sở
dữ liệu hiệu quả hơn.

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.

CREATE TRIGGER trgg_7ngay1dem ON CHITIET_PT


FOR INSERT
AS
BEGIN
DECLARE @mahd char(4)
DECLARE @mapt char(4)
DECLARE @ngaytra date
DECLARE @ngaydat date

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

You might also like