Trong mỗi khách sạn có nhiều DỊCH VỤ theo nhu cầu của từng khách hàng và từng dịch vụ có đơn giá khác nhau.. Mỗi NHÂN VIÊN bao gồm các thông tin như: Mã nhân viên, họ tên, ngày sinh, g
I PHÁT BIỂU BÀI TOÁN
Quản lý khách sạn gồm các thông tin sau:
Mỗi khách sạn thường có nhiều phòng với số hiệu khác nhau, được phân loại thành các hạng phòng như hạng A (Cao cấp), hạng B (Trung bình) và hạng C (Giá rẻ) Sự đa dạng này không chỉ tạo ra nhiều lựa chọn cho khách hàng mà còn ảnh hưởng đến giá cả của từng loại phòng.
Mỗi khách sạn cung cấp nhiều dịch vụ đa dạng nhằm đáp ứng nhu cầu của từng khách hàng, với mức giá khác nhau cho từng dịch vụ Mỗi dịch vụ được xác định bằng mã dịch vụ, tên dịch vụ và giá cả, tùy thuộc vào loại dịch vụ cụ thể.
Trong khách sạn, BỘ PHẬN QUẢN LÝ có trách nhiệm giám sát và điều hành các nhân viên thuộc từng bộ phận, bao gồm mã bộ phận, tên bộ phận và mã nhân viên quản lý Mỗi phòng ban sẽ quản lý nhiều nhân viên để đảm bảo hoạt động hiệu quả và đồng bộ trong toàn khách sạn.
Một khách sạn có đội ngũ nhân viên đa dạng, mỗi nhân viên được ghi nhận với các thông tin quan trọng như mã nhân viên, họ tên, ngày sinh, giới tính, địa chỉ, số điện thoại, chức vụ, lương cơ bản và phụ cấp tương đương, cùng ngày vào làm Mức lương của từng nhân viên được xác định dựa trên tổng hệ số lương và các phụ cấp liên quan.
Mã nhân viên để phân biệt các nhân viên với nhau.
Khi khách hàng đến thuê khách sạn, thông tin cá nhân sẽ được lưu trữ bao gồm mã khách hàng duy nhất, tên, giới tính, số CCCD hoặc giấy tờ tương đương, và số điện thoại.
Mỗi khách hàng có thể nhận nhiều hóa đơn, trong đó bao gồm các thông tin quan trọng như mã hóa đơn, tên dịch vụ, tên khách hàng, mã phòng (số phòng) mà khách hàng đã thuê, thông tin thuê phòng (ngày đặt phòng, thời gian thuê, ngày đi), ngày lập hóa đơn và tổng số tiền.
Xây dựng mô hình thực thể liên kết
+ Một nhân viên chỉ làm việc cho một loại phòng ban
+ Có ít nhất một nhân viên làm việc tại phòng ban
+ Một nhân viên có thể lập nhiều hóa đơn
+ Mỗi hóa đơn chỉ nhập bằng 1 nhân viên
BỘ PHẬN QL Làm việc NHÂN VIÊN
NHÂN VIÊN Lập HÓA ĐƠN
+ Một khách hàng chỉ có thể có nhiều hóa đơn
+ Một hóa đơn chỉ thuộc 1 khách hàng
+ Mỗi hóa đơn có thể có thông tin nhiều phòng
+ Mỗi phòng có thể thuộc nhiều hóa đơn ở các thời điểm khác nhau.
+ Mỗi hóa đơn có nhiều dịch vụ
+ Mỗi dịch vụ thuộc nhiều hóa đơn khác nhau
Xác định các thuộc tính và phân loại thuộc tính
Các đối tượng cần lưu trữ thông tin : NHANVIEN, PHONG,
BOPHANQUANLY, KHACHHANG, HOADON, DICHVU. a PHONG (imaP; fgiaP; sLoaiP)
maP : Mã loại phòng – Khóa chính
HÓA ĐƠN Có DỊCH VỤ
KHÁCH HÀNG Có HÓA ĐƠN
giaP: Giá của loại phòng b BoPhanQuanLy (smaPB; stenPB)
tenPB: Tên phòng ban c KhachHang ( smaKH; stenKH; sgioiTinh; sCCCD; sSDTKH)
maKH : Mã khách hàng - Khóa chính
tenKH: là họ và tên khách hàng
gioiTinh: là giới tính của khách hàng
CCCD : là mã căn cước công dân của khách hàng
SDTKH: Số điện thoại của khách hàng
BỘ PHẬN QUẢN LÝ smaPB stenBP d NhanVien(smaNV; stenNV; dNgSinh; sgioiTinh ; sDchi ; sSDTNV ; sMaPB; fluongCB ; fphuCap;dngayVaoLam)
maNV : Mã Nhân viên - Khóa chính
tenNV: là họ và tên nhân viên
Ngsinh: là ngày sinh của nhân viên
gioiTinh: là giới tính của nhân viên
Dchi : là địa chỉ của nhân viên
SDTNV : là số điện thoại của nhân viên
luongCB : là lương của nhân viên
phuCap: là mức lương được hưởng thêm của nhân viên
KHÁCH HÀNG smaKH stenKH sgioiTinh sCCCD sSDTKH e DichVu ( smaDV ; stenDV ; fgiaDV; maLDV )
maDV : Mã dịch vụ - khóa chính
tenDV : là tên dịch vụ
giaDV: là giá dịch vụ
maLDV: mã loại dịch vụ f HoaDon ( smaHD; smaKH; smaNV; dNgayLap ; ftongTien)
maHD : Mã Hóa Đơn - Khóa chính
NHÂN VIÊN smaNV stenNV dNgaySinh sDiaChi sSDTNV smaPB sgioiTinh fluongCB fphuCap dngayVaoLam
DỊCH VỤ sMaDV stenDV fgiaDV smaLDV
tongTien: Tổng tiền hóa đơn
NgayLap: Ngày lập hóa đơn
HÓA ĐƠN smaHD smaKH smaNV ftongTien dngayLap
Vẽ mô hình ER
KHÁCH HÀNG PHÒNG co có
Xây dựng mô hình cơ sở dữ liệu quan hệ
Quy tắc 1 : Thực thể mạnh
NhanVien( maNV; tenNV; NgSinh; gioiTinh ; Dchi ; SDTNV ; ngayVaoLam; LuongCB; maPB; phuCap)
DichVu ( maDV ; tenDV ; giaDV; MaLDV )
HoaDon ( maHD; maKH; maNV; ngayLap; tongTien)
KhachHang ( maKH; tenKH; gioiTinh; CCCD; SDTKH)
NhanVien( maNV; tenNV; ngaySinh; gioiTinh ; diaChi ; SDTNV ; luongCB; phuCap ;maBP; ngayVaoLam)
HoaDon ( maHD; maKH; maNV ; ngayLap; tongTien)
Quy tắc 5: kiểu liên kết N-M
Chi_tiet_hoa_don_dv( maHD ; maDV)
Chi_tiet_hoa_don_phong ( maP ; maHD; NgayThue; NgayTra)
HoaDon ( maHD; maKH; maNV ; ngayLap; tongTien)
NhanVien( maNV; tenNV; ngaySinh; gioiTinh ; diaChi ; SDTNV ; luongCB; phuCap ;maPB ; ngayVaoLam)
Chi_tiet_hoa_don_dv( maHD ; maDV)
Chi_tiet_hoa_don_phong ( maP ; maHD; NgayThue; NgayTra)
KhachHang ( maKH; tenKH; gioiTinh; CCCD; SDTKH)
DichVu( maDV ; tenDV ; giaDV; MaLDV )
Chuẩn hóa cơ sở dữ liệu của bài toán
Xác định các quan hệ chuẩn NF
HoaDon ( maHD; maKH; maNV ; ngayLap; tongTien)
R1 {maHD → maKH ; maHD → ngayLapHD ; maHD → TongTien ; maHD →maNV ; maKH → tenK
HoaDon ( maHD; maKH; maNV ; ngayLap; tongTien)
→ Mọi thuộc tính không khóa đều phụ thuộc hàm đày đủ vào khóa chính->Chuẩn 2NF
→Mọi thuộc tính không khóa đều không phụ thuộc bắc cầu vào bất kỳ khóa chính của quan hệ -> 3NF
NhanVien( maNV; tenNV; ngaySinh; gioiTinh ; diaChi ; SDTNV
R2 {; maNV → tenNV ; maNV → Ngsinh ; maNV → gioitinh; maNV → Dchi ; maNV → SDTNV ; }
NhanVien( maNV; tenNV; ngaySinh; gioiTinh ; diaChi ; SDTNV; luongCB; phuCap ;maBP; ngayVaoLam)
→ Mọi thuộc tính không khóa đều phụ thuộc hàm đày đủ vào khóa chính->Chuẩn 2NF
→Mọi thuộc tính không khóa đều không phụ thuộc bắc cầu vào bất kỳ khóa chính của quan hệ -> 3NF
R3 = { maP → tenP ; maP → giaP ; maP →loaiP }
→ Mọi thuộc tính không khóa đều phụ thuộc hàm đày đủ vào khóa chính->Chuẩn 2NF
→Mọi thuộc tính không khóa đều không phụ thuộc bắc cầu vào bất kỳ khóa chính của quan hệ -> 3NF
Chi_tiet_hoa_don_dv( maHD ; maDV)
→ Mọi thuộc tính không khóa đều phụ thuộc hàm đày đủ vào khóa chính->Chuẩn 2NF
→Mọi thuộc tính không khóa đều không phụ thuộc bắc cầu vào bất kỳ khóa chính của quan hệ -> 3NF
Chi_tiet_hoa_don_phong ( maP ; maHD; NgayThue; NgayTra) → Mọi thuộc tính không khóa đều phụ thuộc hàm đày đủ vào khóa chính->Chuẩn 2NF
→Mọi thuộc tính không khóa đều không phụ thuộc bắc cầu vào bất kỳ khóa chính của quan hệ -> 3NF
KhachHang ( maKH; tenKH; gioiTinh; CCCD; SDTKH)
R4={maKH → tenKH ; maKH → gioitinh ; maKH →CCCD ; maKH → STDKH }
→ Mọi thuộc tính không khóa đều phụ thuộc hàm đày đủ vào khóa chính->Chuẩn 2NF
→Mọi thuộc tính không khóa đều không phụ thuộc bắc cầu vào bất kỳ khóa chính của quan hệ -> 3NF
→ Mọi thuộc tính không khóa đều phụ thuộc hàm đày đủ vào khóa chính->Chuẩn 2NF
→Mọi thuộc tính không khóa đều không phụ thuộc bắc cầu vào bất kỳ khóa chính của quan hệ -> 3NF
DichVu( maDV ; tenDV ; giaDV; MaLDV )
R6 = { maDV → tenDV ; maDV → LoaiDV ;maDV → giaDV }
DichVu( maDV ; tenDV ; giaDV; maLDV )
→ Mọi thuộc tính không khóa đều phụ thuộc hàm đày đủ vào khóa chính->Chuẩn 2NF
→Mọi thuộc tính không khóa đều không phụ thuộc bắc cầu vào bất kỳ khóa chính của quan hệ -> 3NF
Kết luận: Các thuộc tính thuộc dang chuẩn 3NF
KhachHang ( maKH; tenKH; gioiTinh; CCCD; SDTKH)
NhanVien( maNV; tenNV; ngaySinh; gioiTinh ; diaChi ; SDTNV; luongCB; phuCap ;maPB; ngayVaoLam)
DichVu( maDV ; tenDV ; giaDV; maLDV )
HoaDon ( maHD; maKH; maNV ; ngayLap; tongTien)
Chi_tiet_hoa_don_dv( maHD ; maDV)
Chi_tiet_hoa_don_phong ( maP ; maHD; NgayThue; NgayTra)
Vậy lược đồ quan hệ đã được chuẩn hóa về dạng cao nhất – 3NF.
II TẠO BẢNG CƠ SỞ DỮ LIỆU
CREATE DATABASE BTL_quan_ly_khach_san
USE BTL_quan_ly_khach_san
GO/* -1Tạo Bảng Bộ Phận Quản Lý -*/
CREATE TABLE tblBoPhanQuanLy( sMaPB int PRIMARY KEY IDENTITY (1 11, ), sTenPB NVARCHAR(30) NOT NULL
GO/* -2Tạo Bảng Nhân Viên -*/
The SQL statement creates a table named `tblNhanVien` to store employee information It includes the following fields: `sMaNV` as the primary key with an auto-increment starting from 12, `sTenNV` for the employee's name, `sNgaysinh` for the date of birth, `sGioiTinh` with a gender check for 'Nam' or 'Nu', `sDiaChi` for the address, `sSDT` for a mandatory phone number, `sLuongcb` for the base salary with a default value of 0, `sPhuCap` for additional benefits also defaulting to 0, and `sMaPB` which references the department table `tblBoPhanQuanLy`.
ON DELETE CASCADE ON UPDATE CASCADE, sNgayVaoLam DATETIMENOT NULL,
CHECK(DATEDIFF day( ,sNgaysinh,sNgayVaoLam) / 365 > ); 18)
GO/* -3Tạo Bảng Khách Hàng -*/
CREATE TABLE tblKhachHang( sMaKH INT PRIMARY KEY IDENTITY (3,13), sTenKH NVARCHAR(20) NOT NULL, sGioiTinh NVARCHAR(3) CHECK(sGioiTinh IN ('Nam' 'Nu', )), sCCCD NVARCHAR(11) NOT NULL, sSDTKH NVARCHAR(11) NOT NULL
CREATE TABLE tblPhong( sMaP INT PRIMARY KEY IDENTITY (4 14, ), sLoaiP NVARCHAR(10)CHECK(sLoaiP IN
('HangA','HangB' 'HangC')),, sGiaP FLOAT(2) NOT NULL
GO/* -5Tạo Bảng Loại Dịch Vụ -*/
CREATE TABLE tblLoaiDV( sMaLoai INT PRIMARY KEY IDENTITY (4 14, ), sTenLoai NVARCHAR(20) NOT NULL
CREATE TABLE tblDichVu( sMaDV INT PRIMARY KEY IDENTITY (5 15, ), sTenDV NVARCHAR(20) UNIQUE NOT NULL, sGiaDV FLOAT (2)DEFAULT 0, sMaLDV INT REFERENCES tblLoaiDV(sMaLoai)
ON DELETE CASCADE ON UPDATE CASCADE
GO/* -7Tạo Bảng Hóa Đơn -*/
CREATE TABLE tblHoaDon( sMaHD INT PRIMARY KEY IDENTITY (6, 16), sMaKH INT REFERENCES tblKhachHang(sMaKH)
ON DELETE CASCADE ON UPDATE CASCADE, sMaNV INT REFERENCES tblNhanVien(sMaNV)
ON DELETE CASCADE ON UPDATE CASCADE, sNgayLap DATETIME CHECK (sNgayLap = 2 SELECT kh.sTenKH FROM tblHoaDon hd
INNER JOIN tblChi_tiet_hoa_don_phong dp ON hd.sMaHD dp sMaHD.
INNER JOIN tblKhachHang kh ON kh sMaKH = hd sMaKH .
GROUP BY kh.sMaKH kh sTenKH,
Tạo view hiện dữ liệu
1 Tạo view cho biết số khách hàng Nam và số khách hàng Nữ CREATE VIEW [số khách hàng Nam và số khách hàng Nữ]
SELECT COUNT(*) AS [tổng khách hàng nữ] FROM tblKhachHang
SELECT COUNT(*) AS [tổng khách hàng nam] FROM tblKhachHang
SELECT FROM * [số khách hàng Nam và số khách hàng Nữ]
2 Tạo view cho biết tổng tiền của từng hoá đơn (cả tiền dịch vụ lẫn tiền phòng)
CREATE OR ALTER VIEW [tổng tiền của từng hoá đơn (cả tiền dịch vụ lẫn tiền phòng)]
SELECT hd.sMaHD,ISNULL([tong tien dv], 0) + ISNULL([tong tien p] 0, ) AS [tổng tiền] FROM [dbo] [tblHoaDon] hd.
SELECT cdv.sMaHD,SUM(cdv.sGiaNiemYet * cdv sSoLuong ) AS[tong tien dv] FROM tblChi_tiet_hoa_don_dv cdv GROUP BY cdv.sMaHD
SELECT cdp.sMaHD,SUM(cdp.sGiaPhong * DATEDIFF day( , sNgayThue, sNgayTra)) AS[tong tien p] FROM tblChi_tiet_hoa_don_phong cdp
SELECT FROM * [tổng tiền của từng hoá đơn (cả tiền dịch vụ lẫn tiền phòng)]
3 Tạo view cho biết 3 khách hàng đã trả nhiều tiền nhất CREATE VIEW [3 khách hàng đã trả nhiều tiền nhất]
SELECT TOP 3 kh.sMaKH sTenKH, sGioiTinh, sSDTKH, [tổng , tiền] FROM tblKhachHang kh
LEFT JOIN tblHoaDon hd ON kh sMaKH = hd sMaKH .
LEFT JOIN [tổng tiền của từng hoá đơn (cả tiền dịch vụ lẫn tiền phòng)] a ON a sMaHD hd = sMaHD
ORDER BY a.[tổng tiền] DESC
SELECT FROM * [3 khách hàng đã trả nhiều tiền nhất]
4 Tạo view thống kê số lượng nhân viên theo giới tính
CREATE VIEW [thống kê số lượng nhân viên theo giới tính] AS
SELECT sGioiTinh, COUNT(*)AS [tổng số nhân viên] FROM tblNhanVien
SELECT FROM * [thống kê số lượng nhân viên theo giới tính]
5 Tạo view thống kê số lượng nhân viên có độ tuổi >= 23 CREATE VIEW [thống kê số lượng nhân viên có độ tuổi >= 23]
ASSELECT COUNT(*) AS [số nhân viên] FROM tblNhanVien
WHERE DATEDIFF day( , sNgaysinh, GETDATE()) / 365 >= 23 SELECT FROM * [thống kê số lượng nhân viên có độ tuổi >= 23]
/*6 Đưa ra danh sách khách hàng đã thuê phòng trong tháng này*/
CREATE VIEW [danh sách khách hàng đã thuê phòng trong tháng này]
SELECT kh.sMaKH sTenKH, sGioiTinh, sSDTKH , FROM tblKhachHang kh
INNER JOIN tblHoaDon hd ON kh sMaKH = hd sMaKH .
INNER JOIN tblChi_tiet_hoa_don_phong p ON p sMaHD = hd sMaHD.
WHERE MONTH(sNgayThue) =MONTH GETDATE( ()) AND
SELECT FROM * [danh sách khách hàng đã thuê phòng trong tháng này]
7.Tạo view tính trung bình cộng tiền dịch vụ mỗi khách hàng đã trả trong năm 2019
CREATE VIEW [trung bình cộng tiền dịch vụ mỗi khách hàng đã trả trong năm 2019]
SELECT [tong tien dv] / [so kh] AS [tiền TB] FROM (
SELECT COUNT(x.sMaKH )AS [so kh] FROM (
SELECT sMaKH FROM tblHoaDon hd
WHERE YEAR(sNgayLap 2019) GROUP BY sMaKH
SELECT SUM(cdv sGiaNiemYet cdv sSoLuong AS [tong * ) tien dv] FROM tblHoaDon hd
INNER JOIN tblChi_tiet_hoa_don_dv cdv ON cdv.sMaHD hd sMaHD.
SELECT FROM * [trung bình cộng tiền dịch vụ mỗi khách hàng đã trả trong năm 2019]
8 Tạo view cho biết danh sach khách hàng đã thuê/đang thuê phòng hạng A
CREATE VIEW [danh sach khách hàng đã thuê/đang thuê phòng hạng A]
ASSELECT kh.sMaKH sTenKH, sGioiTinh, sSDTKH , FROM tblKhachHang kh
INNER JOIN tblHoaDon hd ON hd.sMaKH kh sMaKH=
INNER JOIN tblChi_tiet_hoa_don_phong cp ON cp sMaHD = hd sMaHD.
INNER JOIN tblPhong p ON cp sMap = p.sMaP.
SELECT FROM * [danh sach khách hàng đã thuê/đang thuê phòng hạng A]
9 Tạo view cho biết nhân viên nào có lương cao nhất
WHERE sLuongcb sPhuCap + = (SELECT MAX(sLuongcb + sPhuCap) FROM tblNhanVien)
10 Tạo view cho biết loại dịch vụ nào khách hàng hay sử dụng nhất
CREATE VIEW [loại dịch vụ nào khách hàng hay sử dụng nhất]
ASSELECT sTenLoai FROM tblChi_tiet_hoa_don_dv cdv
INNER JOIN tblDichVu dv ON cdv sMaDV dv.sMaDV INNER JOIN tblLoaiDV ldv ON dv.sMaLDV = ldv sMaLoai.
GROUP BY ldv.sMaLoai, sTenLoai
The SQL query retrieves the count of records from the `tblChi_tiet_hoa_don_dv` table, joining it with the `tblDichVu` and `tblLoaiDV` tables based on service and service type IDs It groups the results by the service type ID, providing a summary of the number of service details for each type.
SELECT FROM * [loại dịch vụ nào khách hàng hay sử dụng nhất]
Tạo các STORED PROCEDURE
/* -TẠO STORED PROCEDURE HIỆN DỮ LIỆU (20 CÂU)
/*1 Tạo Stored Procedure có tham số truyền vào là tháng, năm cho biết những khách hàng nào thuê phòng trong tháng đó.
có tham số truyền vào là năm và tháng
CREATE PROC [những khách hàng nào thuê phòng trong tháng đó] (@thang INT, @nam INT)
SELECT FROM * tblChi_tiet_hoa_don_phong
WHERE MONTH(sNgayThue) @thang = AND
SELECT kh.sMaKH sTenKH, sGioiTinh, sSDTKH , FROM tblKhachHang kh
INNER JOIN tblHoaDon hd ON kh sMaKH = hd sMaKH . INNER JOIN tblChi_tiet_hoa_don_phong p ON p sMaHD.
GROUP BY kh.sMaKH sTenKH, sGioiTinh, sSDTKH, , sNgayThue
HAVING MONTH(sNgayThue @thang ) = AND
PRINT N'không có khách hàng nào thuê trong tháng này' END
EXEC [những khách hàng nào thuê phòng trong tháng đó] 5, 2020
/*2 Tạo thủ tục để bổ sung thêm một bản ghi mới cho bảng [dbo].[tblNhanVien]
-có tham số truyền vào là tênnv, ngày sinh, giới tính, diachi, sdt, luong, phu cap, mapb
+) ngày vào làm đủ 18 tuổi
+) mã PB phải nhập đúng
+) Ngày vào làm phải 5
ENDEXEC [tăng lương lên gấp rưỡi cho Nhân viên làm việc trên 5 năm]
/* 9 Tạo thủ tục lấy ra danh sách nhân viên theo giới tính và theo tuổi
- tuổi và giới tính truyền vào
CREATE PROC [lấy ra danh sách nhân viên theo giới tính và tuổi](@gioitinh NVARCHAR( ), @tuoi INT)3
WHERE sGioiTinh @gioitinh = AND DATEDIFF day( , sNgaysinh, GETDATE()) / 365 = @tuoi
EXEC [lấy ra danh sách nhân viên theo giới tính và tuổi] 'Nu', 24
/* 10 Tạo thủ tục tính tổng tiền thu được trong năm truyền vào
*/CREATE PROC tong_tien @nam ( INT)
SELECT @tongt += SUM(dv.sGiaNiemYet sSoLuong) * FROM tblHoaDon hd
INNER JOIN tblChi_tiet_hoa_don_dv dv ON hd.sMaHD dv sMaHD.
WHERE YEAR( hd sNgayLap @nam ) SELECT @tongt += SUM(hp.sGiaPhong DATEDIFF day* ( , sNgayThue, sNgayTra)) FROM tblHoaDon hd
INNER JOIN tblChi_tiet_hoa_don_phong hp ON hd.sMaHD hp sMaHD.
WHERE YEAR( hd sNgayLap @nam ) PRINTN'Tổng tiền thu được trong năm '+ CAST(@nam AS NVARCHAR( )) +10 N' là: '+ CAST(@tongt AS NVARCHAR(30)) ENDEXEC dbo.tong_tien 2019
11 tạo thủ tục tăng phụ cấp nhân viên lập được nhiều hóa đơn nhất lên 500000
SET sPhuCap 5000000WHERE sMaNV IN (
HAVING COUNT(sMaHD ) >= (SELECT MAX(tong) FROM(
SELECT COUNT(sMaHD) AS tong FROM tblHoaDon
Tham số truyền vào: mã loại phòng
Thực hiện tăng giá phòng lên gấp rưỡi cho những phòng thuộc loại phòng truyền vào
CREATE PROC [tăng giá phòng lên gấp rưỡi] (@maloai
EXEC dbo.[tăng giá phòng lên gấp rưỡi] N'hangA'
/*13 Tạo thủ tục thêm bản ghi khách hàng tham số truyền vào tương ứng
*/CREATE PROC [INSERTtblKhachHang] @ten ( NVARCHAR(20) ,
@gioiTinh NVARCHAR( ),3 @cccd NVARCHAR( ),11 @sdt
IF(LEN(@sdt 11 ) != ANDLEN(@sdt) != 10)
PRINT N'Số điện thoại phải có 10 hoặc 11 chữ số' SET @CHECK 1END
IF(@gioitinh NOT IN ('Nam' 'Nu', ))
PRINT N'giới tính chỉ nhận giá trị Nam hoặc Nữ' SET @CHECK 1END
PRINT N'Căn cước công dân phải đủ 11 chữ số' SET @CHECK 1END
PRINT N'Mời bạn nhập lại'
INSERT INTO tblKhachHang(sTenKH, sGioiTinh , sCCCD, sSDTKH)
VALUES (@ten, @gioiTinh @cccd @sdt, , )
EXEC dbo.INSERTtblKhachHang 'zzcongkunzz' 'Nam', ,
14 tạo thủ tục thêm hóa đơn tham số truyền vào tương ứng
*/CREATE PROC [INSERTtblHoaDon] @makh ( INT, @manv INT,
PRINT N'Mã nhân viên nhập không đúng'
PRINT N'Mã khách hàng nhập không đúng'
PRINT N'ngày lập hóa đơn phải trước hoặc bằng ngày hiện tại'
PRINT N'Mời bạn nhập lại'
INSERT INTO tblHoaDon(sMaKH, sMaNV , sNgayLap)
/*15 tạo thủ tục thêm dịch vụ với tham số truyền vào tương ứng
*/CREATE PROC [INSERTtblDichVU] @tendv ( NVARCHAR(20), @gia FLOAT(2), @maloai INT)
PRINT N'Giá phải lớn hơn 0'
PRINT N'Không có loại dịch vụ nào'
PRINT N'Mời bạn nhập lại'
Để thêm bản ghi mới vào bảng chi tiết dịch vụ, bạn cần truyền vào tham số dưới dạng chuỗi {{madv1, so luong}, {madv2, so luong}, } Mã hóa đơn mặc định sẽ được thiết lập với giá niêm yết là 110% giá dịch vụ.
*/CREATE PROC [INSERTtbltblChi_tiet_hoa_don_dv](@mhd INT,
PRINT N'Mã hóa đơn nhập không đúng'
DECLARE contro CURSOR FOR SELECT FROM *
FETCH NEXT FROM contro INTO @madv
DECLARE @sl INT FETCH NEXT FROM contro INTO @sl
SELECT FROM * tblDichVu WHERE CAST(@madv AS INT) sMaDV
PRINT N'Không có dịch vụ nào có mã là ' @madv+
SELECT @giany sGiaDV = * 1.1 FROM tblDichVu
WHERE @madv sMaDV INSERT INTO tblChi_tiet_hoa_don_dv
FETCH NEXT FROMEND contro INTO @madv END
EXEC dbo.INSERTtbltblChi_tiet_hoa_don_dv 6,'{{80,10},{95, 2}}'
/*17 Tạo thủ tục thống kê số lượng nhân viên của từng phòng ban
*/CREATE PROC [số lượng nhân viên của từng phòng ban]
SELECT sTenPB, COUNT(*)AS [số nhân viên] FROM tblBoPhanQuanLy ql
LEFT JOIN tblNhanVien nv ON ql sMaPB nv.sMaPB GROUP BY ql.sMaPB, ql.sTenPB
ENDEXEC [số lượng nhân viên của từng phòng ban]
18 tạo thủ tục tính số phòng của từng loại phòng
CREATE PROC [số phòng của từng loại phòng]
SELECT sLoaiP ,COUNT(sMaP) AS [số lượng] FROM tblPhong
EXEC [số phòng của từng loại phòng]
/*19 Tạo thủ thục thêm phòng với tham số truyền vào là loại phòng, giáp và số lượng phòng muốn thêm
*/CREATE PROC [INSERTtblPhong] @loaip ( NVARCHAR( ),10 @gia FLOAT(2), @sl INT)
IF (@loaip != 'HangA' AND @loaip !='HangB'AND @loaip
PRINT N'Loại phòng chỉ nhận giá trị HangA hoặc HangB hoặc HangC'
20 tạo PROC lấy ra khách hàng đã chi tiêu số tiền lớn hơn hoặc bằng số tiền truyền vào
CREATE PROC [KH_tiềm_năng](@tt FLOAT( ))2
SELECT sTenKH sGioiTinh sSDTKH , , FROM tblHoaDon hd INNER JOIN tblKhachHang kh ON hd.sMaKH kh sMaKH= LEFT JOIN (
SELECT sMaHD ,SUM(sGiaNiemYet * sSoLuong) AS [ttdv] FROM tblChi_tiet_hoa_don_dv cdv
SELECT sMaHD ,SUM(sGiaPhong * DATEDIFF day( , sNgayThue, sNgayTra)) AS [ttp] FROM tblChi_tiet_hoa_don_phong cp
GROUP BY sTenKH, sGioiTinh sSDTKH,
HAVING SUM ISNULL(( (ttdv, 0) +ISNULL( , ))) >=ttp 0 @tt
EXEC dbo.KH_tiềm_năng 100000000
Tạo Trigger kiểm soát ràng buộc dữ liệu
1 Tạo trigger kiểm tra số điện thoại của nhân viên
SELECT @sdt = sSDT FROM inserted
IF(LEN(@sdt 10 ) != ANDLEN(@sdt) != 11) BEGIN
PRINT N'số điện thoại phải có 10 hoặc
BEGIN PRINT N'số điện thoại phải bắt đầu bằng chữ số 0'
BEGIN IF(SUBSTRING(@sdt, @i 1 , )
BEGIN PRINT N'số điện thoại chỉ được chứa những chữ số từ 0 đến 9'
INSERT INTO tblNhanVien (sTenNV, sNgaySinh sGioiTinh , , sDiaChi, sSDT sLuongcb sPhuCap, , ,sMaPB, sNgayVaoLam) VALUES (N' Trần Thị Hà' ' 12/03/1995', ,N'Nu',N'Hà Nội',
WHERE sMaNV 3778/*2 khi có 1 nhân viên bị xoá khỏi bảng tblNhanVien
Các đơn đặt hàng của nhân viên bị xoá sẽ được phân bổ đồng đều cho những nhân viên khác có số đơn đặt hàng cao hơn nhưng vẫn thấp hơn số đơn của nhân viên đó.
DECLARE @manvxoa INT mã nv của thằng bị xóa
DECLARE @tonghoadonnvxoa INT tổng hóa đơn của nv bị xóa
DECLARE @tongdhcaonhat INT 1 = - tổng số đơn đặt hàng cao nhất nhưng ít hơn nhân viên bị xoá.
SELECT @manvxoa sMaNV = FROM deleted lấy ra mã nv bị xóa
IF NOT EXISTS( nếu nv bị xóa chưa lập hóa đơn nào SELECT FROM * tblHoaDon
DELETE FROM tblNhanVien sau khi thành công xóa nhân viên
WHERE sMaNV @manvxoaPRINT N'Xóa thành công nhân viên1' return
SELECT @tonghoadonnvxoa = COUNT(sMaHD) FROM tblHoaDon lấy ra tổng hóa đơn của nv bị xóa
WHERE sMaNV @manvxoaSELECT TOP 1 @tongdhcaonhat = COUNT(sMaHD) FROM tblHoaDon
GROUP BY sMaNV lấy ra tổng số đơn đặt hàng cao nhất nhưng ít hơn nhân viên bị xoá
HAVING sMaNV != @manvxoa AND COUNT(sMaHD ) @ckngaytra) thì thiết lập @min bằng @ckngaytra Để kiểm tra xem trong khoảng thời gian đó có phòng nào đã được khách thuê hay không, ta cần xác định xem hai khoảng thời gian có giao nhau hay không Nếu hai khoảng thời gian giao nhau, nghĩa là phòng đã có người thuê Cách kiểm tra là tìm giá trị lớn nhất của đầu A và giá trị nhỏ nhất của đầu B, sau đó xem giá trị nhỏ nhất có lớn hơn giá trị lớn nhất hay không Nếu lớn hơn, tức là hai khoảng thời gian đã giao nhau.
IF(@Max < @Min) BEGIN PRINT N'Phòng đã có người thuê' ROLLBACK
FETCH NEXT FROM contro INTO
SELECT FROM * tblChi_tiet_hoa_don_phong
INSERT INTO tblChi_tiet_hoa_don_phong
VALUES (368, 454,'2020-01-13 00:00:00.000', '2020-01-14') 4 Tạo trigger kiểm tra tuổi của nhân viên đủ 18 và không quá
50CREATE OR ALTER TRIGGER [ck_tuoi]
SELECT @ngaysinh = sNgaysinh FROM inserted
IF(DATEDIFF day( , @ngaysinh, GETDATE()) / 365
>= 18 AND DATEDIFF(day, @ngaysinh GETDATE, ()) / 365 = 18) );
thêm dữ liệu bảng bộ phận quản lý
VALUES ( N' Bộ phận nhà hàng'),
GO Tạo PROC thêm nhân viên
CREATE OR ALTER PROC [INSERTtblNhanVien](@smanv INT,
@stennv NVARCHAR( ),20 @sngaysinh DATETIME, @sgioitinhNVARCHAR( ),3 @sdiachi NVARCHAR( ),50 @sdt NVARCHAR(11),
@sluongcb FLOAT( ),2 @sphucap FLOAT( ),2 @mapb INT,
LINKBTL BTL_quan_ly_khach_san dbo tblNhanVien .
PRINT N'Mã nhân viên bị trùng'
IF(@sdiachi LIKE N'%Hà Nội')
INSERT INTO tblNhanVien VALUES (@smanv, @stennv,
@sngaysinh, @sgioitinh, @sdiachi , @sdt , @sluongcb,
LINKBTL BTL_quan_ly_khach_san dbo tblNhanVien .
@sngaysinh, @sgioitinh, @sdiachi , @sdt , @sluongcb,
EXEC INSERTtblNhanVien 11,N' Trần Thị Hồng',' 12/03/1995' N'Nu', ,N'Thanh Xuân - Hà Nội',
CREATE DATABASE BTL_quan_ly_khach_san
USE BTL_quan_ly_khach_san
tạo bảng bộ phận quản lý
CREATE TABLE tblBoPhanQuanLy( sMaPB int PRIMARY KEY, sTenPB NVARCHAR(30) NOT NULL
GO tạo bảng nhân viên
The SQL command creates a table named "tblNhanVien" to store employee information, including a primary key "sMaNV" of type integer It requires the employee's name "sTenNV" as a non-null NVARCHAR with a maximum length of 20 characters and mandates a non-null date of birth "sNgaysinh." The gender "sGioiTinh" is restricted to specific values, either 'Nam' or 'Nu,' while the address "sDiaChi" must be an NVARCHAR of up to 50 characters, specifically containing 'Hà Nội.' Additionally, the table includes a non-null phone number "sSDT" of 11 characters and two floating-point columns for base salary "sLuongcb" and allowances "sPhuCap," both defaulting to 0 Finally, it establishes a foreign key relationship with the "tblBoPhanQuanLy" table through "sMaPB."
ON DELETE CASCADE ON UPDATE CASCADE, sNgayVaoLam DATETIMENOT NULL,
CONSTRAINT [sNgayVaoLam du 18 tuoi] CHECK(DATEDIFF day( ,sNgaysinh,sNgayVaoLam) / 365 >= 18) );
kéo dữ liệu của bảng bộ phận quản lý từ trạm 1 sang trạm 2
LINKBTL BTL_quan_ly_khach_san dbo tblBoPhanQuanLy .
GO Tạo PROC thêm nhân viên
CREATE OR ALTER PROC [INSERTtblNhanVien](@smanv INT,
@stennv NVARCHAR( ),20 @sngaysinh DATETIME, @sgioitinh NVARCHAR( ),3 @sdiachi NVARCHAR( ),50 @sdt NVARCHAR(11),
@sluongcb FLOAT( ),2 @sphucap FLOAT( ),2 @mapb INT,
LINKBTL BTL_quan_ly_khach_san dbo tblNhanVien .
PRINT N'Mã nhân viên bị trùng'
IF(@sdiachi NOT LIKE N'%Ha Noi')
INSERT INTO tblNhanVien VALUES (@smanv, @stennv,
@sngaysinh, @sgioitinh, @sdiachi , @sdt , @sluongcb,
LINKBTL BTL_quan_ly_khach_san dbo tblNhanVien .
@sngaysinh, @sgioitinh, @sdiachi , @sdt , @sluongcb,