Document 3
Document 3
Document 3
INSERT DỮ LIỆU
RETURN;
END;
--116
CREATE FUNCTION Func_InKetQuaSinhVien()
RETURNS TABLE
AS
RETURN
(
SELECT
SV.MSSV AS [Mã số],
SV.Ten AS [Họ tên],
CASE
WHEN DTB >= 9 THEN 'Xuất sắc'
WHEN DTB >= 8 THEN 'Giỏi'
WHEN DTB >= 7 THEN 'Khá'
WHEN DTB >= 5 THEN 'Trung bình'
ELSE 'Yếu'
END AS [Xếp loại],
DTB AS [Điểm trung bình]
FROM
(SELECT
MSSV,
AVG((DiemKTGiuaky + DiemThiLan1 + DiemThiLan2) / 3.0) AS DTB
FROM
KetQua
GROUP BY
MSSV) AS KQ
INNER JOIN
SinhVien AS SV ON KQ.MSSV = SV.MSSV
);
--117
CREATE FUNCTION Func_DiemTrungBinhKhoa (@MaKhoa VARCHAR(10))
RETURNS DECIMAL(4,2)
AS
BEGIN
DECLARE @DiemTrungBinh DECIMAL(4,2);
RETURN @DiemTrungBinh;
END;
--118
CREATE FUNCTION Func_SoMonDat(@MSSV VARCHAR(6))
RETURNS INT
AS
BEGIN
DECLARE @SoMonDat INT;
RETURN @SoMonDat;
END;
--119
CREATE FUNCTION Func_SoMonKhongDat3(@MSSV VARCHAR(6))
RETURNS INT
AS
BEGIN
DECLARE @SoMonKhongDat INT;
RETURN @SoLuongSinhVien;
END;
DECLARE @MaKhoa VARCHAR(10) = 'CNTT';
DECLARE @HocKy INT = 1;
DECLARE @NamHoc Varchar = '2011-2012';
--124
CREATE PROCEDURE SinhVienDiemCaoNhat
@MaKhoa CHAR(4),
@MaMonHoc VARCHAR(10)
AS
BEGIN
SELECT
SinhVien.MSSV,
SinhVien.Ten,
KetQua.DTB
FROM
SinhVien
INNER JOIN
KetQua ON SinhVien.MSSV = KetQua.MSSV
INNER JOIN
GiangDay ON KetQua.MaKhoaHoc = GiangDay.MaKhoaHoc
WHERE
GiangDay.MaMH = @MaMonHoc
AND SinhVien.MaKhoa = @MaKhoa
AND KetQua.DTB = (
SELECT MAX(DTB)
FROM KetQua
WHERE MaKhoaHoc IN (SELECT MaKhoaHoc FROM GiangDay WHERE MaMH = @MaMonHoc)
);
END;
--125
CREATE PROCEDURE SinhVienThiLai
@MaKhoa CHAR(4),
@MaMonHoc VARCHAR(10)
AS
BEGIN
SELECT
SinhVien.MSSV,
SinhVien.Ten,
SinhVien.NgaySinh,
KetQua.DiemThi
FROM
SinhVien
INNER JOIN
KetQua ON SinhVien.MSSV = KetQua.MSSV
INNER JOIN
GiangDay ON KetQua.MaKhoaHoc = GiangDay.MaKhoaHoc
WHERE
GiangDay.MaMH = @MaMonHoc
AND SinhVien.MaKhoa = @MaKhoa
AND (KetQua.DiemThiLan1 IS NULL OR KetQua.DiemThiLan2 IS NULL);
END;
--126
CREATE PROCEDURE ThongKeTyLeDauRot
AS
BEGIN
SELECT
GiangDay.MaMH,
MonHoc.TenMH,
SUM(CASE WHEN KetQua.DTB >= 5 THEN 1 ELSE 0 END) AS SLDau,
SUM(CASE WHEN KetQua.DTB < 5 THEN 1 ELSE 0 END) AS SLRot
FROM
GiangDay
INNER JOIN
MonHoc ON GiangDay.MaMH = MonHoc.MaMH
LEFT JOIN
KetQua ON GiangDay.MaKhoaHoc = KetQua.MaKhoaHoc
GROUP BY
GiangDay.MaMH, MonHoc.TenMH;
END;
--127
CREATE PROCEDURE KhoaSiSoThap
@SoLuong INT
AS
BEGIN
SELECT
KHOA.MaKhoa,
KHOA.TenKhoa,
COUNT(SinhVien.MSSV) AS Siso
FROM
KHOA
LEFT JOIN
SinhVien ON KHOA.MaKhoa = SinhVien.MaKhoa
GROUP BY
KHOA.MaKhoa, KHOA.TenKhoa
HAVING
COUNT(SinhVien.MSSV) <= @SoLuong;
END;
--128
CREATE PROCEDURE SinhVienChuaNhapDiem
AS
BEGIN
SELECT
MSSV,
Ten,
PhaiNu
FROM
SinhVien
WHERE
MSSV NOT IN (SELECT DISTINCT MSSV FROM KetQua);
END;
--129
CREATE PROCEDURE DanhSachSinhVienTheoKhoa
@MaKhoa CHAR(4)
AS
BEGIN
SELECT
MSSV,
Ten AS HoTen,
CASE WHEN PhaiNu = 1 THEN 'Nữ' ELSE 'Nam' END AS Phai,
DiaChi
FROM
SinhVien
WHERE
MaKhoa = @MaKhoa;
END;
--130
CREATE PROCEDURE ThongTinDiemMonHoc
@MaMonHoc VARCHAR(10)
AS
BEGIN
SELECT
MonHoc.TenMH AS TenMonHoc,
COUNT(KetQua.MSSV) AS SoLuongSinhVien,
MIN(KetQua.DTB) AS DiemNhoNhat,
MAX(KetQua.DTB) AS DiemLonNhat,
AVG(KetQua.DTB) AS DiemTrungBinh
FROM
GiangDay
INNER JOIN
MonHoc ON GiangDay.MaMH = MonHoc.MaMH
LEFT JOIN
KetQua ON GiangDay.MaKhoaHoc = KetQua.MaKhoaHoc
WHERE
GiangDay.MaMH = @MaMonHoc
GROUP BY
MonHoc.TenMH;
END;
--131
CREATE PROCEDURE SinhVienBiThiLai
@MaKhoa CHAR(4),
@MaMonHoc VARCHAR(10)
AS
BEGIN
SELECT
SinhVien.MSSV,
SinhVien.NgaySinh,
KetQua.DiemThiLan1
FROM
SinhVien
INNER JOIN
KetQua ON SinhVien.MSSV = KetQua.MSSV
INNER JOIN
GiangDay ON KetQua.MaKhoaHoc = GiangDay.MaKhoaHoc
WHERE
GiangDay.MaMH = @MaMonHoc
AND SinhVien.MaKhoa = @MaKhoa
AND (KetQua.DiemThiLan1 IS NULL OR KetQua.DiemThiLan2 IS NULL);
END;
--132
CREATE PROCEDURE ThongTinMonHoc
@MaMH VARCHAR(10)
AS
BEGIN
SELECT
MonHoc.TenMH AS TenMonHoc,
COUNT(KetQua.MSSV) AS SoLuongSinhVien,
MIN(KetQua.DTB) AS DiemNhoNhat,
MAX(KetQua.DTB) AS DiemLonNhat,
AVG(KetQua.DTB) AS DiemTrungBinh
FROM
GiangDay
INNER JOIN
MonHoc ON GiangDay.MaMH = MonHoc.MaMH
LEFT JOIN
KetQua ON GiangDay.MaKhoaHoc = KetQua.MaKhoaHoc
WHERE
GiangDay.MaMH = @MaMH
GROUP BY
MonHoc.TenMH;
END;
--133
CREATE PROCEDURE ThongKeDiemKhoa
@MaKhoa CHAR(4)
AS
BEGIN
SELECT
KHOA.TenKhoa AS TenKhoa,
COUNT(KetQua.MSSV) AS SoLuongDiemThi,
MIN(KetQua.DTB) AS DiemNhoNhat,
MAX(KetQua.DTB) AS DiemLonNhat,
AVG(KetQua.DTB) AS DiemTrungBinh
FROM
KHOA
LEFT JOIN
SinhVien ON KHOA.MaKhoa = SinhVien.MaKhoa
LEFT JOIN
KetQua ON SinhVien.MSSV = KetQua.MSSV
--134
CREATE PROCEDURE SoLuongSinhVienTheoGiaoVien
@MaGV CHAR(4)
AS
BEGIN
SELECT
GIAOVIEN.TenGV AS TenGiaoVien,
COUNT(DISTINCT KetQua.MSSV) AS SoLuongSinhVien
FROM
GIAOVIEN
LEFT JOIN
GiangDay ON GIAOVIEN.MaGV = GiangDay.MaGV
LEFT JOIN
KetQua ON GiangDay.MaKhoaHoc = KetQua.MaKhoaHoc
WHERE
GIAOVIEN.MaGV = @MaGV
GROUP BY
GIAOVIEN.TenGV;
END;
--135
CREATE PROCEDURE ThemKetQuaHocTap
@MSSV VARCHAR(6),
@MaKhoaHoc CHAR(4),
@DiemKTGiuaKy DECIMAL(4,1),
@DiemThiLan1 DECIMAL(4,1),
@DiemThiLan2 DECIMAL(4,1)
AS
BEGIN
BEGIN TRY
INSERT INTO KetQua (MSSV, MaKhoaHoc, DiemKTGiuaky, DiemThiLan1, DiemThiLan2, DTB)
VALUES (@MSSV, @MaKhoaHoc, @DiemKTGiuaKy, @DiemThiLan1, @DiemThiLan2,
ROUND(0.4 * @DiemKTGiuaKy + 0.6 * IIF(@DiemThiLan1 >= 5, @DiemThiLan1,
@DiemThiLan2), 1));
UPDATE SinhVien
SET SoTCTichLuy = SoTCTichLuy + 1
WHERE MSSV = @MSSV;
RAISERROR ('Thêm kết quả học tập thành công.', 0, 1);
END TRY
BEGIN CATCH
RAISERROR ('Thêm kết quả học tập thất bại.', 16, 1);
END CATCH
END;
--136
CREATE PROCEDURE SuaMaSinhVien
@MaSVCu VARCHAR(6),
@MaSVMoi VARCHAR(6)
AS
BEGIN
BEGIN TRY
IF EXISTS (SELECT 1 FROM SinhVien WHERE MSSV = @MaSVMoi)
RAISERROR ('Mã số sinh viên mới đã tồn tại.', 16, 1);
ELSE
BEGIN
UPDATE SinhVien
SET MSSV = @MaSVMoi
WHERE MSSV = @MaSVCu;
--137
CREATE PROCEDURE CapNhatConDangHoc
@MaSV VARCHAR(6),
@ConDangHoc BIT
AS
BEGIN
UPDATE SinhVien
SET ConDangHoc = @ConDangHoc
WHERE MSSV = @MaSV;
END;
--138
CREATE PROCEDURE HuyKetQuaHocTap
@MaSV VARCHAR(6)
AS
BEGIN
DELETE FROM KetQua
WHERE MSSV = @MaSV;
END;
--139
CREATE PROCEDURE XoaDiemThiMonHoc
@MaSV VARCHAR(6),
@MaMonHoc VARCHAR(10)
AS
BEGIN
DELETE FROM KetQua
WHERE MSSV = @MaSV AND MaKhoaHoc IN (SELECT MaKhoaHoc FROM GiangDay WHERE MaMH =
@MaMonHoc);
RAISERROR ('Đã xóa thành công kết quả môn thi %s của sinh viên %s.', 0, 1, @MaMonHoc,
@MaSV);
END;
--140
CREATE PROCEDURE XoaDiemThiSinhVien
@MaSV VARCHAR(6)
AS
BEGIN
DELETE FROM KetQua
WHERE MSSV = @MaSV;
RAISERROR ('Đã xóa toàn bộ điểm thi của sinh viên %s.', 0, 1, @MaSV);
END;
--141
CREATE PROCEDURE XoaThongTinSinhVien
@MaSV VARCHAR(6)
AS
BEGIN
DELETE FROM SinhVien
WHERE MSSV = @MaSV;
RAISERROR ('Đã xóa toàn bộ Thông tin của sinh viên %s.', 0, 1, @MaSV);
END;
--142 Xóa Thông TIn KHoa
CREATE PROCEDURE XoaThongTinKHoa
@MaKhoa VARCHAR(6)
AS
BEGIN
DELETE FROM KHOA
WHERE MaKhoa = @MaKhoa;
RAISERROR ('Đã xóa toàn bộ thông tin của khoa %s.', 0, 1, @MaKhoa);
END;
--143 Xóa kết quả học tập
CREATE PROCEDURE XoaThongTinKHoa
@MaKhoa VARCHAR(6),
@MaSV VARCHAR(6)
AS
BEGIN
DELETE FROM KetQua
WHERE MaKhoaHoc = @MaKhoa and MSSV = @MaSV;
RAISERROR ('Đã xóa toàn thông tin kêt quả %s.', 0, 1, @MaKhoa);
END;
-- 148. Trigger không cho phép chỉnh sửa trên khóa chính MSSV của bảng SinhVien
CREATE TRIGGER NoUpdateMSSV
ON SinhVien
INSTEAD OF UPDATE
AS
BEGIN
IF UPDATE(MSSV)
BEGIN
RAISERROR ('Cannot update primary key column MSSV.', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END;
UPDATE SinhVien
SET
Ten = i.Ten,
PhaiNu = i.PhaiNu,
DiaChi = i.DiaChi,
DienThoai = i.DienThoai,
MaKhoa = i.MaKhoa,
SoCMND = i.SoCMND,
NgaySinh = i.NgaySinh,
NgayNhapHoc = i.NgayNhapHoc,
NgayVaoDoan = i.NgayVaoDoan,
NgayVaoDang = i.NgayVaoDang,
NgayRaTruong = i.NgayRaTruong,
DTBTichLuy = i.DTBTichLuy,
SoTCTichLuy = i.SoTCTichLuy
FROM
SinhVien s
JOIN inserted i ON s.MSSV = i.MSSV;
END;
-- 149. Trigger cập nhật lại cột DTB trong table KetQua
CREATE TRIGGER UpdateDTB
ON KetQua
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE KQ
SET
DTB = ROUND(0.4 * I.DiemKTGiuaky + 0.6 * IIF(I.DiemThiLan1 >= I.DiemThiLan2,
I.DiemThiLan1, I.DiemThiLan2), 1)
FROM
KetQua KQ
JOIN inserted I ON KQ.MSSV = I.MSSV;
END;
-- 150. Trigger tự động cập nhật số môn đã học và DTB trong table SinhVien
CREATE TRIGGER UpdateSinhVien
ON KetQua
AFTER INSERT, DELETE
AS
BEGIN
UPDATE SV
SET
DTBTichLuy = (SELECT AVG(DTB) FROM KetQua WHERE KetQua.MSSV = SV.MSSV)
FROM
SinhVien SV
INNER JOIN
deleted D ON SV.MSSV = D.MSSV;
UPDATE SV
SET
DTBTichLuy = (SELECT AVG(DTB) FROM KetQua WHERE KetQua.MSSV = SV.MSSV)
FROM
SinhVien SV
INNER JOIN
inserted I ON SV.MSSV = I.MSSV;
END;
-- 151. Trigger tự động cập nhật SL_CBGD trong table Khoa khi insert hoặc delete trên
table GiaoVien
CREATE TRIGGER UpdateKhoa
ON GiaoVien
AFTER INSERT, DELETE
AS
BEGIN
UPDATE K
SET
SL_CBGD = (SELECT COUNT(*) FROM GiaoVien WHERE GiaoVien.MaKhoa = K.MaKhoa)
FROM
Khoa K
INNER JOIN
inserted I ON K.MaKhoa = I.MaKhoa;
UPDATE K
SET
SL_CBGD = (SELECT COUNT(*) FROM GiaoVien WHERE GiaoVien.MaKhoa = K.MaKhoa)
FROM
Khoa K
INNER JOIN
deleted D ON K.MaKhoa = D.MaKhoa;
END;
-- 152. Trigger giáo viên chỉ được dạy tối đa 3 môn trong một học kỳ
CREATE TRIGGER CheckSoMonGiaoVien
ON GiangDay
AFTER INSERT, UPDATE
AS
BEGIN
IF EXISTS (
SELECT 1
FROM inserted I
JOIN (
SELECT MaGV, HocKy, NienKhoa, COUNT(*) AS SoMon
FROM GiangDay
GROUP BY MaGV, HocKy, NienKhoa
) AS GD ON I.MaGV = GD.MaGV AND I.HocKy = GD.HocKy AND I.NienKhoa = GD.NienKhoa
WHERE GD.SoMon > 3
)
BEGIN
RAISERROR ('A teacher can teach up to 3 courses in a semester.', 16, 1);
ROLLBACK TRANSACTION;
END;
END;
-- 154. Trigger kiểm tra ràng buộc trên NgayVaoDoan và NgayVaoDang trong bảng SinhVien
CREATE TRIGGER CheckNgayVaoDoanVaoDang
ON SinhVien
AFTER INSERT, UPDATE
AS
BEGIN
IF EXISTS (SELECT 1 FROM inserted WHERE (NgayVaoDoan IS NULL AND NgayVaoDang IS NOT
NULL) OR (NgayVaoDoan >= NgayVaoDang))
BEGIN
RAISERROR('Invalid values for NgayVaoDoan and NgayVaoDang.', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END;
END;