Download as pdf or txt
Download as pdf or txt
You are on page 1of 18

ĐẠ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 


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

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.

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

3|Page
EXEC 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

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'

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

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'

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

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'

--TH2 THANH CONG


EXEC INSERT_SV @MSSV = 13520001, @TENSV = 'NGUYENVANA', @DIACHI =
'THU DUC'

--5.2 KIEM TRA


SELECT* FROM SINHVIEN

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

--2.1 THUC THI VA KIEM TRA


DECLARE @DTB FLOAT, @MSDT CHAR(6)
SET @MSDT = 97005
EXEC AVERAGE_DIEMDT @MSDT, @DTB OUTPUT

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

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

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

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

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

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

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

You might also like