You are on page 1of 17

Tài liệu ôn thi

Đề 1:
Cho một phần lược đồ CSDL quan hệ quản lý đề án trong công ty gồm:
NHANVIEN(MANV, HOTEN, NGSINH, DCHI, DT)
Mô tả: Mỗi nhân viên phải có mã số (MANV) duy nhất để phân biệt với các
nhân viên khác, có họ tên
(HOTEN), ngày sinh (NGSINH), địa chỉ (DCHI) và điện thoại(DT).
DEAN(MADA, TENDA, DIADIEMDA)
Mô tả: Mỗi đề án có mã số (MADA) duy nhất để phân biệt với các đề án
khác, có tên đề án (TENDA) và
có địa điểm để thực hiện đề án (DIADIEMDA).
PHANCONG(MANV, MADA, SOBUOILV)
Mô tả: Để thực hiện đề án thì phải phân công cho từng nhân viên (MANV)
làm đề án (MADA) nào và có
số buổi làm việc (SOBUOILV) cho đề án đó.
Sinh viên thực hiện các yêu cầu sau:
Câu 1: (2.5 điểm) Thêm vào bảng NHANVIEN (Nhân viên) một cột: Số đề án đã
thực hiện (SODATH).
Viết 1 Stored Procedure có sử dụng cơ chế Cursor để cập nhật vào cột số đề
án đã thực hiện (SODATH)
với tổng số đề án mà mỗi nhân viên đã được phân công làm.
Câu 2: (2.5 điểm) Viết 1 Function với 1 tham số truyền vào là mã nhân viên
(MANV), trả về là Tổng số
đề án mà nhân viên này đã được phân công làm.
Câu 3: (2.5 điểm) Viết 1 Stored Procedure với các tham số truyền vào: mã nhân
viên (MANV), mã đề án
(MADA), số buổi làm việc (SOBUOILV). Trước khi chèn (Insert) dữ liệu
vào bảng PHANCONG phải
kiểm tra MANV có trong bảng nhân viên chưa? Phải kiểm tra MADA có
trong bảng đề án chưa? Kiểm
tra dữ liệu trùng? Nếu sai thì thông báo lỗi, ngược lại cho chèn dữ liệu.
Câu 4: (2.5 điểm) Viết 1 Trigger kiểm tra khi chèn dữ liệu vào bảng NHANVIEN
thì cần phải kiểm tra
tuổi của nhân viên, những nhân viên có tuổi từ 25 đến 50 tuổi mới được
chèn, ngược lại không cho chèn
dữ liệu và thông báo lỗi.

/*Câu 1: (2.5 điểm) Thêm vào bảng NHANVIEN (Nhân viên) một cột: Số đề án đã
thực hiện (SODATH).
Viết 1 Stored Procedure có sử dụng cơ chế Cursor để cập nhật vào cột số đề án đã
thực hiện (SODATH) với tổng số đề án mà mỗi nhân viên đã được phân công
làm.*/

ALTER TABLE NHANVIEN ADD SODATH INT


GO
CREATE PROC SP_CAU1
AS
BEGIN

DECLARE TEO CURSOR FOR SELECT MANV,COUNT(MADA) AS


SODATH
FROM PHANCONG
GROUP BY MANV
OPEN TEO

DECLARE @MANV INT,


@SODATH INT

FETCH NEXT FROM TEO INTO @MANV, @SODATH


WHILE @@FETCH_STATUS=0
BEGIN
UPDATE NHANVIEN --cập nhật vào cột số đề án đã thực
hiện (SODATH)
SET @SODATH = SODATH
WHERE MANV = @MANV --mỗi nhân viên đã được phân
công làm
FETCH NEXT FROM TEO INTO @MANV, @SODATH
END
CLOSE TEO
DEALLOCATE TEO
END

/*Câu 2: (2.5 điểm) Viết 1 Function với 1 tham số truyền vào là mã nhân viên
(MANV), trả về là Tổng số đề án mà nhân viên này đã được phân công làm*/
CREATE FUNCTION F_CAU2
(
@MANV INT --truyền vào là mã nhân viên (MANV)
)
RETURNS INT
AS
BEGIN
DECLARE @TONGSODA INT
SELECT @TONGSODA=COUNT(MADA)
FROM PHANCONG
WHERE MANV=@MANV
GROUP BY MANV
RETURN @TONGSODA
END

/*Câu 3: (2.5 điểm) Viết 1 Stored Procedure với các tham số truyền vào: mã nhân
viên (MANV), mã đề án (MADA), số buổi làm việc (SOBUOILV). Trước khi
chèn (Insert) dữ liệu vào bảng PHANCONG phải kiểm tra MANV có trong bảng
nhân viên chưa? Phải kiểm tra MADA có trong bảng đề án chưa? Kiểm tra dữ liệu
trùng? Nếu sai thì thông báo lỗi, ngược lại cho chèn dữ liệu.*/
CREATE PROC SP_CAU3
(
@MANV INT,
@MADA INT,
@SOBUOILV INT
)
AS
BEGIN
IF NOT EXISTS(SELECT MANV FROM NHANVIEN WHERE MANV =
@MANV ) --dữ liệu vào bảng PHANCONG phải kiểm tra MANV có trong bảng
nhân viên chưa?
PRINT N'MA NHAN VIEN:' + CAST (@MANV AS VARCHAR(2)) +
N'KHONG CO TRONG BANG NHAN VIEN'
ELSE

IF NOT EXISTS(SELECT MADA FROM DEAN WHERE


MADA=@MADA) --kiểm tra MADA có trong bảng đề án chưa?
PRINT N'MA DE AN:' + CAST (@MADA AS VARCHAR(2)) +
N'KHONG CO TRONG BANG DE AN'

IF NOT EXISTS(SELECT * FROM PHANCONG WHERE MANV =


@MANV) --Kiểm tra dữ liệu trùng? Nếu sai thì thông báo lỗi, ngược lại cho chèn
dữ liệu.
PRINT N'MA NHAN VIEN VA MA DE AN NAY DA CO ROI
BAN OI'
ELSE
BEGIN
INSERT INTO PHANCONG(MANV, MADA, SOBUOILV) --
chèn (Insert) dữ liệu vào bảng PHANCONG
VALUES (@MANV, @MADA, @SOBUOILV)
PRINT N'BAN DA THEM DU LIEU THANH CONG.CHUT
MUNG BAN QUA MON'
END

END

/*Câu 4: (2.5 điểm) Viết 1 Trigger kiểm tra khi chèn dữ liệu vào bảng
NHANVIEN thì cần phải kiểm tra tuổi của nhân viên, những nhân viên có tuổi từ
25 đến 50 tuổi mới được chèn, ngược lại không cho chèn
dữ liệu và thông báo lỗi.*/

CREATE TRIGGER T_CAU4


ON NHANVIEN
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @TUOI INT
SELECT @TUOI =YEAR(GETDATE())-YEAR(NGAYSINH)
FROM inserted
IF @TUOI>50 OR @TUOI<25 --những nhân viên có tuổi từ 25 đến
50 tuổi mới được chèn, ngược lại không cho chèn dữ liệu và thông báo lỗi
BEGIN
PRINT N'BAN NHAP SAI NGAY SINH CUA NHAN
VIEN TU 25 DEN 50'
ROLLBACK TRANSACTION
END
ELSE
BEGIN
PRINT N'BAN DA INSERT/UPDATE NGAY SINH
CUA NHAN VIEN TU 25 DEN 50 THANH CONG'
COMMIT TRANSACTION
END
END

Đề 2:

Cho một phần lược đồ CSDL quản lý bán hàng gồm:


MATHANG(MAMH, TENMH, SLTONKHO)
Mô tả: Mỗi mặt hàng có một mã số duy nhất (MAMH) để phân biệt với các mặt hàng
khác, có tên mặt hàng (MAMH) và có số lượng tồn kho (SLTONKHO).
HOADON(MAHD, NGAYLHD, TONGTIEN)
Mô tả: Mỗi hóa đơn có một mã số duy nhất (MAHD) để phân biệt với các hóa đơn
khác, có ngày lập hóa đơn (NGAYLHD) và tổng tiền (TONGTIEN) trên hóa
đơn đó.
CT_HOADON(MAHD, MAMH, SL, DG)

Mô tả: Mỗi mặt hàng (MAMH) thuộc một chi tiết hóa đơn (MAHD), có số lượng (SL)
và đơn giá (DG).

Thực hiện các yêu cầu truy vấn:

1. Viết 1 Stored Procedure có sử dụng cơ chế cursor để tìm và in ra danh sách các
hóa đơn có tổng tiền.
2. Viết 1 Function truyền vào mã mặt hàng, trả về tổng số lượng hàng đã bán trong
ngày hiện tại.
3. Viết 1 Stored Procedure có sử dụng cơ chế cursor để cập nhật cột tổng tiền
(TONGTIEN) cho bảng hóa đơn, dựa vào số lượng (SL) và đơn giá (DG) ở bảng
chi tiết hóa đơn cho mỗi hóa đơn.
4. Viết 1 Trigger kiểm tra với mỗi hóa đơn thì ta có: TONGTIEN = SUM(SL*DG)
/*1.Viết 1 Stored Procedure có sử dụng cơ chế cursor để tìm và in ra danh sách các
hóa đơn có tổng tiền.*/
GO
CREATE PROC SP_CAU1
AS
BEGIN
DECLARE TEO CURSOR FOR SELECT MAHD, NGAYLHD, TONGTIEN
FROM HOADON
DECLARE @MAHD INT,
@NGAYLHD DATETIME,
@TONGTIEN FLOAT

OPEN TEO
FETCH NEXT FROM TEO INTO @MAHD, @NGAYLHD,
@TONGTIEN
WHILE @@FETCH_STATUS=0
BEGIN
PRINT @MAHD, @NGAYLHD, @TONGTIEN
FETCH NEXT FROM TEO INTO @MAHD, @NGAYLHD,
@TONGTIEN
END
CLOSE TEO
DEALLOCATE TEO
END
/*2.Viết 1 Function truyền vào mã mặt hàng, trả về tổng số lượng hàng đã bán
trong ngày hiện tại*/
CREATE FUNCTION F_CAU2
(
@MAHD INT
)
RETURNS INT
AS
BEGIN
DECLARE @TONGSL INT
-----------------------
SELECT @TONGSL = SUM(ct.SL)
FROM HOADON hd, CT_HOADON ct
WHERE hd.MAHD = ct.MAHD AND
hd.NGAYLHD = getdate() AND
ct.MAHD = @MAHD
------------------------------
RETURN @TONGSL
END
/*3.Viết 1 Stored Procedure có sử dụng cơ chế cursor để cập nhật cột tổng tiền
(TONGTIEN) cho bảng hóa đơn, dựa vào số lượng (SL) và đơn giá (DG) ở bảng
chi tiết hóa đơn cho mỗi hóa đơn.*/
CREATE PROC SP_CAU3
AS
BEGIN
DECLARE TEO CURSOR FOR SELECT MAHD, SUM(SL*DG) AS
TONGTIEN
FROM CT_HOADON
GROUP BY MAHD
DECLARE @MAHD INT,
@TONGTIEN FLOAT
OPEN TEO
FETCH NEXT FROM TEO INTO @MAHD, @TONGTIEN
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE HOADON
SET TONGTIEN =@TONGTIEN
WHERE MAHD=@MAHD
FETCH NEXT FROM TEO INTO @MAHD, @TONGTIEN
END
CLOSE TEO
DEALLOCATE TEO
END
Cú pháp các dạng:

Function:

Type 1: Nếu muốn UDFs trả về một kết quả (số, chuỗi, date,…) thì ta sử dụng
UDFs dạng 1

A.Scalar Functions – Type 1


CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ]
)
RETURNS scalar_return_data_type
[ WITH < function_option> [ [,] ...n] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END

IF EXISTS(SELECT NAME FROM SYSOBJECTS WHERE


NAME='FUNC_SOTS1')
DROP FUNCTION FUNC_SOTS1
GO
--TYPE 1:
CREATE FUNCTION FUNC_SOTS1
(
@TENT NVARCHAR(100)
)
RETURNS NVARCHAR(100)
BEGIN
DECLARE @SOTS INT
SELECT @SOTS=COUNT(*) FROM THISINH TS,TRUONG T
WHERE TS.MST=T.MST AND TENT=@TENT
GROUP BY TS.MST
RETURN @TENT +':'+ CAST(@SOTS AS NVARCHAR)
END
go
SELECT N'VĂN CHIẾN' + N'MỸ LINH'
SELECT N'THÍCH: ' + RTRIM(CAST(20000000 AS CHAR)) + N'TRIỆU'
SELECT 100 + 200
SELECT COUNT(*)
FROM THISINH TS,TRUONG T
WHERE TS.MST=T.MST AND TENT= N'ĐH Khoa học tự nhiên'--@TENT
GROUP BY TS.MST
SELECT COUNT(*)
FROM THISINH TS,TRUONG T
WHERE TS.MST=T.MST AND TENT=N'ĐH Nguyễn Tất Thành' --@TENT
GROUP BY TS.MST
SELECT N'NGUYỄN VĂN AN' + ':' + CAST(100 AS CHAR)
SELECT N'HỒNG LOAN' + 'CHÁNH PHÁT'

Type 2: Nếu muốn UDFs trả về tập kết quả dạng bảng thì ta sử dụng UDFs dạng 2.

B.Inline Table-valued Functions – Type 2


CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ]
)
RETURNS TABLE
[ WITH < function_option > [ [,] ...n ] ]
[ AS ]
RETURN [ ( ] select-stmt [ ) ]

CREATE FUNCTION FUNC_TONGDIEM


(
@MSTS CHAR(10)
)
RETURNS TABLE
AS
RETURN(
SELECT TENTS, SUM(DIEM)AS [TỔNG ĐIỂM]
FROM THISINH TS,KETQUA KQ
WHERE TS.MSTS=KQ.MSTS AND
KQ.MSTS=@MSTS
GROUP BY TENTS
)

Type 3: Nếu muốn UDFs trả về tập kết quả dạng bảng tạm thì ta sử dụng
UDFs dạng 3.

C.Multi-statement Table-valued Functions – Type 3


CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ]
)
RETURNS @return_variable TABLE < table_type_definition >
[ WITH < function_option > [ [,] ...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
< function_option > ::=
{ ENCRYPTION | SCHEMABINDING }
< table_type_definition > :: =
( { column_definition | table_constraint } [ ,...n ] )

View:

CREATE VIEW [ < database_name > . ] [ < owner > . ] view_name [ ( column [
,...n ] ) ]
[ WITH < view_attribute > [ ,...n ] ]
AS
select_statement
[ WITH CHECK OPTION ]
< view_attribute > ::=
{ ENCRYPTION | SCHEMABINDING | VIEW_METADATA }
---------------VIEW-------------
/*Ứng với mỗi đề tài cho biết: Ten de tai, ten sinh vien tham gia, ten giao vien
huong dan,

ten giao vien phan bien.*/

If EXISTS(SELECT NAME FROM SYSOBJECTS WHERE


NAME='V_DETAICAU1')
DROP VIEW V_DETAICAU1
GO
--TAO VIEW CHO BANG DE TAI
CREATE VIEW V_DETAI
AS
SELECT MADT,TENDT
FROM DETAI
GO
SELECT * FROM V_DETAI
--TAO VIEW CHO SINH VIEN
GO
CREATE VIEW V_SINHVIEN
AS
SELECT HOTEN,MADT
FROM SINHVIEN SV,SV_DETAI SVDT
where SV.MASV=SVDT.MASV
GO
SELECT * FROM V_SINHVIEN
GO
--TAO VIEW CHO GIAO VIEN HUONG DAN
CREATE VIEW V_GVHD
AS
SELECT HOTENGV,MADT
FROM GIAOVIEN GV,GVHDDT GVHD
WHERE GV.MSGV=GVHD.MSGV
GO
SELECT * FROM V_GVHD
GO
--TAO VIEW CHO GIAO VIEN PHAN BIEN
CREATE VIEW V_GVPB
AS
SELECT HOTENGV,MADT
FROM GIAOVIEN GV,GVPBDT GVPB
WHERE GV.MSGV=GVPB.MSGV
GO
SELECT * FROM V_GVPB
GO
CREATE VIEW V_DETAICAU1
AS
SELECT T1.TENDT, T2.HOTEN, T3.HOTENGV AS GVHD,
T4.HOTENGV AS GVPB
FROM V_DETAI T1, V_SINHVIEN T2, V_GVHD T3, V_GVPB T4
WHERE T1.MADT = T2.MADT AND
T2.MADT = T3.MADT AND
T3.MADT = T4.MADT
GO
SELECT * FROM V_DETAICAU1

Cursor:

DECLARE cursor_name CURSOR


[ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }
FETCH [ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
] FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]
WHILE @@FETCH_STATUS
Return value
Description
0
FETCH statement was successful.
-1
FETCH statement failed or the row was beyond the result set.
-2
Row fetched is missing.
BEGIN <SQL Query>
FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar } ]
FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]
END
CLOSE cursor_name
DEALLOCATE cursor_name

----------------Bài4:CURSOR------------
--Câu1:/*Thêm 2 cột DIEMTB và XLOAI vào Table SINHVIEN:Dùng cursor cập
nhật điểm trung bình của các đề tài và xếp loại theo quy tắc:
9<=DIEMTB<=10 XLOAI: ‘Giỏi’
7<=DIEMTB<9 XLOAI: ‘Khá’
5<=DIEMTB<7 XLOAI: ‘Trung bình’
DIEMTB<5 XLOAI: ‘Không đạt’
Trong đó: Điểm trung bình của đề tài được tính theo
công thức sau
DIEMTB = (DIEMHD+Average(DIEMPB)
+Average(DIEM))/3*/
Go
ALTER TABLE SINHVIEN ADD DIEMTB FLOAT, XEPLOAI
NVARCHAR(20)
GO
---------ANONYMYOUS BOCK
BEGIN
--1.KHAI BAO CURSOR
DECLARE XOAI CURSOR FOR SELECT MADT,MASV
FROM SV_DETAI
--2.KHAI BAO BIEN
DECLARE @MADT CHAR(10),
@MASV CHAR(10)
--3. MO CURSOR
OPEN XOAI
--4.DI CHUYEN CURSOR DE LAY DU LIEU DUA VAO BIEN
FETCH NEXT FROM XOAI INTO @MADT, @MASV
--5.VÒNG LẶP WHILE ĐỂ KIỂM TRA TRANG THÁI CURSOR
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE SINHVIEN
SET DIEMTB = DBO.F231_CAU1(@MADT),
XEPLOAI = DBO.F231_CAU2(@MADT)
WHERE MASV = @MASV
--4.DI CHUYEN CURSOR DE LAY DU LIEU DUA VAO BIEN
FETCH NEXT FROM XOAI INTO @MADT, @MASV
END
--6.ĐÓNG CURSOR
CLOSE XOAI
--7.XÓA CURSOR
DEALLOCATE XOAI
END
GO
SELECT * FROM SINHVIEN

STORED PROCEDURE:
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]

/*Tham số đưa vào là MSGV, HOTENGV, SODT, DCHI, MAHH, NAMHH.

Trước khi chèn dữ liệu cần kiểm tra MAHH đã tồn tại trong table

HOCHAM chưa, nếu chưa trả ra thông báo lỗi.*/

--------STORED PROCEDURE
CREATE PROC PR_CAU1N1
(
@MADT CHAR(10)
)
AS
BEGIN
--LÀM MẤT HIỆU CỦA KHÓA NGOẠI
ALTER TABLE SV_DETAI NOCHECK
CONSTRAINT ALL
ALTER TABLE GVHDDT NOCHECK CONSTRAINT
ALL
ALTER TABLE GVPBDT NOCHECK CONSTRAINT
ALL
ALTER TABLE GVUVDT NOCHECK CONSTRAINT
ALL
ALTER TABLE HOIDONG_DT NOCHECK CONSTRAINT
ALL
DELETE DETAI WHERE MADT= @MADT
------LÀM KHÓA NGOẠI CÓ HIỆU LỰC TRỞ LẠI
ALTER TABLE SV_DETAI CHECK CONSTRAINT
ALL
ALTER TABLE GVHDDT CHECK CONSTRAINT ALL
ALTER TABLE GVPBDT CHECK CONSTRAINT ALL
ALTER TABLE GVUVDT CHECK CONSTRAINT ALL
ALTER TABLE HOIDONG_DT CHECK CONSTRAINT ALL
END
GO
EXECUTE PR_CAU1N1 '97002'
GO
SELECT *FROM DETAI
SELECT *FROM SV_DETAI
SELECT * FROM GVHDDT
SELECT * FROM GVPBDT
SELECT * FROM GVUVDT
SELECT * FROM HOIDONG_DT

Trigger:

CREATE TRIGGER trigger_name


ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
}]
sql_statement [ ...n ]
}
}

/*Câu 4: Tạo Trigger thỏa mãn ràng buộc là khi đổi một mã số đề tài(MADT)
trong bảng đề tài
sẽ thay đổi các thông tin liên quan
Các bảng liên quan đến bảng đề tài gồm:
1.Bảng SV_DETAI
2.Bảng GVHDDT
3.Bảng GVPBDT
4.Bảng GVUVDT
5.Bảng HOIDONG_DT*/
GO
IF EXISTS(SELECT *FROM SYSOBJECTS WHERE NAME='T_CAU')
DROP TRIGGER T_CAU4
GO
CREATE TRIGGER T_CAU4
ON DETAI
FOR UPDATE
AS
BEGIN
DECLARE @MADT CHAR(10)
SELECT @MADT=MADT FROM updated
UPDATE SV_DETAI WHERE MADT=@MADT
UPDATE GVHDDT WHERE MADT=@MADT
UPDATE GVPBDT WHERE MADT=@MADT
UPDATE GVUVDT WHERE MADT=@MADT
UPDATE HOIDONG_DT WHERE MADT=@MADT
END
GO

You might also like