Professional Documents
Culture Documents
Bai Tap Trigger
Bai Tap Trigger
END
END
GO
-- 1 Viết function tính điển trung bình của một học viên
ALTER FUNCTION f_TinhDiemTrungBinhMotHocVien (@mahocvien nchar(10))
returns float
AS
Begin
return (SELECT SUM(KQ.Diem * MH.SoChi)/SUM(MH.SoChi)
FROM KETQUA AS KQ, MONHOC AS MH
WHERE KQ.MaMonHoc = MH.MaMonHoc AND KQ.MaHV = @mahocvien
AND LANTHI = (SELECT MAX(LANTHI)
FROM KETQUA as KQ2
WHERE KQ2.MaMonHoc = KQ.MaMonHoc AND KQ2.MaHV LIKE KQ.MaHV )
)
End
GO
select dbo.f_TinhDiemTrungBinhMotHocVien(N'HV000001') AS 'Điểm Trung Bình'
GO
SELECT * FROM HOCVIEN WHERE HOCVIEN.MaHocVien = N'HV000004 '
--Danh sách các sinh viên khoa “Công nghệ Thông tin” khoá 2002-2006.
-- Cho biết các sinh viên (MSSV, họ tên ,năm sinh) của các sinh viên học sớm hơn tuổi qui định
(theo tuổi qui định thi sinh viên đủ 18 tuổi khi bắt đầu khóa học).
-- Cho biết sinh viên khoa CNTT, khoá 2002-2006 chưa học môn cấu trúc dữ liệu
-- Cho biết sinh viên thi không đậu (diem <5) môn cấu trúc dữ liệu 1 nhưng chưa thi lại.
SELECT SV.maSinhVien as N'MSSV', SV.hoTen as N'Họ tên' FROM SinhVien as SV, KetQua as
KQ, GiangKhoa as GK,MonHoc as MH
WHERE SV.maSinhVien = KQ.maSinhVien and KQ.maGiangKhoa = GK.maGiangKhoa
and MH.maMonHoc = GK.maMonHoc and MH.tenMonHoc = N'Cấu trúc dữ liệu 1' and KQ.diem < 5
and KQ.lanThi < 2
-- Với mỗi lớp thuộc khoa CNTT, cho biết mã lớp, mã khóa học, tên chương trình và số sinh viên
thuộc lớp đó.
-- Cho biết điểm trung bình của sinh viên có mã số 0212003 (điểm trung bình chỉ tính trên lần thi
sau cùng của sinh viên)
select AVG (D.diem) as N'Diem Trung Binh SV 0212003' from (
-- Chay ok roi, y tuong la: chi lay nhung dong ma no thi lan 2, hoac neu lan 1 ma khong thi lan 2,
hieu ko?
SELECT KQ.maSinhVien , KQ.diem, KQ.lanThi,KQ.maGiangKhoa , Gk.maMonHoc FROM
GiangKhoa as GK,KetQua as KQ
WHERE
KQ.maSinhVien = '0212003' and KQ.maGiangKhoa = GK.maGiangKhoa
AND
(
lanthi = 2 -- Chi lay nhung lan thi thu 2
OR
(lanthi = 1 and Gk.maMonHoc not in (SELECT Gk.maMonHoc FROM GiangKhoa as
GK,KetQua as KQ WHERE KQ.maSinhVien = '0212003' and KQ.maGiangKhoa =
GK.maGiangKhoa and lanthi = 2)) -- Va lay nhung lan thi 1 neu khong thi lan 2
)
) as D
Use QuanLyHocVien
--Xuất ra danh sách họ tên các giáo viên, ứng với mỗi giáo viên cho biết có số môn mà
--các giáo viên này đã được phân công giảng dạy.
--3. Nhập vào một mã môn, xuất ra thông tin môn (tên môn, số tín chỉ) cùng danh sách các
--học viên đã từng thi đậu môn này theo định dạng của ví dụ sau (lưu ý: nếu học viên thi
--đậu hai lần cũng chỉ xuất 1 lần):
--**Môn : Cấu trúc dữ liệu
--**Số tín chỉ : 4 tín chỉ
--**Danh sách học viên thi đậu
--******1. Lê Thanh Tùng
--******2. Trịnh Ngọc Thanh
CREATE PROC HOCVIENTHIDAUTHEOMON
@maMH nchar(10)
as
BEGIN
DECLARE @maMon nchar(10);
DECLARE @tenMon nvarchar(50);
DECLARE @soTinChi int;
DECLARE @tenHocVien nvarchar(50);
open curListHocVienThiDau
Close curListHocVienThiDau
Deallocate curListHocVienThiDau
END
GO
--4. Nhập vào mã lớp, xuất ra thông tin lớp (mã lớp, tên lớp trưởng) cùng danh sách các học
--viên của lớp (họ tên học viên và điểm trung bình) theo định dạng của ví dụ sau:
--**Lớp : LH000001
--**Lớp trưởng : Lê Thanh Tùng
--**Danh sách học viên
--******1. Lê Thanh Tùng : 7.52
--******2. Trịnh Ngọc Thanh : 2.15
open curThongTinLopHoc
FETCH NEXT FROM curThongTinLopHoc INTO @maLop, @tenLopTruong, @tenHV,
@diemTrungBinh
print N'** Lớp: ' + @maLop
print N'** Lớp trưởng: ' + @tenLopTruong
print N'**Danh sách học viên'
DECLARE @STT int = 1
WHILE @@FETCH_STATUS = 0
BEGIN
print '******' + cast(@STT as nvarchar(50)) + '. ' + @tenHV + ' : ' + cast(@diemTrungBinh as
nvarchar(50))
FETCH NEXT FROM curThongTinLopHoc INTO @maLop, @tenLopTruong, @tenHV,
@diemTrungBinh
SET @STT += 1
END
Close curThongTinLopHoc
Deallocate curThongTinLopHoc
END
GO
--5. Nhập vào mã học viên xuất ra bảng điểm theo định dạng của ví dụ sau (điểm số tính trên
--lần thi sau cùng của học viên):
CREATE PROC XUATBANGDIEM
@maHocVien nchar(10)
as
BEGIN
DECLARE @hoTen nvarchar(50);
DECLARE @tenLop nvarchar(50);
DECLARE @monHoc nvarchar(50);
DECLARE @soTC int;
DECLARE @Diem float;
DECLARE curBangDiemHV CURSOR
FORWARD_ONlY
FOR
SELECT hv.TenHocVien, hv.MaLop, mh.TenMonHoc, mh.SoChi, kq.Diem FROM HOCVIEN AS
HV, KETQUA AS KQ, MONHOC AS MH
WHERE HV.MaHocVien = KQ.MaHV AND KQ.MaMonHoc = MH.MaMonHoc AND
HV.MaHocVien LIKE @maHocVien
AND LANTHI =
(SELECT MAX(LANTHI)
FROM KETQUA as kq2, MONHOC as mh2, HOCVIEN as hv2
WHERE kq2.MaMonHoc = mh2.MaMonHoc and hv2.MaHocVien = kq2.MaHV AND
hv2.MaHocVien = HV.MaHocVien)
open curBangDiemHV
FETCH NEXT FROM curBangDiemHV INTO @hoTen,@tenLop,@monHoc,@soTC,@Diem
print N'**Họ tên: ' + @hoTen
print N'**Lớp: ' + @tenLop
print N'**Kết quả học tập'
print 'STT ' + N'Môn học '+ N'Số tín chỉ ' + N'Điểm'
DECLARE @STT2 int = 1
WHILE @@FETCH_STATUS = 0
BEGIN
print ' '+cast(@STT2 as nvarchar(50)) + ' ' + @monHoc + ' ' + CAST(@soTC AS
NVARCHAR(50)) + ' ' + CAST(@Diem AS NVARCHAR(50))
FETCH NEXT FROM curBangDiemHV INTO @hoTen,@tenLop,@monHoc,@soTC,@Diem
SET @STT2 += 1
END
Close curBangDiemHV
Deallocate curBangDiemHV
END
GO
DECLARE @kq int
EXEC XUATBANGDIEM N'HV000002 '
--1. Cho danh sách các giáo viên đã đến tuổi về hưu (>60 đối với nam, >55 đối với nữ)
CREATE PROC DanhSachGiaoVienDaVeHuu
AS
BEGIN
DECLARE @namsinh as int
-- 2. Cho danh sách các sinh viên đã thi 3 lần mà vẫn không đậu môn ABC
CREATE PROC HocVienThiBaLanChuaDau
@tenMonHoc nvarchar(50)
AS
BEGIN
SELECT * FROM HOCVIEN as HV, KETQUA as KQ , MONHOC AS MH
WHERE KQ.MaMonHoc = MH.MaMonHoc and HV.MaHocVien = KQ.MaHV and KQ.LanThi >=3
AND KQ.Diem < 5 AND MH.TenMonHoc LIKE @tenMonHoc
END
GO
DECLARE @kq nvarchar(100)
EXEC HocVienThiBaLanChuaDau N'Khai thác dữ liệu'
--3. Cho danh sách các giáo viên được phân công giảng dạy những môn ngoài chuyên môn của gv
đó
AS
BEGIN
SELECT GV2.TenGV FROM GIAOVIEN as GV2, PHANCONG as PC2
WHERE GV2.MaGV = PC2.MaGV -- Phân công
AND PC2.MaMH NOT IN
(
SELECT GVDMH.MaMH FROM GIAOVIEN as GV, GIAOVIEN_DAY_MONHOC as GVDMH
WHERE GV.MaGV = GVDMH.MaGV AND GV.MaGV = GV2.MaGV -- Chuyên môn
)
GROUP BY GV2.TenGV
END
GO
EXEC GIAOVIENDUOCPHANCONGDAYNGOAIMON
--4.Mỗi giáo viên chỉ chủ nhiệm 1 lớp trong 1 năm học. Hãy cho danh sách các giáo viên được phân
công chủ nhiệm sai yêu cầu trên.
CREATE PROC GIAOVIENPHANCONGSAIYEUCAU
AS
BEGIN
SELECT distinct gv.MaGV ,gv.TenGV
FROM GIAOVIEN gv,LOPHOC lh
WHERE gv.MaGV = lh.GVQuanLi
and (lh.NamKetThuc - lh.NamBatDau ) >1
or exists (select lh.GVQuanLi from LOPHOC lh1 where lh1.GVQuanLi = lh.GVQuanLi and
lh1.MaLop != lh.MaLop )
END
GO
EXEC GIAOVIENPHANCONGSAIYEUCAU
--5. Cho biết năm nay có bao nhiêu học sinh giỏi, bao nhiêu học sinh khá, trung bình
ALTER PROC SOHOCVIENTHEOHOCLUC
AS
BEGIN
SELECT count(hv1.TenHocVien) as N'Số học sinh Trung bình'
FROM HOCVIEN hv1
WHERE hv1.MaHocVien in (SELECT kq.MaHV FROM KETQUA kq,MONHOC mh,HOCVIEN hv
WHERE kq.MaMonHoc = mh.MaMonHoc and kq.MaHV = hv.MaHocVien
and kq.LanThi >= ALL(SELECT kq1.LanThi FROM KETQUA kq1
WHERE kq1.MaMonHoc = mh.MaMonHoc and kq1.MaHV = kq.MaHV )
group by kq.MaHV
having (SUM(mh.SoChi *kq.Diem )/SUM(mh.SoChi )) >= 5
and (SUM(mh.SoChi *kq.Diem )/SUM(mh.SoChi )) < 6.5 )
USE SinhVien
-- 2 CAP NHAT DIEM THI LAN SAU CUNG CUA SINH VIEN
--- 3 XÓA 1 SINH VIÊN TRÊN VIEW SẼ THÌ SẼ XÓA SINH VIÊN TRONG BẢNG SINH VIÊN
--2. VIET TRIGGER CHI CHO PHEP CAP NHAT TUOI VA THONG TIN CA NHAN CUA SINH VIEN,
MA LOP
-- INSERT |UPDATE |DELETE
--SINHVIEN - +(Tuoi,MaLop,HoTen,MaSV) +
--KETQUA +(MAMH) +(MAMH) -
--CACH 1
drop trigger CAPNHAT_VIEW_CAU2
CREATE TRIGGER CAPNHAT_VIEW_CAU22 ON VIEW_CAU2 INSTEAD OF UPDATE
AS BEGIN
IF(UPDATE(HoTen) or update(NamSinh) or update(MaLop))
begin
DECLARE @CUR CURSOR
SET @CUR = CURSOR
FOR (SELECT I.MaSV FROM INSERTED I)
OPEN @CUR
DECLARE @MASV NCHAR(10)
FETCH NEXT FROM @CUR INTO @MASV
WHILE(@@FETCH_STATUS = 0)
BEGIN
IF EXISTS(SELECT * FROM VIEW_CAU2 V WHERE V.MaSV = @MaSV)
begin
UPDATE VIEW_CAU2 SET HoTen = I.HoTen, MaLop = I.MaLop, NamSinh = I.NamSinh
WHERE MaSV = @MASV
end
FETCH NEXT FROM @CUR INTO @MASV
END
CLOSE @CUR
DEALLOCATE @CUR
end
END
drop trigger CAPNHAT_VIEW_CAU2
--cach 2
End
-- KIEM TRA UPDATE
select * from VIEW_CAU2
UPDATE VIEW_CAU2 SET HoTen = N'Phạm Hiền', DiemTB = 10 ,MaLop = '12CK2', NamSinh =
'1994',NamBD = 2012, NamKT = 2015, TinhTrang = 'Đang học', SOMONDAHOC = 3, Tuoi = 21
where MaSV = '1262076'
---- lỗi Msg 4403, Level 16, State 1, Procedure CAPNHAT_VIEW_CAU22, Line 11
--Cannot update the view or function 'VIEW_CAU2' because it contains aggregates, or a DISTINCT
or GROUP BY clause, or PIVOT or UNPIVOT operator.
--3. viet trigger cho phep them 1 sinh vien vao csdl
alter trigger Insert_View_Cau2 on VIEW_CAU2 INSTEAD OF INSERT
AS BEGIN
if not exists(select * from SinhVien SV, Inserted I where I.MaSV= SV.MaSV)
begin
INSERT INTO SinhVien
SELECT MaSV, HoTen,DiemTB,MaLop,NamSinh,NamBD,NamKT,TinhTrang
FROM INSERTED;
end
update SinhVien set HoTen = I.HoTen, DiemTB = I.DiemTB, MaLop = I.MaLop, NamBD =
I.NamBD, NamKT = I.NamKT, TinhTrang = I.TinhTrang
From SinhVien sv, Inserted I where sv.MaSV =I.MaSV
END
------------------------------BAI TAP 3
-- 1. tao view cho biet thong Tin cua 3 sinh vien co diem tb cap nhat cua moi lop. Xep giam theo
diem TB
ALTER view VIEW_CAU3
AS
SELECT TOP 3*
FROM SINHVIEN
ORDER BY DIEMTB DESC
SELECT * FROM VIEW_CAU3
--2. viet trigger cho phep tang 0.5 diem Tb cao nhat neu DTB > 9.0
--3. VIET TRIGGER CHO PHEP THEM 1 SINH VIEN VAO CSDL (DIEM TB DUOC TINH)
---------------------------bai tap 4