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

Thêm 1 dòng vào bảng kết quả với lần thi phải là lần thi trước đó +1 của môn

học và học viên đang


xét

CREATE PROC THEMMOTDONG


@MaHocVien nvarchar(50),
@MaMonHoc nvarchar(50),
@Diem float
AS
BEGIN
IF(NOT EXISTS (SELECT * FROM HOCVIEN AS HV WHERE @MaHocVien = HV.MaHocVien))
BEGIN
PRINT N'Mã học viên ' + @MaHocVien + N' không tồn tại'
RETURN -1
END
IF(NOT EXISTS (SELECT * FROM MONHOC AS MH WHERE @MaMonHoc = MH.MaMonHoc))
BEGIN
PRINT N'Mã môn học ' + @MaMonHoc + N' không tồn tại'
RETURN -1
END
if @MaHocVien in (SELECT hv.MaHocVien FROM HOCVIEN AS HV, KETQUA AS KQ WHERE
HV.MaHocVien = KQ.MaHV)
BEGIN
INSERT KETQUA(MaHV, MaMonHoc,Diem)
VALUES(@MaHocVien, @MaMonHoc,@Diem)
UPDATE KETQUA SET LanThi = LanThi + 1
END

END

DECLARE @kq INT


EXEC @kq = THEMMOTDONG N'HV000001 ',N'MH00001 ', 3.5
PRINT @kq
SELECT * FROM KETQUA

-- câu 1: Cập nhâp sỉ số cho các lớp

CREATE PROC CapNhapSiSo


@siso nvarchar(50)
AS
BEGIN
DECLARE Siso CURSOR
FOR
SELECT HV.MaLop, COUNT(*) As Siso
FROM HocVien HV, LopHoc LH WHERE HV.MaLop=LH.MaLop
AND HV.TinhTrang = N''
GROUP BY SiSo
Open Siso
DECLARE
@MaLop nvarchar(10), @ss int
FETCH NEXT FROM Siso into @MaLop, @ss
WHILE @@FETCH_STATUS=0
UPDATE LOPHOC set SiSo=@ss where MaLop=@MaLop
FETCH NEXT FROM Siso into @MaLop, @ss
END
GO
-- câu 2: Viết proc cập nhập thông tin học viên

CREATE PROC CapNhatThongTinHocVien


@MaHV nchar(10),
@TenHV nvarchar(50),
@NgaySinh datetime,
@TinhTrang nvarchar(50),
@MaLop nchar(10)
AS
BEGIN
SELECT MaHocVien FROM HOCVIEN
UPDATE HOCVIEN SET TenHocVien = @TenHV ,NgaySinh = @NgaySinh,
TinhTrang = @TinhTrang, MaLop = @MaLop WHERE MaHocVien = @MaHV

END
GO

-- Câu 3: Thêm mới 1 học viên


CREATE THEMHOCVIEN
@MAHV nvarchar(20),
@TENHV nvarchar(50),
@NGAYSINH DATETIME,
@TINHTRANG nvarchar(10),
@MALOP nchar(10)
AS
BEGIN
IF( EXISTS( SELECT * FROM LopHoc WHERE MaLop=@MALOP)
AND NOT EXISTS (SELECT * FROM HOCVIEN WHERE MaHocVien= @MAHV))
INSERT INTO HOCVIEN(MaHocVien, TenHocVien, NgaySinh, TinhTrang, MaLop)
VALUES (@MAHV, @TENHV,@NGAYSINH,@TINHTRANG,@MALOP)
UPDATE LOPHOC SET SiSo = SiSo + 1
WHERE MaLop=@MALOP
END
GO
USE QLHocVien

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

-- 2 . Dung cau 1, cho ds cac hoc vien (mã, tên, ĐTB)


ALTER FUNCTION f_DanhSachHV()
returns Table
AS
return(SELECT HV.MaHocVien, HV.TenHocVien,
dbo.f_TinhDiemTrungBinhMotHocVien(HV.MaHocVien) as DTB
FROM HOCVIEN as HV, KETQUA as KQ
WHERE HV.MaHocVien = KQ.MaHV
GROUP BY HV.MaHocVien, HV.TenHocVien)
GO

SELECT * FROM f_DanhSachHV()


GO

-- 3 Viet Functiom tim ĐTB cao nhất lớp A


ALTER FUNCTION f_TinhDiemTrungBinhCaoNhatCuaMotLop (@malop nchar(10))
returns float
AS
Begin
DECLARE @DTBMAX float
SELECT @DTBMAX= MAX(dbo.f_TinhDiemTrungBinhMotHocVien(HV.MaHocVien))
FROM HOCVIEN as HV, KETQUA as KQ
WHERE HV.MaLop = @malop
return @DTBMAX
End
GO
select dbo.f_TinhDiemTrungBinhCaoNhatCuaMotLop(N'LH000002') AS N'Điểm trung bình cao nhất'
-- 4 Cho danh sach cac hoc vien co ĐTB cao nhất của lớp A

CREATE FUNCTION f_DanhSachHocVienDiemCaoNhat (@malop nchar(10))


returns table
AS
return (SELECT HV.MaHocVien, DS.MaHocVien FROM f_DanhSachHV() as DS, HOCVIEN as HV
WHERE Ds.DTB = dbo.f_TinhDiemTrungBinhCaoNhatCuaMotLop(@malop)
AND DS.MaHocVien = HV.MaHocVien
AND HV.MaLop = @malop
)
GO
select dbo.f_DanhSachHocVienDiemCaoNhat(N'LH000002') AS N'Điểm trung bình cao nhất'

--Danh sách các sinh viên khoa “Công nghệ Thông tin” khoá 2002-2006.

SELECT * FROM SinhVien as SV, Lop, Khoa, KhoaHoc


Where SV.maLop = Lop.maLop and Lop.maKhoa = Khoa.maKhoa and Khoa.maKhoa = N'CNTT'
and KhoaHoc.maKhoaHoc = Lop.maKhoaHoc and Lop.maKhoaHoc = N'K2002'

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

SELECT SV.maSinhVien, SV.hoTen, SV.namSinh, KH.namBatDau - SV.namSinh as N'Số tuổi'


FROM SinhVien as SV, KhoaHoc as KH, Lop
WHERE SV.maLop = Lop.maLop and Lop.maKhoaHoc = KH.maKhoahoc and KH.namBatDau -
SV.namSinh < 18

-- Cho biết sinh viên khoa CNTT, khoá 2002-2006 chưa học môn cấu trúc dữ liệu

SELECT * FROM SinhVien as SV, Lop, Khoa, KhoaHoc


Where SV.maLop = Lop.maLop and Lop.maKhoa = Khoa.maKhoa and Khoa.maKhoa = N'CNTT'
and KhoaHoc.maKhoaHoc = Lop.maKhoaHoc and Lop.maKhoaHoc = N'K2002'
and SV.maSinhVien not in
(SELECT KetQua.maSinhVien FROM KetQua,GiangKhoa, SinhVien as SV
Where KetQua.maGiangKhoa = GiangKhoa.maGiangKhoa and SV.maSinhVien =
KetQua.maSinhVien
And GiangKhoa.maMonHoc = N'THCS01')

-- 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 đó.

SELECT Lop.maLop, Lop.maKhoaHoc, CT.tenChuongTrinh, Lop.maKhoa, Count( SV.maSinhVien)


as N'Số sinh viên' FROM Lop, SinhVien as SV, ChuongTrinh as CT
WHERE CT.maChuongTrinh = Lop.maChuongTrinh and SV.maLop = Lop.maLop and
Lop.maKhoa = N'CNTT' Group by Lop.maLop,Lop.maKhoaHoc,CT.tenChuongTrinh,Lop.maKhoa

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

DECLARE @tenGV nvarchar(50);


DECLARE @soMonDay int;
DECLARE curDanhSachGiaoVienDaDayMon CURSOR
FORWARD_ONLY
FOR SELECT GV.TenGV, COUNT(MH.MaMonHoc) AS 'SỐ MON ĐÃ DẠY' FROM GIAOVIEN AS
GV, GIAOVIEN_DAY_MONHOC AS GVMH, MONHOC AS MH
WHERE GV.MaGV = GVMH.MaGV AND GVMH.MaMH = MH.MaMonHoc
GROUP BY GV.TenGV
open curDanhSachGiaoVienDaDayMon
FETCH NEXT FROM curDanhSachGiaoVienDaDayMon INTO @tenGV, @soMonDay
print N'STT ' + N' Tên giáo viên ' + N'Số môn đã dạy'
print ''
DECLARE @STT7 int = 1
WHILE @@FETCH_STATUS = 0
BEGIN
print cast(@STT7 as nchar(5))+ ' ' + cast(@tenGV as nchar(30)) + ' '+ cast(@soMonDay
as nvarchar(50))
FETCH NEXT FROM curDanhSachGiaoVienDaDayMon INTO @tenGV, @soMonDay
SET @STT7 += 1
END
Close curDanhSachGiaoVienDaDayMon
DealLocate curDanhSachGiaoVienDaDayMon
--2. Nhập vào một mã giáo viên, xuất ra tên giáo viên, danh sách tên các môn giáo viên
--giảng dạy cùng số lần dạy theo định dạng của ví dụ sau:
-- **Tên giáo viên : Trịnh Hoài An
-- **Danh sách các môn được phân công giảng dạy
-- ******1. Cấu trúc dữ liệu : 3 lần
-- ******2. Cơ sở dữ liệu : 5 lần

--Khai báo biến cursor, biếh cục bộ


ALtER PROC ThongTinGiaoVien
@maGiaoVien nchar(10)
as
BEGIN
DECLARE @tenGiaoVien nvarchar(50);
DECLARE @tenMonHoc nvarchar(50);
DECLARE @soLanDay int;
DECLARE cur_GiaoVien CURSOR
FORWARD_ONLY
FOR
SELECT GV.TenGV, MH.TenMonHoc, GV_DAY_MH.ThamNien FROM GIAOVIEN AS GV,
GIAOVIEN_DAY_MONHOC AS GV_DAY_MH, MONHOC AS MH
WHERE GV.MaGV = GV_DAY_MH.MaGV AND GV_DAY_MH.MaMH = MH.MaMonHoc AND
GV.MaGV LIKE @maGiaoVien
-- Mở cursor
open cur_GiaoVien
-- 3 Đọc và nhập dữ liệu
FETCH NEXT FROM cur_GiaoVien into @TenGiaoVien, @tenMonHoc, @soLanDay
print ('** Tên Giáo Viên: ' + @TenGiaoVien)
print (N'** Danh sách các môn được phân công giảng dạy')
DECLARE @STT5 int = 1
WHILE @@FETCH_STATUS = 0
BEGIN
print N'****** ' + cast(@STT5 as nvarchar(50))+ ' '+ @tenMonHoc + ' : ' + cast(@soLanDay as
nvarchar(50)) + N' lần'
FETCH NEXT FROM cur_GiaoVien INTO @TenGiaoVien, @tenMonHoc, @soLanDay
SET @STT5 += 1
END
Close cur_GiaoVien
Deallocate cur_GiaoVien
END
DECLARE @kq INT
EXEC @kq = ThongTinGiaoVien 'GV00005 '

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

DECLARE curListHocVienThiDau CURSOR


FORWARD_ONLY
FOR
SELECT MH.TenMonHoc, MH.SoChi, HV.TenHocVien FROM MONHOC AS MH, HOCVIEN AS
HV, KETQUA AS KQ
WHERE HV.MaHocVien = KQ.MaHV AND KQ.MaMonHoc = MH.MaMonHoc AND KQ.Diem
>=5 AND MH.MaMonHoc LIKE @maMH

open curListHocVienThiDau

FETCH NEXT FROM curListHocVienThiDau INTO @tenMon, @soTinChi,@tenHocVien


print N'** Môn: ' + @tenMon
print N'** Số tín chỉ: ' + cast(@soTinChi as nvarchar(50))
print N'** Danh sách học viên thi đậu'
DECLARE @STT4 int = 1
WHILE @@FETCH_STATUS = 0
BEGIN
print '****** ' + cast(@STT4 as nvarchar(50)) + ' ' + + @tenHocVien
FETCH NEXT FROM curListHocVienThiDau INTO @tenMon, @soTinChi,@tenHocVien
SET @STT4 += 1
END

Close curListHocVienThiDau
Deallocate curListHocVienThiDau
END
GO

DECLARE @kq INT


EXEC @kq = HOCVIENTHIDAUTHEOMON 'MH00001 '

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

CREATE proc THONGTINLOPHOC


@maLop nchar(10)
as
BEGIN

DECLARE @tenLopTruong nvarchar(50);


DECLARE @tenHV nvarchar(50);
DECLARE @diemTrungBinh float;

DECLARE curThongTinLopHoc CURSOR


FORWARD_ONlY
FOR
SELECT HV.MaLop, HV3.TenHocVien as N' Tên lớp trưởng', hv.TenHocVien, BangDiemTB.DTB
FROm
(SELECT hv.MaHocVien,ROUND( SUM(KQ.Diem * MH.SoChi)/SUM(MH.SoChi), 2) as DTB
FROM KETQUA AS KQ, MONHOC AS MH, HOCVIEN AS HV, LOPHOC AS LH
WHERE LH.MaLop = HV.MaLop AND KQ.MaMonHoc = MH.MaMonHoc AND HV.MaHocVien
= KQ.MaHV AND LH.MaLop = @maLop
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)
GROUP BY hv.MaHocVien
) as BangDiemTB, -- Để lấy mã học viên và điểm TB
HOCVIEN as HV -- Để lấy chi tiết học viên trên
,LOPHOC as LH, -- Để lấy mã lớp trưởng
HOCVIEN as HV3 -- Để lấy tên thông tin lớp trưởng
WHERE BangDiemTB.MaHocVien = hv.MaHocVien
AND LH.MaLop = HV.MaLop
AND HV3.MaHocVien = LH.LopTruong

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

DECLARE @kq INT


EXEC @kq = THONGTINLOPHOC 'LH000001 '

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

SELECT GV.MaGV, GV.TenGV, GV.NgaySinh, GV.GioiTinh, ( YEAR(GETDATE())


- YEAR(GV.NgaySinh)) as N'Tuổi' FROM GIAOVIEN as GV
WHERE YEAR(GETDATE()) - YEAR(GV.NgaySinh) >= (CASE gv.GioiTinh WHEN N'Nam' THEN
60 WHEN N'Nữ' THEN 55 END)
END
GO
EXEC DanhSachGiaoVienDaVeHuu

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

ALTER PROC GIAOVIENDUOCPHANCONGDAYNGOAIMON

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 )

SELECT count(hv2 .MaHocVien ) as N'Số học sinh Khá'


FROM HOCVIEN hv2
WHERE exists (SELECT count( hv.TenHocVien) FROM KETQUA kq,MONHOC mh,HOCVIEN hv
WHERE kq.MaMonHoc = mh.MaMonHoc and kq.MaHV = hv.MaHocVien and hv2.MaHocVien =
hv.MaHocVien
and kq.LanThi >= ALL(SELECT kq1.LanThi FROM KETQUA kq1 ,MONHOC mh1
WHERE kq1.MaMonHoc =mh1 .MaMonHoc and kq1.MaHV = kq.MaHV )
group by kq.MaHV ,hv.TenHocVien
having (SUM(mh.SoChi *kq.Diem )/SUM(mh.SoChi )) >= 6.5
and (SUM(mh.SoChi *kq.Diem )/SUM(mh.SoChi )) < 8 )

SELECT count(hv3.MaHocVien ) as N'Số học sinh giỏi '


FROM HOCVIEN hv3
WHERE exists (SELECT count( hv.TenHocVien) FROM KETQUA kq,MONHOC mh,HOCVIEN hv
WHERE kq.MaMonHoc = mh.MaMonHoc and kq.MaHV = hv.MaHocVien and hv3.MaHocVien =
hv.MaHocVien
and kq.LanThi >= ALL(SELECT kq1.LanThi FROM KETQUA kq1 ,MONHOC mh1
WHERE kq1.MaMonHoc =mh1 .MaMonHoc and kq1.MaHV = kq.MaHV )
group by kq.MaHV ,hv.TenHocVien
having (SUM(mh.SoChi *kq.Diem )/SUM(mh.SoChi )) >= 8
and (SUM(mh.SoChi *kq.Diem )/SUM(mh.SoChi )) < 9 )
END
GO
EXEC SOHOCVIENTHEOHOCLUC

USE SinhVien

--------------------------------------------BAI TAP LY THUYET


-- TAO KHUNG NHIN TREN VIEW
CREATE VIEW VIEW_SVLH
AS
SELECT MASV, HOTEN, DIACHI, LH.MALOP, TENLOP, SISO
FROM SinhVien, LopHoc LH
WHERE SinhVien.LopHoc = LH.MaLop

SELECT * FROM VIEW_SVLH

-- VIET TRIGGER INSTEAD OF DE CHO PHEP INSERT TREN VIEW


CREATE TRIGGER TRIGGER_VIEW_SVLH ON VIEW_SVLH INSTEAD OF INSERT
AS BEGIN
IF(NOT EXISTS(SELECT LH.MALOP FROM INSERTED, LOPHOC LH WHERE LH.MALOP =
INSERTED.MALOP))
BEGIN
INSERT INTO LOPHOC SELECT MALOP, TENLOP, SISO FROM INSERTED
END
IF (NOT EXISTS(SELECT SV.MASV FROM SINHVIEN SV, INSERTED I WHERE SV.MASV =
I.MASV))
BEGIN
INSERT INTO SINHVIEN SELECT MASV, HOTEN, MALOP, DIACHI FROM INSERTED
END
ELSE
BEGIN
UPDATE SINHVIEN SET HOTEN = I.HOTEN, LOPHOC = I.MALOP, DIACHI = I.DIACHI FROM
INSERTED I, SINHVIEN SV
WHERE SV.MASV = I.MASV
END
END
----------------------------------------------BAI TAP 1
--1. TAO VIEW XUAT THONG TIN MA SINH VIEN, TEN SINH VIEN VA DIEM TRONG LAN THI
SAU CUNG CUA SINH VIEN
create view View_Cau1
as
select SV.MASV, HOTEN, DIEM
from SINHVIEN SV, KETQUA KQ
WHERE SV.MASV= KQ.MASV AND KQ.LANTHI IN (SELECT MAX(KQ1.LANTHI)
FROM KETQUA KQ1
WHERE KQ1.MASV = KQ.MASV AND KQ1.MAMH = KQ.MAMH)

SELECT * FROM View_Cau1

-- 2 CAP NHAT DIEM THI LAN SAU CUNG CUA SINH VIEN

create TRIGGER UPDATE_VIEW_CAU1 ON View_Cau1 INSTEAD OF UPDATE


AS BEGIN
UPDATE View_Cau1 SET DIEM = I.DIEM FROM INSERTED I INNER JOIN View_Cau1 I2 ON
I.MASV= I2.MASV WHERE I2.MASV= I.MASV and MAMH = KetQua.MaMH
END

UPDATE View_Cau1 SET DIEM = 8 WHERE MASV = N'1262078'


DROP TRIGGER UPDATE_VIEW_CAU1

--- 3 XÓA 1 SINH VIÊN TRÊN VIEW SẼ THÌ SẼ XÓA SINH VIÊN TRONG BẢNG SINH VIÊN

create TRIGGER DELETE_SVVIEW_CAU1 ON View_Cau1 INSTEAD OF DELETE


AS BEGIN
DECLARE @CUR CURSOR
SET @CUR = CURSOR
FOR (SELECT MASV FROM DELETED)
DECLARE @MASV NCHAR(10)
OPEN @CUR
FETCH NEXT FROM @CUR INTO @MASV
WHILE (@@FETCH_STATUS = 0)
BEGIN
DELETE FROM KETQUA WHERE MASV = @MASV
DELETE FROM SINHVIEN WHERE MASV = @MASV
FETCH NEXT FROM @CUR INTO @MASV
END
CLOSE @CUR
DEALLOCATE @CUR
END

DELETE FROM View_Cau1 where MASV = N'1262078'


SELECT * FROM KETQUA
SELECT * FROM SINHVIEN
DROP TRIGGER DELETE_SVVIEW_CAU1
---------------------- BAI TAP 2
--1. TAO VIEW LAY THONG TIN SINH VIEN, TUOI , MA LOP, SO MON DA HOC CUA SINH VIEN

ALTER VIEW VIEW_CAU2


AS
SELECT SV.MaSV,SV.HoTen,SV.DiemTB, SV.MaLop,SV.NamSinh,SV.NamBD,SV.NamKT,
SV.TinhTrang, COUNT(distinct(MaMH)) SOMONDAHOC, Year(getdate())-NamSinh as Tuoi
FROM SINHVIEN SV,KETQUA KQ
WHERE SV.MaSV = KQ.MaSV
GROUP BY SV.MaSV,SV.HoTen,SV.DiemTB, SV.MaLop,SV.NamSinh,SV.NamBD,SV.NamKT,
SV.TinhTrang

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

alter TRIGGER CAPNHAT_VIEW_CAU22 On VIEW_CAU2


Instead of UPDATE
As
Begin
If not exists(select * from inserted I Where MaSV =I.MaSV)
Begin
Raiserror('Không tồn tại sinh viên cần cập nhật',16,1)
Rollback transaction
return
End
UPDATE VIEW_CAU2
SET HoTen= I2.HoTen,DiemTB = I2.DiemTB ,MaLop = I2.MaLop, NamSinh = I2.NamSinh,
NamBD = I2.NamBD, NamKT = I2.NamKT, TinhTrang = I2.TinhTrang
from inserted I2 INNER JOIN VIEW_CAU2 HV2 ON I2.MaSV = HV2.MaSV
WHERE HV2.MaSV = I2.MaSV

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

-- KIEM TRA INSERT


insert into VIEW_CAU2 values ('1262079',N'Hiền Phạm',10,'12CK1',1994,2012,2014,'Đang học')
-- loi Column name or number of supplied values does not match table definition.

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

ALTER TRIGGER UPDATE_VIEW_CAU3 ON VIEW_CAU3 INSTEAD OF UPDATE


AS BEGIN
IF EXISTS(SELECT * FROM INSERTED WHERE DIEMTB > 9.0)
BEGIN
UPDATE VIEW_CAU3 SET DIEMTB = DIEMTB+0.5
END
END

--3. VIET TRIGGER CHO PHEP THEM 1 SINH VIEN VAO CSDL (DIEM TB DUOC TINH)

CREATE TRIGGER INSERT_VIEW_CAU3 ON VIEW_CAU3 INSTEAD OF INSERT


AS BEGIN
declare @cur cursor
set @cur = CurSor for (select MaSV from Inserted)
open @cur
declare @MaSV nchar(10)
fetch next from @cur into @MaSV
while(@@fetch_status = 0)
begin
IF NOT EXISTS(SELECT * FROM INSERTED I, SINHVIEN SV where SV.MaSV= I.MaSV)
begin
declare @TinhDiem float
select @TinhDiem = (Sum(KQ.Diem*MH.SoChi)/Sum(MH.SoChi))
from SinhVien SV, MonHoc MH, KetQua KQ
where SV.MaSV = KQ.MaSV and KQ.MaMH = MH.MaMH and KQ.LanThi in (select
max(KQ1.LanThi)
from KetQua KQ1
where KQ1.MAMH = KQ.MAMH
AND KQ1.MASV = KQ.MASV)
insert into VIEW_CAU3 select MaSV,HoTen,DiemTB = @TinhDiem,
MaLop,NamSinh,NamBD,NamKT, TinhTrang from Inserted;
end
fetch next from @cur into @MaSV
end
close @cur
deallocate @cur
END

---------------------------bai tap 4

You might also like