CREATE PROC SP_INSERTGV_MSHH @MSGV INT, @TENGV NVARCHAR30, @SODT VARCHAR10, @DIACHI NVARCHAR50, @MSHH INT, @NAMHH SMALLDATETIME AS BEGIN IF NOT EXISTS SELECT * FROM HOCHAM WHERE MSHH = @
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN KHOA KHOA HỌC VÀ KĨ THUẬT THÔNG TIN
QUẢN LÝ THÔNG TIN BÁO CÁO BÀI TẬP THỰC HÀNH BUỔI 2
GVHD: Nguyễn Gia Tuấn Anh
Phạm Nhật Duy
Lớp: IE103.O23.CNVN Sinh viên thực hiện: Lâm Tấn Nhật Minh 22520863
Tp Hồ Chí Minh, 02/2024
Trang 2-PHAN A -
Câu 1 Tham số vào là MSGV, TENGV, SODT, DIACHI, MSHH, NAMHH Trước khi insert dữ liệu cần kiểm tra MSHH đã tồn tại trong table HOCHAM chưa, nếu chưa thì trả về giá trị 0
CREATE PROC SP_INSERTGV_MSHH
@MSGV INT, @TENGV NVARCHAR(30), @SODT VARCHAR(10),
@DIACHI NVARCHAR(50), @MSHH INT, @NAMHH SMALLDATETIME
AS
BEGIN
IF NOT EXISTS (SELECT * FROM HOCHAM WHERE MSHH = @MSHH)
BEGIN
PRINT N'MSHH KO TON TAI' RETURN 0
END
INSERT INTO GIAOVIEN VALUES (@MSGV, @TENGV, @DIACHI, @SODT,
@MSHH, @NAMHH)
PRINT N'THEM THANH CONG'
END
1.1 THUC THI
INSERT KO THANH CONG
EXEC SP_INSERTGV_MSHH @MSGV=00555, @TENGV=N'Nguyễn Thị C',
@DIACHI=N'TPHCM', @SODT='0123456789', @MSHH=4, @NAMHH='2010'
INSERT THANH CONG
EXEC SP_INSERTGV_MSHH 00999, N'Đỗ Phúc', '0987654321', N'Huế', 2, '2022'
1.2 KIEM TRA
SELECT * FROM GIAOVIEN
1.3 KHOI PHUC DU LIEU
Trang 3DELETE FROM GIAOVIEN WHERE MSGV = 00999
1.4 XOA
DROP PROC SP_INSERTGV_MSHH
Câu 2 Tham số vào là MSGV, TENGV, SODT, DIACHI, MSHH, NAMHH Trước khi insert dữ liệu cần kiểm tra MSGV trong table GIAOVIEN có trùng không, nếu trùng thì trả về giá trị 0
CREATE PROC INSERTGV
@MSGV INT, @TENGV NVARCHAR(30), @SODT VARCHAR(10), @DIACHI
NVARCHAR(50), @MSHH INT, @NAMHH SMALLDATETIME
AS
BEGIN
IF EXISTS (SELECT * FROM GIAOVIEN WHERE MSGV = @MSGV)
BEGIN
PRINT 'MSGV DA TON TAI' RETURN 0
END
INSERT INTO GIAOVIEN VALUES (@MSGV, @TENGV, @DIACHI, @SODT,
@MSHH, @NAMHH)
PRINT 'THEM THANH CONG'
END
2.1 THUC THI
INSERT KHONG THANH CONG
EXEC INSERTGV @MSGV=00201, @TENGV=N'Nguyễn Thị C', @DIACHI=N'TPHCM',
@SODT='0123456789', @MSHH=4, @NAMHH='2010'
INSERT THANH CONG
Trang 4EXEC INSERTGV @MSGV=00999, @TENGV=N'Nguyễn Thị C', @DIACHI=N'TPHCM',
@SODT='0123456789', @MSHH=2, @NAMHH='2010'
2.2 KIEM TRA
SELECT * FROM GIAOVIEN
2.3 KHOI PHUC DU LIEU
DELETE FROM GIAOVIEN WHERE MSGV = 00999
2.4 XOA
DROP PROC INSERTGV
Câu 3 Giống (1) và (2) kiểm tra xem MSGV có trùng không? MSHH có tồn tại chưa? Nếu MSGV trùng thì trả về 0 Nếu MSHH chưa tồn tại trả về 1, ngược lại cho insert dữ liệu
CREATE PROC INSERTGV2
@MSGV INT, @TENGV NVARCHAR(30), @SODT VARCHAR(10), @DIACHI
NVARCHAR(50), @MSHH INT, @NAMHH SMALLDATETIME
AS
BEGIN
IF EXISTS (SELECT * FROM GIAOVIEN WHERE MSGV = @MSGV)
BEGIN
PRINT 'MSGV DA TON TAI' RETURN 0
END
ELSE IF NOT EXISTS (SELECT * FROM HOCHAM WHERE MSHH = @MSHH)
BEGIN
PRINT N'MSHH KO TON TAI' RETURN 0
END
Trang 5INSERT INTO GIAOVIEN VALUES (@MSGV, @TENGV, @DIACHI, @SODT,
@MSHH, @NAMHH)
PRINT 'THEM THANH CONG'
END
3.1 THUC THI
TH1: MSGV TRÙNG
EXEC INSERTGV2 @MSGV=00201, @TENGV=N'Nguyễn Thị C',
@DIACHI=N'TPHCM', @SODT='0123456789', @MSHH=2, @NAMHH='2010'
TH2: MSHH CHƯA TỒN TẠI
EXEC INSERTGV2 @MSGV=00998, @TENGV=N'Nguyễn Thị C',
@DIACHI=N'TPHCM', @SODT='0123456789', @MSHH=4, @NAMHH='2010'
TH3: THEM THANH CONG
EXEC INSERTGV2 @MSGV=00999, @TENGV=N'Nguyễn Thị C',
@DIACHI=N'TPHCM', @SODT='0123456789', @MSHH=2, @NAMHH='2010'
3.2 KIEM TRA
SELECT * FROM GIAOVIEN
3.3 KHOI PHUC DU LIEU
DELETE FROM GIAOVIEN WHERE MSGV = 00999
3.4 XOA
DROP PROC INSERTGV2
Câu 4 Đưa vào MSDT cũ, TENDT mới Hãy cập nhật tên đề tài mới với mã đề tài
cũ không đổi nếu không tìm thấy trả về 0, ngược lại cập nhật và trả về 1
CREATE PROC INSERT_DT
@MSDT CHAR(6), @TENDETAI NVARCHAR(30)
Trang 6AS
BEGIN
IF NOT EXISTS (SELECT * FROM DETAI WHERE @MSDT = MSDT)
BEGIN
PRINT 'MSDT KHONG TON TAI' RETURN 0
END
UPDATE DETAI
SET TENDT = @TENDETAI
WHERE MSDT = @MSDT
RETURN 1
END
4.1 THUC THI
TH1: MSDT KHONG TON TAI
EXEC INSERT_DT @MSDT = 97999, @TENDETAI = 'HOC MAY'
TH2: THANH CONG
EXEC INSERT_DT @MSDT = 97005, @TENDETAI = 'HOC MAY'
4.2 KIEM TRA
SELECT * FROM DETAI WHERE MSDT = 97005
4.3 KHOI PHUC DU LIEU
EXEC INSERT_DT @MSDT = 97005, @TENDETAI = N'Xử lý ảnh'
4.4 XOA
DROP PROC INSERT_DT
Trang 7Câu 5 Tham số đưa vào MSSV, TENSV mới, DIACHI mới Hãy cập nhật sinh viên trên với MSSV không đổi, nếu không tìm thấy trả về 0, ngược lại cập nhật và trả
về 1
CREATE PROC INSERT_SV
@MSSV INT, @TENSV NVARCHAR(30), @DIACHI NCHAR(30)
AS
BEGIN
IF NOT EXISTS (SELECT * FROM SINHVIEN WHERE MSSV = @MSSV)
BEGIN
PRINT 'MSSV KHONG TON TAI' RETURN 0
END
UPDATE SINHVIEN
SET TENSV = @TENSV,
DIACHI = @DIACHI WHERE MSSV = @MSSV
PRINT 'CAP NHAT THANH CONG'
RETURN 1
END
5.1 THUC THI
TH1 MSSV KHONG TON TAI
EXEC INSERT_SV @MSSV = 13529999, @TENSV = 'NGUYENVANA', @DIACHI = 'THU DUC'
TH2 THANH CONG
EXEC INSERT_SV @MSSV = 13520001, @TENSV = 'NGUYENVANA', @DIACHI = 'THU DUC'
5.2 KIEM TRA
SELECT* FROM SINHVIEN
Trang 85.3 KHOI PHUC DU LIEU
EXEC INSERT_SV @MSSV = 13520001, @TENSV = N'Nguyễn Văn An', @DIACHI = N'THỦ ĐỨC'
5.4 XOA
DROP PROC INSERT_SV
-PHAN B -
Câu 1 Đưa vào TENHV trả ra: Số GV thỏa học vị, nếu không tìm thấy trả về 0
CREATE PROC SP_SOGVTHOAHOCVI @TENHV NVARCHAR(20), @SOGV INT
OUTPUT
AS
BEGIN
IF NOT EXISTS (SELECT * FROM HOCVI WHERE TENHV = @TENHV)
BEGIN
SET @SOGV = 0 PRINT N'TENHV KO TON TAI' END
ELSE
BEGIN
SELECT @SOGV = COUNT(DISTINCT MSGV) FROM GV_HV_CN, HOCVI
WHERE GV_HV_CN.MSHV = HOCVI.MSHV AND TENHV =
@TENHV
END END
1.1 THUC THI VA KIEM TRA
DECLARE @SOGV INT, @TENHV NVARCHAR(20)
SET @TENHV = N'Thạc sĩ'
Trang 9EXEC SP_SOGVTHOAHOCVI @TENHV, @SOGV OUTPUT
PRINT N'Số GV có học vị ' + @TENHV + N' là: ' + CAST(@SOGV AS VARCHAR)
1.2 XOA
DROP PROC SP_SOGVTHOAHOCVI
Câu 2 Đưa vào MSDT cho biết: Điểm trung bình của đề tài, nếu không tìm thấy trả về 0
CREATE PROC AVERAGE_DIEMDT
@MSDT CHAR (6), @DTB FLOAT OUTPUT
AS
BEGIN
IF NOT EXISTS (SELECT * FROM DETAI WHERE MSDT = @MSDT)
BEGIN
PRINT 'MSDT KHONG TON TAI' RETURN 0
END
SELECT @DTB = ((SUM(GV_HDDT.DIEM) + SUM(GV_PBDT.DIEM)+
SUM(GV_UVDT.DIEM)) / (count(GV_HDDT.DIEM) + count(GV_PBDT.DIEM)+
count(GV_UVDT.DIEM)))
FROM DETAI, GV_HDDT, GV_PBDT, GV_UVDT
WHERE GV_HDDT.MSDT = @MSDT AND GV_PBDT.MSDT = @MSDT AND
GV_UVDT.MSDT = @MSDT
RETURN 1
END
2.1 THUC THI VA KIEM TRA
DECLARE @DTB FLOAT, @MSDT CHAR(6)
SET @MSDT = 97005
EXEC AVERAGE_DIEMDT @MSDT, @DTB OUTPUT
Trang 10PRINT N'Điểm trung bình của đề tài có mã số ' + @MSDT + N' là: ' + CAST(@DTB AS VARCHAR)
2.2 XOA
DROP PROC AVERAGE_DIEMDT
Câu 3 Đưa vào TENGV trả ra: SDT của giáo viên đó, nếu không tìm thấy trả về 0 Nếu trùng tên thì có báo lỗi không? Tại sao? Làm sao để hiện thông báo có bao nhiêu giáo viên trùng tên và trả về các SDT
CREATE PROC GV_SDT
@TENGV NVARCHAR(30), @SODT NVARCHAR(30) OUTPUT, @SOGVTRUNG INT OUTPUT
AS
BEGIN
KIỂM TRA XEM CÓ BAO NHIÊU GIÁO VIÊN TRÙNG TÊN
SELECT @SOGVTRUNG = COUNT(*)
FROM GIAOVIEN
WHERE TENGV = @TENGV
IF @SOGVTRUNG = 0
BEGIN
SET @SODT = 0
RETURN 0
END
CÓ NHIỀU GIÁO VIÊN TRÙNG TÊN
IF @SOGVTRUNG > 1
BEGIN
SET @SODT = N'Có nhiều sdt khớp với tên giáo viên trên'
SELECT SODT
FROM GIAOVIEN
Trang 11WHERE TENGV = @TENGV
END
CHỈ CÓ 1 GIÁO VIÊN TRÙNG TÊN
ELSE
BEGIN
SELECT @SODT = SODT
FROM GIAOVIEN
WHERE TENGV = @TENGV
END
END
***Với đoạn lệnh sql trên thì khi có nhiều giáo viên có trùng tên, nó sẽ đưa ra bảng gồm nhiều tên và sdt, trong dòng message sẽ in ra biến @SODT đã gán vào chuỗi ký tự thông báo là có nhiều giáo viên trùng tên Còn nếu chỉ có 1 tên khớp thì nó sẽ đưa ra sdt của người đó ngay
3.1 THUC THI
TH1 CO 1 GIAO VIEN
DECLARE @TENGV NVARCHAR(30), @SODT VARCHAR(30), @SOGVTRUNG INT SET @TENGV = N'Trần Trung'
EXEC GV_SDT @TENGV, @SODT OUTPUT, @SOGVTRUNG OUTPUT
PRINT @SODT
TH2 CO 2 GIAO VIEN
INSERT INTO GIAOVIEN VALUES (00206,N'Trần Trung',N'Bến
Tre','757283593',1,'1996')
DECLARE @TENGV NVARCHAR(30), @SODT NVARCHAR(30), @SOGVTRUNG INT SET @TENGV = N'Trần Trung'
EXEC GV_SDT @TENGV, @SODT OUTPUT, @SOGVTRUNG OUTPUT
PRINT @SODT
3.2 KHOI PHUC DU LIEU
Trang 12DELETE FROM GIAOVIEN
WHERE MSGV = 00206
3.3 XOA
DROP PROC GV_SDT
Câu 4 Đưa vào MSHD cho biết: Điểm trung bình các đề tài của hội đồng đó
CREATE PROC AVERAGE_DT_DIEM @MSHD INT, @DTB FLOAT OUTPUT
AS
BEGIN
SELECT @DTB = ((SUM(hd.DIEM) + SUM(uv.DIEM)+ SUM(pb.DIEM)) /
(count(hd.DIEM) + count(uv.DIEM)+ count(pb.DIEM)))
FROM HOIDONG , GV_HDDT HD, GV_PBDT PB,GV_UVDT UV
WHERE HOIDONG.MSGV=HD.MSGV AND HOIDONG.MSGV=UV.MSGV AND HOIDONG.MSGV=PB.MSGV AND HOIDONG.MSHD=@MSHD
END
4.1 THUC THI
DECLARE @MSHD INT, @DTB FLOAT
SET @MSHD = 1
EXEC AVERAGE_DT_DIEM @MSHD, @DTB OUTPUT
PRINT @DTB
4.2 XOA
DROP PROC AVERAGE_DT_DIEM
Câu 5 Đưa vào TENGV cho biết: Số đề tài hướng dẫn, số đề tài phản biện do giáo viên đó phụ trách Nếu trùng tên thì có báo lỗi không hay hệ thống sẽ đếm tất cả các đề tài của những giáo viên trùng tên đó?
-PHAN C -
Câu 1 Tạo Trigger thỏa mãn điều kiện khi xóa một đề tài sẽ xóa các thông tin liên quan
CREATE TRIGGER TRIG_XOATHONGTINDETAI
Trang 13ON DETAI
INSTEAD OF DELETE
AS
BEGIN
DECLARE @MSDT CHAR(6)
SELECT @MSDT = MSDT FROM DELETED
XOA CAC BANG LIEN QUAN
DELETE SV_DETAI WHERE MSDT = @MSDT
DELETE GV_HDDT WHERE MSDT = @MSDT
DELETE GV_PBDT WHERE MSDT = @MSDT
DELETE GV_UVDT WHERE MSDT = @MSDT
DELETE HOIDONG_DT WHERE MSDT = @MSDT
XOA BANG DETAI
DELETE DETAI WHERE MSDT = @MSDT
END
1.1 KIEM TRA
SELECT * FROM DETAI
SELECT * FROM HOIDONG_DT
DELETE FROM DETAI WHERE MSDT = '97005'
1.2 KHOI PHUC DU LIEU
INSERT INTO DETAI VALUES('97005',N'Xử lý ảnh')
INSERT INTO SV_DETAI VALUES('13520002','97005')
INSERT INTO SV_DETAI VALUES('13520006','97005')
INSERT INTO GV_HDDT VALUES(00203,'97005',9)
Trang 14INSERT INTO GV_PBDT VALUES(00201,'97005',8)
INSERT INTO GV_UVDT VALUES(00205,'97005',8)
INSERT INTO GV_UVDT VALUES(00202,'97005',7)
INSERT INTO GV_UVDT VALUES(00204,'97005',9)
INSERT INTO HOIDONG_DT VALUES(1,'97005',N'Được')
1.3 XOA
DROP TRIGGER TRIG_XOATHONGTINDETAI
Câu 2 Tạo Trigger thỏa mãn ràng buộc là khi đổi 1 mã số giáo viên (MSGV) thì
sẽ thay đổi các thông tin liên quan
CREATE TRIGGER UPDATE_MSGV
ON GIAOVIEN
AFTER UPDATE
AS
BEGIN
IF UPDATE(MSGV)
BEGIN
DECLARE @MSGV CHAR(6), @OLD CHAR(6)
SELECT @MSGV = MSGV FROM INSERTED
SELECT @OLD = MSGV FROM DELETED
UPDATE GV_HV_CN
SET MSGV = @MSGV
WHERE MSGV = @OLD
UPDATE GV_HDDT
SET MSGV = @MSGV
WHERE MSGV = @OLD
Trang 15UPDATE GV_PBDT
SET MSGV = @MSGV
WHERE MSGV = @OLD
UPDATE GV_UVDT
SET MSGV = @MSGV
WHERE MSGV = @OLD
UPDATE HOIDONG_GV
SET MSGV = @MSGV
WHERE MSGV = @OLD
END
2.1 KIEM TRA
SELECT * FROM GIAOVIEN
SELECT * FROM GV_UVDT
UPDATE GIAOVIEN
SET MSGV = 00999
WHERE MSGV = 00201
2.2 XOA
DROP TRIGGER UPDATE_MSGV
Câu 3 Tạo Trigger thỏa mãn ràng buộc là một hội đồng không quá 10 đề tài Dùng “Group by” có được không? Giải thích
CREATE TRIGGER HD_KHONGQUA_10DT
ON HOIDONG_DT
FOR INSERT
AS
BEGIN
DECLARE @MSHD INT
Trang 16SELECT @MSHD = MSHD FROM INSERTED
IF(SELECT COUNT(*) FROM HOIDONG_DT WHERE MSHD = @MSHD GROUP BY MSHD) > 10
BEGIN
PRINT 'HOI DONG NAY KHONG DUOC QUA 10 DE TAI'
ROLLBACK TRANSACTION
END
END
***Dùng group by được vì ta dùng hàm count để đếm số đề tài mà hội đồng đó đăng kí nên sẽ cần GROUP BY MSHD
3.1 KIEM TRA
-VI TALBE DETAI KHONG CO DU SO LUONG DE TAI DANG KI
INSERT DETAI VALUES ('97007',N'Quản lý thư viện'),
('97008',N'Quản lý thư viện'),
('97009',N'Quản lý thư viện'),
('97010',N'Quản lý thư viện'),
('97011',N'Quản lý thư viện');
INSERT HOIDONG_DT VALUES (1,'97003',N'Được'),
(1,'97004',N'Được'),
(1,'97006',N'Được'),
(1,'97007',N'Được'),
(1,'97008',N'Được'),
(1,'97009',N'Được'),
(1,'97010',N'Được'),
(1,'97011',N'Được');
DELETE HOIDONG_DT WHERE MSDT IN
('97003','97004','97006','97007','97008','97009','97010','97011');
DELETE DETAI WHERE MSDT IN ('97007','97008','97009','97010','97011');
3.2 XOA
DROP TRIGGER HD_KHONGQUA_10DT
-PHAN D -
Câu 1 Viết hàm tính điểm trung bình của một đề tài Giá trị trả về là điểm trung bình ứng với mã số đề tài nhập vào
CREATE FUNCTION TINH_DTB_DT (@MSDT CHAR(6))
RETURNS FLOAT
AS
Trang 17BEGIN
DECLARE @DTB FLOAT
SELECT @DTB = ((SUM(HD.DIEM) + SUM(UV.DIEM)+ SUM(PB.DIEM)) /
(count(HD.DIEM) + count(UV.DIEM)+ count(PB.DIEM)))
FROM DETAI DT, GV_HDDT HD, GV_PBDT PB,GV_UVDT UV
WHERE DT.MSDT=HD.MSDT AND DT.MSDT=PB.MSDT AND
DT.MSDT=UV.MSDT AND DT.MSDT= @MSDT
RETURN @DTB
END
1.1 KIEM TRA THONG QUA CAU 2 CO SU DUNG FUNCTION TREN
1.2 XOA
DROP FUNCTION TINH_DTB_DT
Câu 2 Trả về kết quả của đề tài theo MSDT nhập vào Kết quả là DAT nếu như điểm trung bình từ 5 trở lên, và KHONGDAT nếu như điểm trung bình dưới 5
CREATE FUNCTION KETQUADT(@MSDT CHAR(6))
RETURNS VARCHAR(10)
AS
BEGIN
DECLARE @DTB FLOAT
SELECT @DTB = DBO.TINH_DTB_DT(MSDT)
FROM DETAI
WHERE MSDT = @MSDT
IF(@DTB >= 5)
RETURN 'DAT'
RETURN 'KHONG DAT'
END
2.1 KIEMTRA
DECLARE @MSDT CHAR(6)
SET @MSDT = 97001
PRINT DBO.TINH_DTB_DT(@MSDT)
Trang 182.2 XOA
DROP FUNCTION KETQUADT