Tải bản đầy đủ (.doc) (30 trang)

Đề thi sql server có đáp án

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.37 MB, 30 trang )

/*TÀI LIỆU ÔN THI CUỐI KỲ MÔN SQL*/
Bài 1:
/*Trước hết phải tạo 1 database sinh viên. VD n tạo trong ổ đĩ như dưới*/
create database Sinhvien
on primary (name=Sinhvien, filename='D:\Hoc_tap\SQL\Thi_60%\Sinhvien.mdf',
size=5,maxsize=50,filegrowth=2)
log on(name=Hoadon_log1,filename='D:\Hoc_tap\SQL\Thi_60%\Sinhvien_log.ldf',
size=2, maxsize=10,filegrowth=1)

Câu 1: Cơ sở dữ liệu quản lý sinh viên có chứa 3 table. Viết lệnh tạo các table với các ràng buộc khóa
chính, khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields là tự chọn theo ngữ nghĩa.
GO
use Sinhvien
GO
SinhVien(MSSV, Lop, Ho, Ten, Ngaysinh, Nu)
Tân từ: Mỗi sinh viên có một mã số (MSSV) là số nguyên phân biệt, thuộc một lớp (Lop), có họ
(HO) và tên (Ten) sinh viên, ngày sinh (Ngaysinh), thuộc phái nữ hay nam (Nu).
create table SinhVien
(
MSSV int primary key,
Lop char(10),
Ho nvarchar(30),
Ten nvarchar(8),
NgaySinh datetime,
Nu nchar(5)
)
GO
MonHoc(MSMon, TenMon)
Tân từ: Mỗi môn học có một mã số (MSMon) là một số nguyên phân biệt, có tên môn học
(TenMon).
create table MonHoc


(
MSMon int primary key,
TenMon char(20)
)
GO
DiemThi(MSSV, MSMon, LanThi, Diem)
Tân từ: Mỗi sinh viên (MSSV) có thể học nhiều môn (MSMon). Mỗi môn học có thể thi nhiều lần
(LanThi), mỗi lần thi được đánh số thứ tự từ 1 trở đi và ghi nhận điểm thi (Diem) của các lần thi đó.
create table DiemThi
(
MSMon int references MonHoc(MSMon),
MSSV int references SinhVien(MSSV),
LanThi int,
Diem float,
primary key(MSSV,MSMon,LanThi)
)
GO
DROP TABLE DiemThi
************************************************
Câu 2: Khai báo bổ sung các ràng buộc sau:
a) Lần thi (LanThi) trong table DiemThi có giá trị mặc định là 1
Alter table DiemThi
add default 1 for LanThi
GO
b) Điểm thi (Diem) trong table DiemThi được chấm theo thang điểm 10
Alter table DiemThi
Add check (diem between 0 and 10)
GO
/*Cũng có thể dùng Add check (diem >=0 and diem <=10)*/
************************************************

Câu 3: Tạo View:
a) Tạo view vwLanThiCuoi dùng liêt kê danh sách lần thi cuối cùng của các sinh viên gồm: Mã
số sinh viên, mã số môn học, lần thi cuối cùng của môn học (ví dụ sinh viên A thi môn học
C ba lần thì lần thi cuối cùng là 3).
create view vwLanThiCuoi
as
select MSSV,MSMon, max(Lanthi) as LanThiCuoi
from Diemthi
group by MSSV,MSMon
GO
b) Tạo view vwDiemThiCuoi dùng liêt kê danh sách sinh viên gồm: Mã số sinh viên, mã số
môn học, lần thi cuối cùng của môn học (ví dụ sinh viên A thi môn học M ba lần thì lần thi
cuối cùng là 3) và điểm của lần thi cuối cùng đó.
create view vwDiemThiCuoi
as
select d.MSSV,d.MSMon,LanThiCuoi,Diem
from DiemThi d inner join vwLanThiCuoi v on d.MSSV=v.MSSV and
d.MSMon=v.MSMon and d.LanThi=v.LanThiCuoi
GO
Cách khác
create view vwDiemThiCuoi1
as
select MSSV,MSMon,lanthi,diem from diemthi d1
where lanthi = (select max(lanthi) from diemthi d2
where d2.MSSV=d1.MSSV and d2.MSMon=d1.MSMon)
GO
drop view vwDiemThiCuoi1
Câu 4: Tạo trigger Insert cho table DiemThi dùng điền tự động số thứ tự lần thi khi thêm điểm thi một
môn học của một sinh viên. Ví dụ sinh viên A đã thi môn học M hai lần thì lần thi mới thêm vào phải
là 3.

create trigger itrg_DiemThi on DiemThi
inserted of for Insert
declare @D int
Select @D=max (LanThi) from DiemThi inner join Inserted on DiemThi.MSSV
=Inserted.MSSV and DiemThi.MSMon=Inserted.MSMon
Insert into DiemThi
Select MSSV,MSMon,Isnull(@D,0)+1, Diem
From Inserted

create trigger itrg_DiemThi on DiemThi
Instead of Insert
as
Declare @D int
Select @D= max(LanThi) from DiemThi inner join Inserted on DiemThi.MSSV
=Inserted.MSSV and DiemThi.MSMon=Inserted.MSMon
Insert into DiemThi
Select MSSV,MSMon,Isnull(@D,0)+1, Diem
From Inserted
/*(Chưa làm được)*/
Câu 5: Viết thủ tục hoặc hàm liệt kê kết quả thi các môn của một sinh viên khi biết mã số của sinh
viên (MSSV) gồm các thông tin: mã số môn học, lần thi, điểm thi. Trong đó, mã số sinh viên là giá trị
input
create proc KetQuaThi (@MSSV int)
as
begin
select MSSV,MSMon,Lanthi,Diem
from Diemthi
where MSSV=@MSSV
end
GO

drop proc MSSV
Sử dụng hàm KếtQuảThi hàm
exec KetQuaThi 1
Bài 2: Quản lý trận đấu*/
/*Trước hết phải tạo 1 database sinh viên. VD n tạo trong ổ đĩ như dưới*/
create database QuanLyTranDau
on primary (name=QuanLyTranDau, filename='D:\Hoc_tap\SQL\Thi_60%\QuanLyTranDau.mdf',
size=5,maxsize=50,filegrowth=2)
log on(name=QuanLyTranDau_log,filename='D:\Hoc_tap\SQL\Thi_60%\QuanLyTranDau_log.ldf',
size=2, maxsize=10,filegrowth=1)
go
use QuanLyTranDau
go
Câu 1: Cơ sở dữ liệu quản lý các trận đấu bóng đá tại một sân vận động có chứa 3 table. Viết lệnh tạo
các table với các ràng buộc khóa chính, khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields
là tự chọn theo ngữ nghĩa.
Doi(MSDoi, TenDoi, Phai)
Tân từ: Mỗi đội có 1 mã số (MSDoi) là một số nguyên phân biệt; có tên (TenDoi) và thuộc phái
nam hay nữ (Phai).
create table Doi
(
MSDoi int not null primary key,
TenDoi nvarchar(10),
Phai nvarchar(4)
)
go
TranDau(MSTD, NgayTD, GioBD, GioKT)
Tân từ: Mỗi trận đấu có 1 mã số (MSTD) là một số nguyên phân biệt với những trận đấu khác,
diễn ra vào 1 ngày (NgayTD), bắt đầu ở một giờ (GioBD) và dự kiến kết thúc tại một giờ
(GioKT).

create table TranDau
(
MSTD int primary key,
NgayTD datetime,
GioBD datetime,
GioKT datetime
)
go
DoiThiDau(MSTD, MSDoi)
Tân từ: Lưu trữ danh sách các đội (MSDoi) tham gia thi đấu trong các trận đấu (MSTD). Biết
rằng, mỗi trận đấu là một cuộc gặp gỡ giữa 2 đội và cả 2 đội phải thuộc cùng một phái.
Create table DoiThiDau
(
MSTD int not null references TranDau(MSTD),
MSDoi int not null references Doi(MSDoi),
primary key (MSTD, MSDoi)
)
go
drop table Doi
Câu 2: Viết lệnh khai báo bổ sung các ràng buộc sau:
a) Giờ bắt đầu thi đấu (GioTD) phải nhỏ hơn giờ kết thúc (GioKT) trận đấu.
alter table TranDau
add check (GioBD<GioKT)
go
b) Hai trận đấu trong table TranDau diễn ra trong cùng một ngày (NgayTD) thì không bắt đầu
ở cùng một giờ thi đấu (GioTD).
alter table TranDau
add unique (NgayTD,GioBD)
go
/*

c/Tui tự thêm: Đổi phải thành dạng bit

alter table doi
alter column Phai bit not null
go
*/
Câu 3: Tạo View:
a) Tạo view vwDoiChuaThiDau dùng liêt kê danh sách các đội chưa có mã số đội trong table
DoiThiDau gồm: Mã số đội, tên đội, phái.
create view vwDoiChuaThiDau
as
select * from Doi
where MSDoi not in
(select MSDoi from DoiThiDau)
go
drop view vwDoiChuaThiDau
Cách 2:
create view vwDoiChuaThiDau1
as
select Doi.* from Doi left join DoiThiDau
on DoiThiDau.MSDoi=Doi.MSDoi
where DoiThiDau.MSDoi is NULL
go
b) Tạo view vwSoTranDau dùng thống kê số trận đấu diễn ra trong từng ngày thi đấu với các
thông tin: Ngày thi đấu và số trận đấu trong ngày.
create view vwSoTranDau
as
select NgayTD, count(MSTD)as N'Tổng Số Trận Đấu'
from TranDau
group by NgayTD

go
Câu 4: Tạo insert trigger cho table DoiThiDau dùng kiểm tra ràng buộc mỗi trận đấu chỉ là một cuộc
gặp gỡ giữa 2 đội và cả 2 đội phải thuộc cùng một phái.
Create trigger itrg_DoiThiDau on DoiThiDau
for insert as
Declare @D int
select @D= count(*) from DoiThiDau inner join inserted
on DoiThiDau.MSDoi = inserted.MSDoi
if (@D=1) return
if (@D>2)
begin
print N'Có nhiều hơn hai đòi'
rollback Tran
end
if (select count(*) from (inserted inner join DoiThiDau on
inserted.MSTD=DoiThiDau.MSTD) inner join Doi on DoiThiDau.MSDoi=Doi.MSDoi
group by Phai)=1
begin
print N'Phái không phù hợp'
Rollback Tran
end
go
Câu 5: Tạo thủ tục hoặc hàm hiển thị thông tin 2 đội tham gia trong một trận đấu khi biết mã số trận
đấu. Nếu mã trân đấu không có trong table DoiThiDau thì hiện thị thông báo lỗi. Trong đó, mã số trận
đấu (MSTD) là giá trị input .
create Proc spDoiThiDau(@N int)
as
if exists (select Doi.* from Doi inner join DoiThiDau
on DoiThiDau.MSDoi=Doi.MSDoi
where MSTD=@N)

select Doi.* from Doi inner join DoiThiDau
on DoiThiDau.MSDoi=Doi.MSDoi
where MSTD=@N
else
print N'Khong co doi'

go
Xoá proc
drop proc spDoiThiDau
Thực thi
exec spDoiThiDau 2
Bài 3
Câu 1: Cơ sở dữ liệu quản lý thi có chứa 3 table. Viết lệnh tạo các table với các ràng buộc khóa chính,
khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields là tự chọn theo ngữ nghĩa.
ThiSinh(MSTS, Ho, Ten, Ngaysinh, SBD, PhongThi)
Tân từ: Mỗi thí sinh có một mã số (MSTS) là một số nguyên phân biệt, có họ (Ho), tên (Ten),
ngày sinh (Ngaysinh), số báo danh (SBD), thuộc một phòng thi (PhongThi).
CREATE TABLE THISINH
(
MSTS INT PRIMARY KEY,
HO NVARCHAR(30),
TEN NVARCHAR(20),
NGAYSINH DATETIME,
SBD INT,
PHONGTHI NVARCHAR(10)
)
MonThi(MSMon, TenMon)
Tân từ: Mỗi môn thi có một mã số (MSMon) là một số nguyên phân biệt và có tên môn thi (TenMon).
CREATE TABLE MONTHI
(

MSMON INT PRIMARY KEY,
TENMON NVARCHAR(30)
)
DiemMonThi(MSTS, MSMon, DiemThi)
Tân từ: Ở mỗi môn thi (MSMon) thí sinh (MSTS) có một điểm thi (DiemThi).
CREATE TABLE DIEMMONTHI
(
MSTS INT REFERENCES THISINH(MSTS),
MSMON INT REFERENCES MONTHI(MSMON),
DIEMTHI TINYINT,
CONSTRAINT pk_DIEMMONTHI PRIMARY KEY (MSTS,MSMON)
)
Câu 2: Khai báo bổ sung các ràng buộc sau:
a) Mỗi thí sinh trong table ThiSinh có một số báo danh (SBD) phân biệt.
ALTER TABLE THISINH ADD UNIQUE(SBD)
b) Điểm thi (DiemThi) trong table DiemMonThi có giá trị từ 0 đến 10
ALTER TABLE DIEMMONTHI ADD CHECK(DIEMTHI BETWEEN 0 AND 10)
Câu 3: Tạo View:
a) Tạo view vwBoThi dùng liệt kê danh sách thí sinh bỏ thi (không có trong table
DiemMonThi).
GO
CREATE VIEW vwBoThi
AS
SELECT * FROM THISINH WHERE MSTS NOT IN (SELECT DISTINCT MSTS FROM
DIEMMONTHI)
GO
b) Tạo view vwKetQuaThi dùng liệt kê tổng điểm thi các môn của các thí sinh gồm: Số báo
danh, họ, tên, ngày sinh, phòng thi, tổng điểm thi. Sắp thứ tự ưu tiên theo phòng thi, sau đó
là số báo danh.
CREATE VIEW vwKetQuaThi

AS
SELECT SBD,HO,TEN,NGAYSINH,PHONGTHI,SUM(DIEMTHI) AS TONGDIEM
FROM THISINH INNER JOIN DIEMMONTHI ON THISINH.MSTS=DIEMMONTHI.MSTS
GROUP BY SBD,HO,TEN,NGAYSINH,PHONGTHI
GO
Câu 4: Tạo update trigger cho table ThiSinh để kiểm tra ràng buộc: Khi chuyển một thí sinh sang
phòng thi khác (sửa PhongThi của thí sinh) thì số thí sinh của phòng thi chuyển đến không được quá 25
thí sinh.
CREATE TRIGGER utrg_PHONGTHI ON THISINH
FOR UPDATE
AS
IF (SELECT COUNT(THISINH.MSTS) FROM THISINH INNER JOIN INSERTED ON
THISINH.MSTS=INSERTED.MSTS)>25
BEGIN
PRINT N'So thi sinh khong duoc qua 25 thi sinh'
ROLLBACK TRAN
END
GO
Câu 5: Viết thủ tục hoặc hàm sử dụng để điền số báo danh tự động (SBD) từ 1 trở đi theo thứ tự tên và
họ.
Create Procedure spDienSBD
as
Update THISINH set SBD=STT
From THISINH inner join
(select MSTS, ROW_NUMBER() over(order by Ten, Ho) As STT
from THISINH) as tblTemp on ThiSinh MSTS=tblTemp.MSTS
Cách 2
CREATE PROC spDienSBD
AS
DECLARE @I INT

SET @I=1
DECLARE curTS Cursor DYNAMIC
FOR
SELECT SBD,HO,TEN FROM THISINH ORDER BY TEN,HO
OPEN curTS
FETCH NEXT FROM curTS
While @@FETCH_STATUS=0
BEGIN
UPDATE THISINH SET SBD=@I WHERE CURRENT OF curTS
FETCH NEXT FROM curTS
SET @I = @I + 1
END
CLOSE curTS
DEALLOCATE curTS
Bài 4
Câu 1: Cơ sở dữ liệu quản lý hóa đơn bán hàng có chứa 3 table. Viết lệnh tạo các table với các ràng
buộc khóa chính, khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields là tự chọn theo ngữ
nghĩa.
1- MatHang(MSMH, TenMH, DonGia, SoTon)
Tân từ: Mỗi mặt hàng có một mã số (MSMH) là một số nguyên phân biệt, có tên mặt hàng
(TenMH), đơn giá (DonGia) bán mới nhất của mặt hàng đó và số lượng hàng tồn kho
(SoTon).
CREATE TABLE MATHANG
(
MSMH INT PRIMARY KEY,
TENMH NVARCHAR(50),
DONGIA MONEY,
SOTON FLOAT
)
2- HoaDon(MSHD, NgayLap)

Tân từ: Mỗi hóa đơn có một mã số phân biệt (MSHD), ngày lập hóa đơn (NgayLap)
CREATE TABLE HOADON
(
MSHD INT PRIMARY KEY,
NGAYLAP DATETIME
)
3- CTHD(MSHD, MSMH, SoLuong, DonGiaHD)
Tân từ: Mỗi hóa đơn (MSHD) ghi một hoặc nhiều mặt hàng (MSMH) cùng với số lượng (SoLuong) và
đơn giá bán tại thời điểm ghi hóa đơn (DonGiaHD).
CREATE TABLE CTHD
(
MSHD INT REFERENCES HOADON(MSHD),
MSMH INT REFERENCES MATHANG(MSMH),
SOLUONG FLOAT,
DONGIAHD MONEY,
sPRIMARY KEY (MSHD,MSMH)
)
Câu 2: Khai báo bổ sung các ràng buộc sau:
a) Số tồn (SoTon) trong table MatHang có giá trị mặc định (Default) bằng 0.
ALTER TABLE MATHANG ADD DEFAULT 0 FOR SOTON
b) Tên mặt hàng trong table MatHang có giá trị phân biệt giữa các mặt hàng.
ALTER TABLE MATHANG ADD UNIQUE(TENMH)
Câu 3: Tạo View:
a) Tạo view “vwTienHD” dùng hiển thị tiền bán trên từng hóa đơn gồm các thông tin: mã số hóa
đơn, ngày lập, tiền hóa đơn bằng tổng tiền bán từng mặt hàng ghi trên mỗi hóa đơn.
GO
CREATE VIEW vwTienHD
AS
SELECT HOADON.MSHD,NGAYLAP,SUM(SOLUONG*DONGIAHD) AS TONGTIEN
FROM HOADON INNER JOIN CTHD ON HOADON.MSHD=CTHD.MSHD GROUP BY

HOADON.MSHD,NGAYLAP
GO
b) Tạo view “vwHangKhongBanDuoc” dùng liêt kê danh sách các mặt hàng không bán được trong
tháng hiện hành.
CREATE VIEW vwHangKhongBanDuoc
AS
SELECT * FROM MATHANG WHERE MSMH NOT IN (SELECT MSMH
FROM HOADON INNER JOIN CTHD ON HOADON.MSHD=CTHD.MSHD WHERE
MONTH(NGAYLAP)=MONTH(GETDATE()))
GO
Câu 4: Xây dựng Insert trigger cho CTHD thực hiện yêu cầu: khi thêm một chi tiết hóa đơn phải cập
nhật lại số lượng tồn (SoTon) của mặt hàng tương ứng.
CREATE TRIGGER itrg_GiamTon ON CTHD
FOR INSERT
AS
DECLARE @D INT
SELECT @D = COUNT(*) FROM MATHANG a INNER JOIN INSERTED b ON a.MSMH =
b.MSMH WHERE SOTON - b.SOLUONG < 0
IF(@D > 0 )
BEGIN
PRINT N'Khong du hang de ban'
ROLLBACK TRAN
RETURN
END
UPDATE MATHANG SET SOTON=SOTON-SOLUONG
FROM INSERTED WHERE MATHANG.MSMH = INSERTED.MSMH
GO
Câu 5: Viết thủ tục hoặc hàm nhận 2 giá trị input kiểu số nguyên là tháng và năm. Hãy liệt kê doanh
thu của từng mặt hàng gồm các thông tin: mã số mặt hàng, doanh thu mặt hàng trong :
a) Một năm nếu tháng là Null và năm khác Null

b) Một tháng nếu tháng và năm khác Null
CREATE PROC spDTThang(@THANG TINYINT, @NAM SMALLINT)
AS
IF(@THANG <> NULL) AND (@NAM <> NULL)
SELECT MSMH,SUM(SOLUONG*DONGIAHD) FROM HOADON INNER JOIN CTHD
ON HOADON.MSHD=CTHD.MSHD WHERE MONTH(NGAYLAP)=@THANG AND
YEAR(NGAYLAP)=@NAM GROUP BY MSMH
ELSE IF (@NAM <> NULL)
SELECT MSMH,SUM(SOLUONG*DONGIAHD) FROM HOADON INNER JOIN CTHD
ON HOADON.MSHD=CTHD.MSHD WHERE YEAR(NGAYLAP)=@NAM GROUP BY MSMH
If(@THANG is not null)
select 1
Bài 5
Câu 1: Cơ sở dữ liệu quản lý việc mượn trả sách có chứa 3 table. Viết lệnh tạo các table với các ràng
buộc khóa chính, khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields là tự chọn theo ngữ
nghĩa.
1- Sach(MaSach, TenSach, SoLuong, SoDaMuon)
Tân từ: Mỗi tựa sách có một mã số (MaSach) là một số nguyên phân biệt, có tên sách (TenSach), số
lượng (SoLuong), và số sách hiện đã cho mượn (SoDaMuon).
CREATE TABLE SACH
(
MASACH INT PRIMARY KEY,
TENSACH NVARCHAR(50),
SOLUONG INT,
SODAMUON INT
)
2- DocGia(MaDG, TenDG)
Tân từ: Mỗi đọc giả có một mã số đọc giả (MaDG) là một số nguyên phân biệt, có tên đọc giả
(TenDG).
CREATE TABLE DOCGIA

(
MADG INT PRIMARY KEY,
TENDG NVARCHAR(50)
)
3- PhieuMuon(MaDG, NgayMuon, MaSach, NgayTra)
Tân từ: Mỗi ngày mỗi đọc giả chỉ được mượn một quyển sách. Khi đọc giả mượn sách cần ghi nhận
mã đọc giả (MaDG), ngày mượn (NgayMuon), mã sách (MaSach), ngày trả sách (NgayTra). Ngày trả
sách là Null khi chưa trả sách.
CREATE TABLE PHIEUMUON
(
MADG INT REFERENCES DOCGIA(MADG),
NGAYMUON DATETIME,
MASACH INT REFERENCES SACH(MASACH),
NGAYTRA DATETIME,
CONSTRAINT pk_PHIEUMUON PRIMARY KEY (MADG,NGAYMUON)
)
Câu 2: Khai báo bổ sung các ràng buộc sau:
a) Số lượng sách (SoLuong) trong table Sach không nhỏ hơn số sách đã mượn (SoDaMuon)
ALTER TABLE SACH ADD CONSTRAINT chkSOLUONG CHECK(SOLUONG<=SODAMUON)
b) Ngày mượn sách (NgayMuon) trong table PhieuMuon có giá trị mặc định là ngày hiện hành
ALTER TABLE PHIEUMUON ADD CONSTRAINT dfNGAYMUON DEFAULT GETDATE()
FOR NGAYMUON
Câu 3: Tạo View:
a) Tạo view “vwHetSach” dùng liêt kê các sách có số lượng sách (SoLuong) bằng với số lượng
sách đã cho mượn (SoDaMuon) gồm các thông tin: Mã sách, tên sách.
GO
CREATE VIEW vwHetSach
AS
SELECT MASACH,TENSACH FROM SACH WHERE SOLUONG=SODAMUON
GO

b) Tạo view “vwChuaTraSach” dùng hiển thị danh sách các đọc giả chưa trả sách (có ngày trả là
rổng) gồm các thông tin: mã đọc giả, tên đọc giả, ngày mượn, tên sách đã mượn.
CREATE VIEW vwChuaTraSach
AS
SELECT PHIEUMUON.MADG,TENDG,NGAYMUON,TENSACH FROM PHIEUMUON
INNER JOIN SACH ON PHIEUMUON.MASACH=SACH.MASACH INNER JOIN DOCGIA ON
DOCGIA.MADG=PHIEUMUON.MADG WHERE NGAYTRA=NULL
GO
Câu 4: Tạo update trigger trên table PhieuMuon thực hiện yêu cầu sau: Khi sửa ngày trả của một phiếu
mượn từ giá trị Null sang một giá trị khác Null thì phải giảm số lượng sách đã mượn của tựa sách
tương ứng trên table Sach, ngược lại nếu sửa ngày trả từ một giá trị khác Null sang giá trị Null thì phải
tăng số lượng sách đã mượn của tựa sách tương ứng trên table Sach.
CREATE TRIGGER utrg_NGAYTRA ON PHIEUMUON
FOR UPDATE
AS
IF EXISTS(SELECT NGAYTRA FROM DELETED WHERE
DELETED.NGAYTRA=NULL)
UPDATE SACH SET SODAMUON=SODAMUON-1 FROM INSERTED WHERE
SACH.MASACH=INSERTED.MASACH
ELSE
IF EXISTS(SELECT * FROM DELETED,INSERTED WHERE DELETED.NGAYTRA
!= NULL AND INSERTED.NGAYTRA=NULL)
UPDATE SACH SET SODAMUON=SODAMUON+1 FROM INSERTED
WHERE SACH.MASACH=INSERTED.MASACH
GO
Câu 5: Tao thủ tục hoặc hàm trả về số sách còn có thể cho mượn (SoLuong – SoDaMuon) của một mã
sách nào đó. Trong đó, mã sách là giá trị input. Hiển thị thông báo lỗi nếu mã sách không tồn tại trong
table Sach.
CREATE PROC spDTThang(@MASACH INT)
AS

IF(NOT EXISTS(SELECT * FROM SACH WHERE MASACH=@MASACH))
PRINT N'Khong tim thay ma sach nay!'
ELSE
SELECT SOLUONG-SODAMUON AS ST FROM SACH WHERE MASACH=@MASACH
Bài 6
Câu 1: Cơ sở dữ liệu quản lý kết quả học tập của học sinh có chứa 3 table. Viết lệnh tạo các table với
các ràng buộc khóa chính, khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields là tự chọn
theo ngữ nghĩa.
1- HocSinh(MSHS, Ho, Ten, TenLop, STTSoDiem)
Tân từ: Mỗi học sinh có một mã số (MSHS) là một số nguyên phân biệt, có họ (Ho), tên (Ten), học ở
một lớp (TenLop) và có số thứ tự học sinh ghi trong sổ điểm lớn của lớp (STTSoDiem).
CREATE TABLE HOCSINH
(
MSHS INT PRIMARY KEY,
HO NVARCHAR(50),
TEN NVARCHAR(10),
TENLOP NVARCHAR(15),
STTSODIEM INT
)
2- MonHoc(MSMon, TenMon, HeSoMon)
Tân từ: Mỗi môn học có mã số là số nguyên phân biệt (MSMon). Có tên môn học (TenMon) và hệ số
môn học (HeSoMon) dùng để tính điểm trung bình các môn của một học sinh.
CREATE TABLE MONHOC
(
MSMON INT PRIMARY KEY,
TENMON NVARCHAR(50),
HESOMON TINYINT
)
3- DiemTBMCN(MSHS, MSMon, DTBMon)
Tân từ: Ở mỗi môn học (MSMon), mỗi học sinh (MSHS) có một điểm trung bình cả năm của môn học

đó (DTBMon).
CREATE TABLE DIEMTBMCN
(
MSHS INT REFERENCES HOCSINH(MSHS),
MSMON INT REFERENCES MONHOC(MSMON),
DTMMON TINYINT,
CONSTRAINT pk_DIEMTBMCN PRIMARY KEY (MSHS,MSMON)
)
Câu 2: Khai báo bổ sung các ràng buộc sau:
a) Mỗi môn học có tên môn học (TenMon) phân biệt.
ALTER TABLE MONHOC ADD CONSTRAINT uq_TENMON UNIQUE(TENMON)
b) Điểm trung bình môn (DTBMon) có giá trị từ 0 đến 10
ALTER TABLE DIEMTBMCN ADD CONSTRAINT chk_DTBMON CHECK(DTBMON
BETWEEN 0 AND 10)
Câu 3: Tạo View:
a) Tạo view vwDTBCacMon dùng liêt kê điểm trung bình các môn của các học sinh gồm: Mã
số học sinh, điểm trung bình các môn. Trong đó, điểm trung bình các môn của một học sinh
bằng tổng điểm trung bình môn (DTBMon) của học sinh đó chia cho tổng hệ số các môn học
(HeSoMon)
GO
CREATE VIEW vwDTBCacMon
AS
SELECT MSHS,SUM(DTMMON)/SUM(HESOMON) AS DTB FROM DIEMTBMCN
INNER JOIN MONHOC ON DIEMTBMCN.MSMON=MONHOC.MSMON GROUP BY MSHS
GO
b) Tạo view vwThoiHoc dùng liêt kê danh sách học sinh không tồn tại trong table
DiemTBMCN.
CREATE VIEW vwThoiHoc
AS
SELECT * FROM HOCSINH WHERE MSHS NOT IN (SELECT MSHS FROM

DIEMTBMCN)
GO
Câu 4: Tạo Insert trigger cho table HocSinh để thực hiện yêu cầu sau: Khi thêm một học sinh mới vào
một lớp thì cập nhật tự động số thứ tự của học sinh đó bằng số thứ tự lớn nhất hiện có trong lớp cộng
thêm 1.
CREATE TRIGGER itrg_STT ON HOCSINH
FOR INSERT
AS
DECLARE @STTMAX INT
SELECT @STTMAX=MAX(HOCSINH.STTSODIEM) FROM HOCSINH,INSERTED
WHERE HOCSINH.TENLOP=INSERTED.TENLOP
UPDATE HOCSINH SET STTSODIEM=@STTMAX+1 FROM INSERTED WHERE
HOCSINH.MSHS=INSERTED.MSHS
GO
Câu 5: Viết thủ tục hoặc hàm để điền số thứ tự sổ điểm (STTSoDiem) tự động từ 1 trở đi theo thứ tự
tên và họ của các học sinh trong một lớp. Trong đó, tên lớp là giá trị input.
CREATE PROC spDienSTTSD(@TENLOP NVARCHAR(50))
AS
DECLARE @I INT
DECLARE curHS CURSOR DYNAMIC
FOR
SELECT TEN,HO FROM HOCSINH WHERE TENLOP=@TENLOP ORDER BY
TEN,HO
OPEN curHS
SET @I=1
FETCH NEXT FROM curHS
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE HOCSINH SET STTSODIEM=@I
WHERE CURRENT OF curHS

FETCH NEXT FROM curHS
SET @I=@I+1
END
CLOSE curHS
DEALLOCATE curHS
Bài 7
Câu 1: Cơ sở dữ liệu quản lý học viên có chứa 3 table. Viết lệnh tạo các table với các ràng buộc khóa
chính, khóa ngoại được nêu trong tân từ. Kiểu dữ liệu của các Fields là tự chọn theo ngữ nghĩa.
HocVien(MaHV, Lop, Ho, Ten, Ngaysinh, Phai)
Tân từ: Mỗi học viên có một mã số (MaHV) là số nguyên phân biệt, thuộc một lớp (Lop), có họ
(HO) và tên (Ten) sinh viên, ngày sinh (Ngaysinh), thuộc phái nữ hay nam (Phai).
CREATE TABLE HOCVIEN
(
MAHV INT PRIMARY KEY,
LOP NVARCHAR(15),
HO NVARCHAR(50),
TEN NVARCHAR(10),
NGAYSINH DATETIME,
PHAI BIT
)
MonHoc(MaMH, TenMon)
Tân từ: Mỗi môn học có một mã số (MaMH) là một số nguyên phân biệt, có tên môn học (TenMon).
CREATE TABLE MONHOC
(
MAMH INT PRIMARY KEY,
TENMON NVARCHAR(50),
)
KetQua(MaHV, MaMH, LanThi, Diem)
Tân từ: Mỗi học viên (MaHV) có thể học nhiều môn (MaMH). Mỗi môn học có thể thi nhiều lần
(LanThi), mỗi lần thi được đánh số thứ tự từ 1 trở đi và ghi nhận điểm thi (Diem) của các lần thi đó.

CREATE TABLE KETQUA
(
MAHV INT REFERENCES HOCVIEN(MAHV),
MAMH INT REFERENCES MONHOC(MAMH),
LANTHI TINYINT,
DIEM TINYINT,
CONSTRAINT pk_KETQUA PRIMARY KEY (MAHV,MAMH,LANTHI)
)
Câu 2: Khai báo bổ sung các ràng buộc sau:
a) Lần thi (LanThi) trong table KetQua có giá trị mặc định là 1
ALTER TABLE KETQUA ADD CONSTRAINT df_LANTHI DEFAULT 1 LANTHI
b) Điểm thi (Diem) trong table KetQua được chấm theo thang điểm 10
ALTER TABLE KETQUA ADD CONSTRAINT chk_DIEM CHECK(DIEM BETWEEN 0 AND 10)
Câu 3: Tạo View:
a) Tạo view vwLanThiCuoi dùng liêt kê danh sách lần thi cuối cùng của các học viên gồm: Mã số
sinh viên, mã số môn học, lần thi cuối cùng của môn học (ví dụ học viên A thi môn học C ba
lần thì lần thi cuối cùng là 3).
GO
CREATE VIEW vwLanThiCuoi
AS
SELECT MAHV,MAMH,MAX(LANTHI) AS LTC FROM KETQUA GROUP BY
MAHV,MAMH,MAX(LANTHI)
GO
b) Tạo view vwKetQuaCuoi dùng liêt kê danh sách học viên gồm: Mã số sinh viên, mã số môn
học, lần thi cuối cùng của môn học (ví dụ học viên A thi môn học M ba lần thì lần thi cuối cùng
là 3) và điểm của lần thi cuối cùng đó.
CREATE VIEW vwKetQuaCuoi
AS
SELECT MAHV,MAMH,MAX(LANTHI) AS LTC,DIEM FROM KETQUA GROUP BY
MAHV,MAMH,MAX(LANTHI),DIEM

GO
Câu 4: Tạo trigger Insert cho table KetQua dùng điền tự động số thứ tự lần thi khi thêm điểm thi một
môn học của một sinh viên. Ví dụ học viên A đã thi môn học M hai lần thì lần thi mới thêm vào phải là
3.
CREATE TRIGGER itrg_LANTHI ON KETQUA
INSTEAD OF INSERT
AS
GO
Câu 5: Viết thủ tục hoặc hàm liệt kê kết quả thi các môn của một học viên khi biết mã số của học viên
(MaHV) gồm các thông tin: mã số môn học, lần thi, điểm thi. Trong đó, mã số học viên là giá trị input
CREATE PROC spKetQuaThi(@MAHV INT)
AS
SELECT MAMH,LANTHI,DIEM FROM KETQUA WHERE MAHV=@MAHV
create database QuanLyDatVaGiaoHang
go
use QuanLyDatVaGiaoHang
go
create table MatHang
(
MSMH int primary key,
TenMH nvarchar(50),
DonGia real
)
go
create table DonDatHang
(
MSDH int primary key identity(1,1),
MSMH int references MatHang(MSMH),
SLDat int,

DonGiaDH real,
NgayDH smalldatetime,
Khachhang nvarchar(50)
)
go
create table PhieuGiaoHang
(
MSPG int primary key identity(1,1),
MSDH int references DonDatHang(MSDH),
NgayGH smalldatetime,
SLGiao int
)
go
Cau2
a
alter table DonDatHang add
constraint chk_SLDat check(SLDat > 0)
b
alter table MatHang add
constraint uni_TenMH unique(TenMH)
go
Cau3 a
create view vwGiaoHang
as
select MSDH,TongDaGiao = SUM(SLGiao)
from PhieuGiaoHang
group by MSDH
b
go
create view vwDDHChuaGiao

as
select *
from DonDatHang
where MSDH not in (select MSDH from PhieuGiaoHang)
Cau4
go
alter trigger itrig_PGH on PhieuGiaoHang
for insert
as
declare @NgayDH smalldatetime, @NgayGH smalldatetime
declare @SLD int, @SLG int
Dat hang, so luong dat
select @NgayDH = NgayDH, @SLD = SLDat
from DonDatHang ddh join inserted i on ddh.MSDH = i.MSDH
Giao hang, so luong giao
select @NgayGH = NgayGH, @SLG = SLGiao
from inserted
Kiem tra dieu kien
if @NgayDH > @NgayGH or @SLD < @SLG
begin
print 'Loi!!!'
rollback tran
end
go
Cau5
create proc sp_TongSLH(@MSDH int,@TongSL int output)
as
select @TongSL = sum(SLGiao)
from PhieuGiaoHang
where MSDH = @MSDH

Thuc thi
declare @Tong int
exec sp_TongSLH 3,@Tong output
print @Tong
create database QuanLyThi
go
use QuanLyThi
go
create table ThiSinh
(
MSTS int primary key,
Ho nvarchar(50),
Ten nvarchar(50),
NgaySinh smalldatetime,
SBD int,
PhongThi nvarchar(50)
)
go
create table MonThi
(
MSMon int primary key,
TenMon nvarchar(50)
)
go
create table DiemMonThi
(
MSTS int references ThiSinh(MSTS),
MSMon int references MonThi(MSMon),
DiemThi real,

primary key(MSTS,MSMon)
)
go
Cau2
alter table ThiSinh add
constraint uni_SBD unique(SBD)
alter table DiemMonThi add
constraint chk_Diem check(DiemThi between 0 and 10)
go
Cau3
a
create view vwBoThi
as
select *
from ThiSinh
where MSTS not in (select MSTS from DiemMonThi)
go
b
create view vwKetQuaThi
as
select top 100 percent SBD,HoTen = Ho+Ten,NgaySinh,PhongThi,TongDiemThi = SUM(DiemThi)
from ThiSinh ts, DiemMonThi dmt
where ts.MSTS = dmt.MSTS
group by dmt.MSTS,Ho,Ten,PhongThi,SBD,NgaySinh
order by PhongThi,SBD
go
Cau4
create trigger utrig_ThiSinh on ThiSinh
for update
as

declare @SoTS int
select @SoTS = COUNT(*)
from ThiSinh ts join inserted i on ts.PhongThi = i.PhongThi
Check SoThiSinh
if @SoTS > 25
begin
print 'Loi: So thi sinh vuot qua 25!!!'
rollback tran
end
go
Cau5
create view vwSBD
as
select MSTS,SBD,STT=ROW_NUMBER()
over (order by Ten,Ho)
from ThiSinh
go
create proc sp_autoSBD
as
update vwSBD
set SBD = STT
go
Execute procudure
exec sp_autoSBD
create database QuanLyLuongSanPham
go
use QuanLyLuongSanPham
go
create table NhanVien

(
MaNV int primary key,
Ho nvarchar(50),
Ten nvarchar(50),
LoaiNV tinyint
)
go
create table SanPham
(
MaSP int primary key,
TenSP nvarchar(50),
DonGiaSX real
)
go
create table KQSX
(
MaNV int references NhanVien(MaNV),
NgaySX smalldatetime,
MaSP int references SanPham(MaSP),
SoLuong int,
primary key(MaNV,NgaySX)
)
go
Cau2
a
alter table SanPham add
constraint uni_TenSP unique(TenSP)
b ????????????????
alter table KQSX add
constraint def_NgaySX default(getdate()) for NgaySX

go
Cau3
a
create view vwKQSX
as
select MaNV,MaSP,SoLuong,NgaySX
from KQSX
where DateDiff(dd, NgaySX, getdate()) = 0
b
go
create view vwLuongSX
as
select MaNV,Luong = Sum(DonGiaSX * SoLuong)
from SanPham sp, KQSX kq
where sp.MaSP = kq.MaSP and MONTH(NgaySX) = MONTH(GETDATE()) and
YEAR(NgaySX) = YEAR(GETDATE())
group by MaNV
select *
from SanPham sp, KQSX kq
where sp.MaSP = kq.MaSP
select * from sanpham
select * from KQSX
go
Cau4
create trigger itrig_KQSX on KQSX
for insert
as
if (select LoaiNV from NhanVien nv join inserted i on nv.MaNV = i.MaNV) != 1
begin
print 'Loi: Khong phai la cong nhan san xuat!!!'

rollback tran
end
select * from NhanVien
select * from KQSX
insert into KQSX values(2,GETDATE(),1,2)
go
Cau5
create proc sp_BangLuong(@thang int,@nam int)
as
Month and Year are invalid
if @thang is null or @nam is null or @thang not between 1 and 12
return 1
Show payroll
select kq.MaNV,HoTen,LuongSanPham = sum(SoLuong * DonGiaSX)
from NhanVien nv, SanPham sp, KQSX kq
where nv.MaNV = kq.MaNV and sp.MaSP = kq.MaSP and
MONTH(NgaySX) = @thang and YEAR(NgaySX) = @nam
group by kq.MaNV,HoTen
exec sp_BangLuong 6,2012

×