Professional Documents
Culture Documents
22520863 - lâm Tấn Nhật Minh - btth2
22520863 - lâm Tấn Nhật Minh - btth2
2|Page
DELETE 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.
3|Page
EXEC INSERTGV @MSGV=00999, @TENGV=N'Nguyễn Thị C', @DIACHI=N'TPHCM',
@SODT='0123456789', @MSHH=2, @NAMHH='2010'
--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
4|Page
INSERT 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'
--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)
5|Page
AS
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'
--4.4 XOA
DROP PROC INSERT_DT
6|Page
--Câ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'
7|Page
--5.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ĩ'
8|Page
EXEC 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
9|Page
PRINT 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
10 | P a g e
WHERE 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
11 | P a g e
DELETE 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
12 | P a g e
ON DETAI
INSTEAD OF DELETE
AS
BEGIN
DECLARE @MSDT CHAR(6)
SELECT @MSDT = MSDT FROM DELETED
13 | P a g e
INSERT 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
14 | P a g e
UPDATE 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
15 | P a g e
SELECT @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');
16 | P a g e
BEGIN
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)
17 | P a g e
--2.2 XOA
DROP FUNCTION KETQUADT
18 | P a g e