ĐẠI HỌC DUY TÂN
KHOA CÔNG NGHỆ THÔNG TIN
HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU ĐỒ ÁN NHÓM
ĐỀ TÀI: PROJECT 1GVHD: Nguyễn Dũng
LỚP: IS 401 F
Nhóm thực hiện: Thái Bá Hưng
05/2024
Trang 2Câu 1 Viết câu lệnh SQL để tạo CSDL có tên QLNV và tạo ra các bảng
Bảng PHONG
CREATE TABLE PHONG (
MAPHONG CHAR(3)PRIMARY KEY, TENPHONG NVARCHAR( ),40 DIACHI NVARCHAR( ),50 TEL CHAR( )10
Bảng NHANVIEN
CREATE TABLE NHANVIEN ( MANV CHAR(5)PRIMARY KEY, HOTEN NVARCHAR(40), GIOITINH BIT,
NGAYSINH DATETIME, HESOLUONG FLOAT, MAPHONG CHAR( ),3 NGAYCONG INT, NGAYBC DATETIME, MATKHAU CHAR( ),20
FOREIGN KEY (MAPHONG)REFERENCES PHONG(MAPHONG));
Bảng TDNN
CREATE TABLE TDNN ( MANV CHAR( ),5 MANN CHAR( ),2 TDO CHAR( ),1
PRIMARY KEY (MANV, MANN),
FOREIGN KEY (MANV)REFERENCES NHANVIEN(MANV), FOREIGN KEY (MANN)REFERENCES DMNN(MANN));
Trang 3Câu 2 Viết các thủ tục để nhập dữ liệu và dùng thủ tục vừa viết để tạo nhập dữ liệu vào các bảng
CREATE PROCEDURE InsertOrUpdate_PHONG @MAPHONG VARCHAR(10),
@TENPHONG NVARCHAR(100), @DIACHI NVARCHAR(200), @TEL NVARCHAR( )20AS
INSERT INTO PHONG(MAPHONG, TENPHONG DIACHI TEL, , ) VALUES (@MAPHONG, @TENPHONG @DIACHI @TEL, , ); END
SET NOCOUNT ON;
IFEXISTS(SELECT FROM 1 DMNN WHERE MANN @MANN= )
Trang 4BEGIN
UPDATE DMNN SET TENNN @TENNN= WHERE MANN @MANN= ; END
ELSE BEGIN
INSERT INTO DMNN(MANN, TENNN) VALUES (@MANN, @TENNN); END
EXECUTE InsertOrUpdate_DMNN '01' N'Anh', ;EXECUTE InsertOrUpdate_DMNN '02' N'Nga', ;EXECUTE InsertOrUpdate_DMNN '03' N'Pháp', ;EXECUTE InsertOrUpdate_DMNN '04' N'Nhật', ;EXECUTE InsertOrUpdate_DMNN '05',N'Trung Quốc';EXECUTE InsertOrUpdate_DMNN '06',N'Hàn Quốc';CREATE PROCEDURE InsertOrUpdate_NHANVIEN @MANV CHAR(5),
@HOTEN NVARCHAR(40), @GIOITINH BIT,
@NGAYSINH DATETIME, @HESOLUONG FLOAT, @MAPHONG CHAR( ),3 @NGAYCONG INT, @NGAYBC DATETIME, @MATKHAU CHAR( )20AS
ELSE
Trang 5EXECUTE InsertOrUpdate_NHANVIEN 'HC001',N'Nguyễn Thị Hà', 0 ,'1950-08-27', 2.34,'HCA', 30 ,'1975-02-08',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'HC002',N'Trần Văn Nam', 1 ,'1975-12-06', 4.0,'HCA',15,'1997-08-06',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'HC003',N'Nguyễn Thanh Huyền', ,'1978-03-07', 5.7,'HCA', 29 ,'1999-09-24',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KD001',N'Lê Tuyết Anh', ,'1977-03-02', 6.4,'KDA',30,'2001-10-02',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KD002',N'Nguyễn Anh Tú', 1 ,'1942-04-07', 7.2,'KDA', 30 ,'1999-09-24',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KD003',N'Phạm An Thái', ,'1977-09-05', 3.4,'KDA',28,'1999-09-24',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KD004',N'Lê Văn Hải', ,'1976-02-01', 2.34,'KDA',27,'1997-06-08',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KD005',N'Nguyễn Phương Minh', 1 ,'1980-02-01', 4.0,'KDA', 26 ,'2001-10-02',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KT001',N'Trần Đình Khâm', , 1 '1981-02-12', 5.7,'KTA', 28 ,'2005-01-01', NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KT002',N'Nguyễn Mạnh Hùng', ,'1980-08-16', 6.4,'KTA', 17 ,'2005-01-01', NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KT003',N'Phạm Thanh Sơn', , 1 '1984-08-20', 7.2,'KTA', 30 ,'2005-01-01', NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KT004',N'Vũ Thị Hoài', , 0 '1980-05-12', 3.4,'KTA',30,'2001-10-02',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KT005',N'Nguyễn Thu Lan', , 0 '1977-05-10', 2.34,'KTA', 30 ,'2001-10-02', NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KT006',N'Trần Hoài Nam', ,'1978-02-07', 4.0,'KTA',30,'1997-06-08',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KT007',N'Hoàng Nam Sơn', , 1 '1940-03-12', 5.7,'KTA', 30 ,'1965-07-02', NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KT008',N'Lê Thu Trang', ,'1950-06-07', 6.4,'KTA',30,'1968-08-02',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KT009',N'Khúc Nam Hải', ,'1980-07-22', 7.2,'KTA',30,'2005-01-01',NULL;
EXECUTE InsertOrUpdate_NHANVIEN 'KT010',N'Phùng Trung Dũng', ,'1978-08-28', 3.4,'KTA', 30 ,'1999-09-24', NULL;
CREATE PROCEDURE InsertOrUpdate_TDNN
Trang 6@MANV CHAR(5), @MANN CHAR(2), @TDO CHAR(1)AS
SET NOCOUNT ON;
IFEXISTS(SELECT FROM 1 TDNN WHERE MANV @MANV= ) BEGIN
UPDATE TDNN SET MANN @MANN= , TDO @TDO=
WHERE MANV @MANV= ; END
ELSE BEGIN
INSERT INTO TDNN(MANV, MANN TDO, ) VALUES (@MANV, @MANN @TDO, ); END
EXEC InsertOrUpdate_TDNN 'HC001' '01' 'A', , ;EXEC InsertOrUpdate_TDNN 'HC001' '02' 'B', , ;EXEC InsertOrUpdate_TDNN 'HC002' '01' 'C', , ;EXEC InsertOrUpdate_TDNN 'HC002' '03' 'C', , ;EXEC InsertOrUpdate_TDNN 'HC003' '01' 'D', , ;EXEC InsertOrUpdate_TDNN 'KD001' '01' 'C', , ;EXEC InsertOrUpdate_TDNN 'KD001' '02' 'B', , ;EXEC InsertOrUpdate_TDNN 'KD002' '01' 'D', , ;EXEC InsertOrUpdate_TDNN 'KD002' '02' 'A', , ;EXEC InsertOrUpdate_TDNN 'KD003' '01' 'B', , ;EXEC InsertOrUpdate_TDNN 'KD003' '02' 'C', , ;EXEC InsertOrUpdate_TDNN 'KD004' '01' 'C', , ;EXEC InsertOrUpdate_TDNN 'KD004' '04' 'A', , ;EXEC InsertOrUpdate_TDNN 'KD004' '05' 'A', , ;EXEC InsertOrUpdate_TDNN 'KD005' '01' 'B', , ;EXEC InsertOrUpdate_TDNN 'KD005' '02' 'D', , ;EXEC InsertOrUpdate_TDNN 'KD005' '03' 'B', , ;EXEC InsertOrUpdate_TDNN 'KD005' '04' 'B', , ;EXEC InsertOrUpdate_TDNN 'KT001' '01' 'D', , ;EXEC InsertOrUpdate_TDNN 'KT001' '04' 'E', , ;EXEC InsertOrUpdate_TDNN 'KT002' '01' 'C', , ;EXEC InsertOrUpdate_TDNN 'KT002' '02' 'B', , ;EXEC InsertOrUpdate_TDNN 'KT003' '01' 'D', , ;EXEC InsertOrUpdate_TDNN 'KT003' '03' 'C', , ;EXEC InsertOrUpdate_TDNN 'KT004' '01' 'D', , ;
Trang 7EXEC InsertOrUpdate_TDNN 'KT005' '01' 'C', , ;
Câu 3 Viết thủ tục in ra thông tin chi tiết của nhân viên dựa vào mã nhân viên gồm: Mã
nhân viên, tên nhân viên, tuổi, giới tính (nam, nữ)CREATE PROCEDURE CAU_3
@MANV VARCHAR( )10AS
WHEN GIOITINH 1 = THEN 'Nam'
WHEN GIOITINH 0 = THEN N'Nữ'
END AS GioiTinhFROM NHANVIENWHERE MANV = @MANV;COMMIT;
EXECUTE CAU_3 @MANV ='HC001';
Câu 4 Viết thủ tục in ra thông tin của nhân viên như câu 3 dựa vào họ của nhân viên
CREATE PROCEDURE CAU_4 @LastName NVARCHAR( )40AS
WHEN NHANVIEN GIOITINH 1 = THEN'Nam'
WHEN NHANVIEN GIOITINH 0 = THENN'Nữ'
ELSE'Không xác định'
END AS'Giới tính'
FROM NHANVIENWHERE
NHANVIEN HOTEN LIKE'%'+ @LastName +'%';
Trang 8EXECUTE CAU_4 @LastName =N'Nguyễn';
Câu 5 Viết thủ tục in ra hai nhân viên nữ và hai nhân viên nam có thời gian công tác ở
Nhân viên nữ có thời gian công tác lâu nhất SELECT TOP (@FemaleCount)
NHANVIEN MANV AS 'Mã nhân viên', NHANVIEN HOTEN AS 'Tên nhân viên',
DATEDIFF YEAR( , NHANVIEN.NGAYBC,GETDATE()) AS 'Thời gian công tác (năm)', N'Nữ' AS 'Giới tính'
FROM NHANVIEN WHERE
NHANVIEN GIOITINH 0 = ORDER BY
DATEDIFF YEAR( , NHANVIEN.NGAYBC,GETDATE()) DESC; Nhân viên nam có thời gian công tác lâu nhất
SELECT TOP (@MaleCount)
NHANVIEN MANV AS 'Mã nhân viên', NHANVIEN HOTEN AS 'Tên nhân viên',
DATEDIFF YEAR( , NHANVIEN.NGAYBC,GETDATE()) AS 'Thời gian công tác (năm)', 'Nam'AS'Giới tính'
FROM NHANVIEN WHERE
NHANVIEN GIOITINH 1 = ORDER BY
DATEDIFF YEAR( , NHANVIEN.NGAYBC,GETDATE()) DESC; COMMIT TRANSACTION;
END;
Trang 9EXECUTE CAU_5;
Câu 6 Viết thủ tục in ra thông tin nhân viên gồm: mã nhân viên, tên nhân viên, tuổi, giới
tính, Lương theo tên của phòng ban.
Lương của mỗi nhân viên được tính theo công thức: Lương =LCB*ngày công/số ngày côngchuẩn: LCB=1.500.000 Ngày công chuẩn là 26.
CREATE PROCEDURE CAU_6 @Tenphong NVARCHAR( )40AS
BEGIN TRANSACTION;
DECLARE @LCB FLOAT = 1500000.0; Lương cơ bản DECLARE @Ngaycongchuan INT 26= ; Số ngày công chuẩn SELECT
NHANVIEN MANV AS 'Mã nhân viên', NHANVIEN HOTEN AS 'Tên nhân viên',
DATEDIFF YEAR( , NHANVIEN.NGAYSINH,GETDATE()) AS 'Tuổi', CASE
WHEN NHANVIEN GIOITINH 1 = THEN'Nam'
WHEN NHANVIEN GIOITINH 0 = THENN'Nữ'
ELSE'Không xác định'
END AS'Giới tính',
(@LCB NHANVIEN NGAYCONG @Ngaycongchuan * / )AS 'Lương'
FROM NHANVIEN
INNER JOIN PHONG ON NHANVIEN MAPHONG PHONG = MAPHONG WHERE
PHONG TENPHONG @Tenphong = ; COMMIT TRANSACTION;
EXECUTE CAU_6 @Tenphong ='Hành chính tổ hợp';
Câu 7 Viết thủ tục in ra thông tin chi tiết của nhân viên có tuổi năm trong khoảng 25 đến 30 theo
từng phòng ban với mã phòng ban truyền vào.
Trang 10CREATE PROCEDURE CAU_7 @MaPhong CHAR(3)AS
BEGIN TRANSACTION;
DECLARE @TuoiToiThieu INT 25= ; DECLARE @TuoiToiDa INT = 30; SELECT
NHANVIEN MANV AS'Ma nhan vien', NHANVIEN HOTEN AS'Ten nhan vien',
DATEDIFF YEAR( , NHANVIEN.NGAYSINH,GETDATE())AS'Tuoi', CASE
WHEN NHANVIEN GIOITINH 1 = THEN 'Nam'
WHEN NHANVIEN GIOITINH 0 = THEN N'Nữ'
ELSE 'Khong xac dinh'
END AS 'Gioi tinh'
FROM NHANVIEN
INNERJOIN PHONG ON NHANVIEN MAPHONG PHONG = MAPHONG WHERE
PHONG MAPHONG @MaPhong =
ANDDATEDIFF YEAR( , NHANVIEN.NGAYSINH,GETDATE())BETWEEN @TuoiToiThieu AND @TuoiToiDa;
COMMIT TRANSACTION;END;
EXECUTE CAU_7 @MaPhong ='KTA';
Câu 8 Viết thủ tục thống kê lương trung bình cho mỗi phòng ban: gồm mã phòng ban, tên
phòng ban, lương trinh bình.CREATE PROCEDURE CAU_8AS
BEGIN TRANSACTION;
DECLARE @LCB FLOAT 1500000.0 = ; Lương cơ bản DECLARE @Ngaycongchuan INT = 26 ; Số ngày công chuẩn SELECT
PHONG MAPHONG AS'Mã phòng ban',
Trang 11PHONG TENPHONG AS N'Tên phòng ban',
AVG(@LCB NHANVIEN NGAYCONG @Ngaycongchuan* / ) AS 'Lương trung bình'
FROM NHANVIEN
INNERJOIN PHONG ON NHANVIEN MAPHONG PHONG = MAPHONG GROUP BY
PHONG.MAPHONG, PHONG.TENPHONG; COMMIT TRANSACTION;END;
EXECUTE CAU_8;
Câu 9 Viết thủ tục in ra mã ngoại ngữ, tên ngoại ngữ, trình độ cao nhất theo mã nhân viên.
CREATE PROCEDURE CAU_9 @MaNhanVien CHAR(5)AS
BEGIN TRANSACTION; SELECT
TDNN MANV AS'Mã nhân viên', TDNN MANN AS'Mã ngoại ngữ', DMNN TENNN AS N'Tên ngoại ngữ', TDNN TDO AS'Trình độ cao nhất'
FROM TDNN
INNERJOIN DMNN ON TDNN MANN DMNN = MANN WHERE
TDNN MANV @MaNhanVien = ; COMMIT TRANSACTION;END;
EXECUTE CAU_9 @MaNhanVien ='HC001';
Câu 10 Viết thủ tục lọc ra tất cả những nhân viên chưa học ngoại ngữ nào gồm mã nhân viên, tên
nhân viên, tên phòng ban.CREATE PROCEDURE CAU_10AS
Trang 12BEGIN TRANSACTION; SELECT
NHANVIEN MANV AS'Mã nhân viên', NHANVIEN HOTEN ASN'Tên nhân viên', PHONG TENPHONG AS 'Tên phòng ban'
FROM NHANVIEN
INNERJOIN PHONG ON NHANVIEN MAPHONG PHONG = MAPHONG WHERE
NHANVIEN MANV NOT IN( SELECT MANV FROM TDNN );
COMMIT TRANSACTION;END;
EXECUTE CAU_10;
Câu 11 Viết thủ tục in ra những phòng ban gồm mã phòng ban, tên phòng ban và tổng lương
Chỉ in ra những phòng ban có tổng lương >=5000CREATE PROCEDURE CAU_11
BEGIN TRANSACTION; DECLARE @LCB INT; SET @LCB 1500000= ; SELECT
PHONG MAPHONG AS'Mã phòng ban', PHONG TENPHONG AS N'Tên phòng ban',
SUM(@LCB NHANVIEN NGAYCONG 26 * / )AS'Tổng lương'
FROM PHONG
INNERJOIN NHANVIEN ON PHONG MAPHONG NHANVIEN = MAPHONG GROUP BY
PHONG.MAPHONG, PHONG.TENPHONG HAVING
SUM(@LCB NHANVIEN NGAYCONG 26 * / ) >= 5000;
Trang 13COMMIT TRANSACTION;END;
EXECUTE CAU_11;
Câu 12 Viết thủ tục in ra tất cả các nhân viên có ngày sinh trùng với ngày sinh hiện tại
CREATE PROCEDURE CAU_12 IN RA CÁC NV CÓ NGÀY SINH TRÙNG VỚI NGÀY HIỆN TẠI
BEGIN TRANSACTION;
DECLARE @NgaySinhHienTai DATE; SET @NgaySinhHienTai =GETDATE(); SELECT
MANV AS 'Mã nhân viên', HOTEN AS 'Tên nhân viên', NGAYSINH AS'Ngày sinh'
FROM NHANVIEN WHERE
NGAYSINH @NgaySinhHienTai= ; COMMIT TRANSACTION;END;
EXECUTE CAU_12;
Câu 13 Viết hàm tạo mã nhân viên tự động dựa vào mã phòng ban và số lượng nhân viên thuộc
phòng ban đó có trong bảng nhân viên.
VD: Phòng ban KTA và số nhân viên thuộc phòng ban KTA trong bảng nhân viên đang có là 10 thì mã mới được tạo ra là KT011.
CREATE FUNCTION CAU_13 (@MaPhongBan VARCHAR( ))10 RETURNS VARCHAR(20)AS
Trang 14SELECT @SoLuongNhanVien =COUNT(*)FROM NHANVIEN WHERE MAPHONG =@MaPhongBan;
Tạo mã nhân viên tự động dựa vào mã phòng ban và số lượng nhân viên
SET @MaNhanVien @MaPhongBan = +'-'+CAST(@SoLuongNhanVien 1 + AS VARCHAR(10));RETURN @MaNhanVien;
DECLARE @MaNhanVienTaoTuDong VARCHAR( );20SET @MaNhanVienTaoTuDong dbo= AUTO_MANV('KT010');
Câu 14 Viết hàm tạo mật khẩu từ ngày sinh
CREATE FUNCTION CAU_14 @DOB ( DATE)RETURNS VARCHAR( )50
DECLARE @Password VARCHAR(50) DECLARE @Year INT, @Month INT, @Day INT
SELECT @Year =YEAR(@DOB), @Month =MONTH(@DOB), @Day =DAY(@DOB) Tạo mật khẩu từ ngày sinh
SET @Password =REPLACE CONVERT( (VARCHAR( ),10 @DOB 112, ),'-',''
RETURN @PasswordEND
Cập nhật mật khẩu cho từng nhân viên
UPDATE NHANVIEN
SET MatKhau = dbo CAU_14 NgaySinh ( )
Câu 15 Viết thủ tục tri cập nhật một viên mới tự động cập nhật tất cả các ngoại ngữ cho nhân viên
Trang 15SET NOCOUNT ON; BEGIN TRANSACTION;
DECLARE @MaPhongBan VARCHAR(10); DECLARE @SoLuongNhanVien INT;
Lấy mã phòng ban và số lượng nhân viên sau khi thêm hoặc cập nhật SELECT @MaPhongBan MAPHONG = FROM inserted;
SELECT @SoLuongNhanVien =COUNT(*) FROM NHANVIEN WHERE MAPHONG =@MaPhongBan;
Kiểm tra số lượng nhân viên và nếu vượt quá 20 thì rollback thao tác @SoLuongNhanVien 20IF >
Câu 17 Viết Trigger chèn tự động mật khẩu theo ngày sinh cho nhân viên.
CREATE TRIGGER CAU_17 SAU KHI INSERT Ở DƯỚI SẼ CẬP NHẬT MẬT KHẨU TỰ ĐỘNGTHEO NGÀY SINH
ON NHANVIENAFTER INSERTAS
SET NOCOUNT ON; UPDATE NHANVIEN
SET MatKhau =FORMAT(NGAYSINH,'MMddyyyy') WHERE MANV IN(SELECT MANV FROM inserted);END;
INSERT INTO NHANVIEN (MANV HOTEN, , GIOITINH, NGAYSINH, HESOLUONG ,MAPHONG, NGAYCONG NGAYBC, )
VALUES ('KT011',N'ABC', 1,'1978-05-20', 3.4,'KTA', 30,'1999-09-24');
Câu 18 Viết Trigger ngăn không cho xóa nhân viên có thời gian công tác trong công ty lớn hơn 10
năm.
Trang 16CREATE TRIGGER CAU_18ON NHANVIEN
INSTEAD OF DELETEAS
INNERJOIN NHANVIEN n ON d MANV n = MANV WHEREDATEDIFF YEAR( , nNGAYBC,GETDATE())> 10 )
BEGIN
RAISERROR ('Không thể xóa nhân viên có thời gian công tác lớn hơn 10 năm.', 16 1, ); ROLLBACK TRANSACTION;
END ELSE BEGIN DELETE n
Câu 19 Viết Trigger không cho xóa nhân viên ở phòng kinh doanh
DROP TRIGGER CAU_18 TRƯỚC KHI CHẠY CAU_19 PHẢI DROP CAU_18 HOẶC NGƯỢC LẠI
CREATE TRIGGER CAU_19ON NHANVIEN
INSTEAD OF DELETEAS
Trang 17FROM deleted d
INNERJOIN NHANVIEN n ON d MANV n = MANV WHERE n MAPHONG ='KDA'
) BEGIN
RAISERROR ('Không thể xóa nhân viên trong phòng kinh doanh.', 16 1, ); ROLLBACK TRANSACTION;
END ELSE BEGIN DELETE n
Câu 20 Ngăn không cho nhập nhân viên có số ngày công lớn hơn 31
CREATE TRIGGER CAU_20ON NHANVIEN
INSTEAD OF INSERT,UPDATE
ASBEGIN IF EXISTS( SELECT 1 FROM inserted
WHERE NGAYCONG 31> )
BEGIN
RAISERROR ('Số ngày công không hợp lệ Vui lòng nhập số ngày công từ 1 đến 31.', 16 1, ); ROLLBACK TRANSACTION;
RETURN; END;END;
INSERT INTO NHANVIEN (MANV HOTEN, , GIOITINH, NGAYSINH, HESOLUONG ,MAPHONG, NGAYCONG NGAYBC , ) THỬ NHẬP NHÂN VIÊN CÓ SỐ NGÀY CÔNG LỚN HƠN 31
VALUES ('KT012',N'ABC', 1,'1978-05-20', 3.4,'KTA', 32,'1999-09-24');