Document 3

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 15

-- Tạo bảng KHOA

CREATE TABLE KHOA (


MaKhoa CHAR(4) PRIMARY KEY,
TenKhoa NVARCHAR(50) NOT NULL,
SL_CBGD INT CHECK (SL_CBGD >= 0 AND SL_CBGD <= 4) DEFAULT 0
);

-- Tạo bảng GIAOVIEN


CREATE TABLE GIAOVIEN (
MaGV CHAR(4) PRIMARY KEY,
TenGV NVARCHAR(50) NOT NULL,
MaKhoa CHAR(4),
CONSTRAINT FK_GIAOVIEN_MaKhoa FOREIGN KEY (MaKhoa) REFERENCES KHOA(MaKhoa)
);
-- Tạo bảng MonHoc
CREATE TABLE MonHoc (
MaMH VARCHAR(10) PRIMARY KEY,
TenMH VARCHAR(255) NOT NULL,
SoTC_ToiThieu INT NOT NULL,
);
-- Tạo bảng GiangDay
CREATE TABLE GiangDay (
MaKhoaHoc CHAR(4) PRIMARY KEY,
MaGV VARCHAR(10) NOT NULL,
MaMH VARCHAR(10) NOT NULL,
HocKy INT NOT NULL,
NienKhoa VARCHAR(9) NOT NULL,
NgayBatDau DATE NOT NULL,
NgayBatDauLyThuyet DATE NOT NULL,
NgayBatDauThucHanh DATE NOT NULL,
NgayKetThuc DATE,
SoTCLT INT CHECK (SoTCLT >= 0),
SoTCTH INT CHECK (SoTCTH >= 0),
SoTietLT INT CHECK (SoTietLT >= 0),
SoTietTH INT CHECK (SoTietTH >= 0),
TongSoTC INT CHECK (TongSoTC BETWEEN 2 AND 6),
FOREIGN KEY (MaMH) REFERENCES MonHoc(MaMH)
);
-- Tạo bảng SinhVien

CREATE TABLE SinhVien (


MSSV VARCHAR(6) PRIMARY KEY,
Ten NVARCHAR(255) NOT NULL,
PhaiNu BIT NOT NULL,
DiaChi NVARCHAR(255) NOT NULL,
DienThoai VARCHAR(10),
MaKhoa CHAR(4) REFERENCES Khoa(MaKhoa),
SoCMND VARCHAR(12) UNIQUE,
NgaySinh DATE,
NgayNhapHoc DATE NOT NULL,
NgayVaoDoan DATE,
NgayVaoDang DATE,
NgayRaTruong DATE,
DTBTichLuy DECIMAL(4,2) DEFAULT 0,
SoTCTichLuy INT DEFAULT 0,
CONSTRAINT CHK_PhaiNu CHECK (PhaiNu IN (0, 1)),
CONSTRAINT CHK_DienThoai CHECK (DienThoai IS NULL OR (LEN(DienThoai) >= 8 OR
LEN(DienThoai) <= 10)),
CONSTRAINT CHK_NgayVaoDoan CHECK (
(NgayVaoDoan IS NULL AND NgayVaoDang IS NULL) OR
(NgayVaoDoan IS NOT NULL AND DATEDIFF(YEAR, NgaySinh, NgayVaoDoan) >= 16)
)
CONSTRAINT CHK_NgayVaoDang CHECK ((NgayVaoDang IS NULL) OR (NgayVaoDoan IS NOT NULL
AND NgayVaoDang > NgayVaoDoan)),
) ,
CONSTRAINT CHK_SoTCTichLuy CHECK (SoTCTichLuy >= 0),
CONSTRAINT CHK_DTBTichLuy CHECK (DTBTichLuy >= 0 AND DTBTichLuy <= 10)
);

-- Tạo bảng KetQua


CREATE TABLE KetQua (
MSSV VARCHAR(10) ,
MaKhoaHoc CHAR(4),
DiemKTGiuaky DECIMAL(4,1) CHECK (DiemKTGiuaky >= 0 AND DiemKTGiuaky <= 10),
DiemThiLan1 DECIMAL(4,1) CHECK (DiemThiLan1 >= 0 AND DiemThiLan1 <= 10),
DiemThiLan2 DECIMAL(4,1) CHECK (DiemThiLan2 >= 0 AND DiemThiLan2 <= 10),
DTB DECIMAL(4,1),
PRIMARY KEY (MSSV, MaKhoaHoc),
CONSTRAINT FK_ SinhVien FOREIGN KEY (MSSV) REFERENCES SinhVien(MaKhoaHoc),
CONSTRAINT FK_GiangDay FOREIGN KEY (MaKhoaHoc) REFERENCES GiangDay(MaKhoaHoc)

CONSTRAINT CHK_DiemThiLan2 CHECK (


(DiemThiLan2 IS NULL) OR
(DiemThiLan2 IS NOT NULL AND DiemThiLan1 < 5)
),
CONSTRAINT CHK_DTB_VALUE CHECK (
DTB = ROUND(0.4 * DiemKTGiuaky + 0.6 * IIF(DiemThiLan1 >= 5, DiemThiLan1,
DiemThiLan2), 1)
)
);

INSERT DỮ LIỆU

INSERT INTO KHOA (MaKhoa, TenKhoa, SL_CBGD)


VALUES ('CNTT', 'Công nghệ thông tin', 0),
('TOAN', 'Toán', 0),
('SINH', 'Sinh học', 0);
INSERT INTO GIAOVIEN (MaGV, TenGV, MaKhoa)
VALUES ('C03M', 'PHẠM THỊ THAO', 'CNTT'),
('T02M', 'LAM HOANG VU', 'TOAN'),
('C03F', 'TRAN VAN TIEN', 'CNTT'),
('C0M', 'HOANG VUONG', 'CNTT');
INSERT INTO SinhVien (MSSV, Ten, PhaiNu, DiaChi, DienThoai, MaKhoa, SoCMND, NgaySinh,
NgayNhapHoc, NgayVaoDoan, NgayVaoDang, NgayRaTruong, DTBTichLuy, SoTCTichLuy)
VALUES
('C0001F', 'Bui Thuy An', '1', '223 Trần Hưng Đạo, TP.HCM', '038132202', 'CNTT',
135792468, '1992-08-14', '2010-10-01', NULL, NULL , '2012-11-15', 0, 0),
('C0002M', 'Nguyễn Thanh Tùng', '0', '140 Công Quỳnh, TP.HCM', '038125678', 'CNTT',
987654321, '1992-11-23', '2010-10-01', NULL, NULL, NULL, 0, 0),
('T0003M', 'Nguyễn Thanh Long', '0', '112/4 Công Quỳnh, TP.HCM', '0918345623', 'TOAN',
123456789, '1991-08-17', '2010-10-01', '2007-05-19', '2012-05-01', NULL, 0, 0),
('C0004F', 'Hoàng Thị Hoa', '1', '90 Nguyễn Văn Cư, TP.HCM', '038320123', 'CNTT',
246813579, '1991-09-02', '2010-10-17', NULL, NULL, NULL, 0, 0),
('T0005M', 'Trần Hồng Sơn', '0','54 Cao Thắng, Hà Nội', '038345987', 'TOAN', 864297531,
'1993-04-24', '2011-10-15', '2010-09-02', NULL, NULL, 0, 0);
INSERT INTO MONHOC (MaMH, TenMH, SoTC_ToiThieu)
VALUES ('CSDL', 'Cơ sở dữ liệu', 2),
('CTDL', 'Cấu trúc dữ liệu', 3),
('KTLT', 'Kỹ thuật lập trình', 3),
('CWIN', 'Lập trình C trên Window',3),
('TRR', 'Toán rời rạc', 2);
INSERT INTO GiangDay (MaKhoaHoc, MaGV, MaMH, HocKy, NienKhoa, NgayBatDauLyThuyet,
NgayBatDauThucHanh, NgayKetThuc, TongSoTC, SoTCLT, SoTCTH, SoTietLT, SoTietTH)
VALUES
('K001', 'C01F', 'CSDL', 1, '2011', '2011-09-15', '2011-10-01', '2012-01-02', 4, 3, 1,
45, 30),
('K002', 'C04M', 'KTLT', 2, '2011-2012', '2012-02-17', '2012-03-01', '2012-05-18', 4,
3, 1, 45, 45),
('K003', 'C03M', 'CTDL', 1, '2012-2013', '2012-09-11', '2012-03-14', '2013-01-03', 4,
3, 1, 45, 30),
('K004', 'C04M', 'CWIN', 1, '2012-2013', '2012-09-13', '2012-10-13', '2013-01-14', 4,
2, 2, 30, 60),
('K005', 'C01F', 'TRR', 1, '2012-2013', '2012-09-14', '2012-10-02', '2013-01-18', 3, 3,
0, 45, 0);
INSERT INTO KetQua (MSSV, MaKhoaHoc, DiemKTGiuaky, DiemThiLan1, DiemThiLan2, DTB)
VALUES
('C0001F', 'K001', 8.5, 5, NULL, 6.4),
('C0001F', 'K002', 9.0, 7, NULL, 7.8 ),
('C0001F', 'K003', 7.0, 9, NULL, 8.2),
('T0003M', 'K003', 6.0, 2,2.5, 3.9),
('T0003M', 'K004', 7.5, 6, NULL, 6.6),

('T0005M', 'K003', 7.0, 8,NULL,7.6),


('C0002M', 'K001', 7.0, 2, 5, 5.8 ),
('C0001F', 'K004', 8.0, 9,NULL, 8.6),
('T0003M', 'K002', 6.5, 2, 3, 4.4),
('T0005M', 'K005', 7.0, 10, NULL, 8.8);

Trả lời các câu hỏi


--113
CREATE FUNCTION DanhSachSinhVienTheoThangSinh
(
@m INT
)
RETURNS TABLE
AS
RETURN
(
SELECT MSSV, Ten, NgaySinh
FROM SinhVien
WHERE MONTH(NgaySinh) = @m
);
-- 114
CREATE FUNCTION NgayCuoiCungTrongThang
(
@Ngay DATE
)
RETURNS DATE
AS
BEGIN
RETURN DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, @Ngay) + 1, 0));
END;
--115
CREATE FUNCTION TaoBangSinhVienMoi()
RETURNS @SinhVienMoi TABLE (
MSSV VARCHAR(6) PRIMARY KEY,
HoLot NVARCHAR(255) NOT NULL,
Ten NVARCHAR(255) NOT NULL,
PhaiNu BIT NOT NULL,
DiaChi NVARCHAR(255) NOT NULL,
DienThoai VARCHAR(10),
MaKhoa CHAR(4),
SoCMND VARCHAR(12) UNIQUE,
NgaySinh DATE,
NgayNhapHoc DATE NOT NULL,
NgayVaoDoan DATE,
NgayVaoDang DATE,
NgayRaTruong DATE,
DTBTichLuy DECIMAL(4,2) DEFAULT 0,
SoTCTichLuy INT DEFAULT 0
)
AS
BEGIN
INSERT INTO @SinhVienMoi (MSSV, HoLot, Ten, PhaiNu, DiaChi, DienThoai, MaKhoa,
SoCMND, NgaySinh, NgayNhapHoc, NgayVaoDoan, NgayVaoDang, NgayRaTruong, DTBTichLuy,
SoTCTichLuy)
SELECT
MSSV,
CASE WHEN CHARINDEX(' ', Ten) > 0 THEN LEFT(Ten, CHARINDEX(' ', Ten) - 1) ELSE ''
END AS HoLot,
CASE WHEN CHARINDEX(' ', Ten) > 0 THEN SUBSTRING(Ten, CHARINDEX(' ', Ten) + 1,
LEN(Ten)) ELSE Ten END AS Ten,
PhaiNu,
DiaChi,
DienThoai,
MaKhoa,
SoCMND,
NgaySinh,
NgayNhapHoc,
NgayVaoDoan,
NgayVaoDang,
NgayRaTruong,
DTBTichLuy,
SoTCTichLuy
FROM SinhVien;

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

SELECT @DiemTrungBinh = AVG((DiemKTGiuaky + DiemThiLan1 + DiemThiLan2) / 3.0)


FROM KetQua KQ
INNER JOIN SinhVien SV ON KQ.MSSV = SV.MSSV
WHERE SV.MaKhoa = @MaKhoa;

RETURN @DiemTrungBinh;
END;
--118
CREATE FUNCTION Func_SoMonDat(@MSSV VARCHAR(6))
RETURNS INT
AS
BEGIN
DECLARE @SoMonDat INT;

SELECT @SoMonDat = COUNT(*)


FROM KetQua
WHERE MSSV = @MSSV AND (DTB >= 5);

RETURN @SoMonDat;
END;
--119
CREATE FUNCTION Func_SoMonKhongDat3(@MSSV VARCHAR(6))
RETURNS INT
AS
BEGIN
DECLARE @SoMonKhongDat INT;

SELECT @SoMonKhongDat = COUNT(*)


FROM KetQuaHocTAp
WHERE MSSV = @MSSV AND (DTB < 5);
RETURN @SoMonKhongDat;
END;
--120
CREATE FUNCTION Func_SoLuongSinhVienCoDiem(
@MaKhoa VARCHAR(10),
@HocKy INT,
@NamHoc VARCHAR(255)
)
RETURNS INT
AS
BEGIN
DECLARE @SoLuongSinhVien INT;

SELECT @SoLuongSinhVien = COUNT(DISTINCT SV.MSSV)


FROM KetQua KQ
INNER JOIN SinhVien SV ON KQ.MSSV = SV.MSSV
INNER JOIN GiangDay GD ON KQ.MaKhoaHoc = GD.MaKhoaHoc
WHERE SV.MaKhoa = @MaKhoa
AND GD.HocKy = @HocKy
AND YEAR(GD.NgayBatDauLyThuyet) = @NamHoc;

RETURN @SoLuongSinhVien;
END;
DECLARE @MaKhoa VARCHAR(10) = 'CNTT';
DECLARE @HocKy INT = 1;
DECLARE @NamHoc Varchar = '2011-2012';

SELECT dbo.Func_SoLuongSinhVienCoDiem(@MaKhoa, @HocKy, @NamHoc) AS SoLuongSV;


--123. In thông tin môn học:
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
MonHoc
LEFT JOIN
GiangDay ON MonHoc.MaMH = GiangDay.MaMH
LEFT JOIN
KetQua ON GiangDay.MaKhoaHoc = KetQua.MaKhoaHoc
WHERE
MonHoc.MaMH = @MaMH
GROUP BY
MonHoc.TenMH;
END;

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

RAISERROR ('Cập nhật mã số sinh viên thành công.', 0, 1);


END
END TRY
BEGIN CATCH
RAISERROR ('Cập nhật mã số sinh viên thất bại.', 16, 1);
END CATCH
END;

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

You might also like