4) Viết 1 trigger ràng buộc liên thuộc tính là ngày bán của một HOADON thì luôn luôn lớn hơn hay bằng ngày lập hóa đơn. 5) Viết 1 trigger cho lệnh insert, delete trên bảng [order Details[r]
Trang 1Thông tin bao gồm CategoryName, Description,
ProductName, QuantityPerUnit, UnitPrice, UnitsInStock
CREATE VIEW LOAISP_SP
AS
SELECT CATEGORYNAME, DESCRIPTION, PRODUCTNAME,
QUANTITYPERUNIT, UNITPRICE, UNITSINSTOCK
FROM Categories C JOIN PRODUCTS P
ON C.CATEGORYID =P.CATEGORYID
XEM THÔNG TIN CUA VIEW
SELECT * FROM LOAISP_SP
XEM THÔNG TIN TRO GIUP VE VIWE
SP_HELPTEXT LOAISP_SP
2) Tạo view List_Product_view chứa danh sách các
sản phẩm dạng hộp (box) có đơn giá > 16,
thông tin gồm ProductID, ProductName, UnitPrice,
QuantityPerUnit, COUNT of OrderID
3) Tạo view vw_CustomerTotals hiển thị
tổng tiền bán được từ mỗi khách hàng theo
Trang 2DE MA HOA CAU LENH
ON O.ORDERID = OD.ORDERID
GROUP BY CUSTOMERID, YEAR(ORDERDATE),
MONTH(ORDERDATE)
SP_HELPTEXT HD_KH
4) Tạo view trả về tổng số lượng sản phẩm
bán được của mỗi nhân viên (Employee)
theo từng năm
Thông tin gồm EmployeeID, OrderYear, sumOfOrderQuantity
5) Tạo view ListCustomer_view chứa danh sách
các khách hàng có trên 5 hóa đơn đặt hàng từ
năm 1997 đến 1998, thông tin gồm mã khách
(CustomerID) , họ tên (CompanyName),
Số hóa đơn (CountOfOrders)
6) Tạo view ListProduct_view chứa danh sách những sản phẩm nhóm Beverages và Seafood có tổng số lượng bán trong mỗi năm trên 30 sản phẩm, thông tin gồm
CategoryName, ProductName, Year, SumOfOrderQuantity
7) Tạo view vw_OrderSummary với từ khóa
WITH ENCRYPTION gồm OrderYear (năm của ngày lập hóa đơn), OrderMonth (tháng của ngày lập hóa đơn), OrderTotal (tổng tiền, =UnitPrice*Quantity) Sau đó xem thông tin và trợ giúp về mã lệnh của view này
8) Tạo view vwProducts với từ khóa
WITH SCHEMABINDING gồm
ProductID, ProductName, Discount
Xem thông tin của View
Xóa cột Discount Có xóa được không? Vì sao?
9) Tạo view vw_Customer với từ khóa
WITH CHECK OPTION chỉ chứa các khách hàng
Trang 3ở thành phố London và Madrid, thông tin gồm:
CustomerID, CompanyName, City
CREATE VIEW C9
AS
SELECT CustomerID, CompanyName, City
FROM CUSTOMERS
WHERE CITY ='LONDON'
WITH CHECK OPTION
SELECT * FROM C9
SP_HELPTEXT C9
SELECT * FROM CUSTOMERS
a Chèn thêm một khách hàng mới không ở
thành phố London và Madrid thông qua view vừa tạo
Có chèn được không? Giải thích
INSERT C9(CUSTOMERID, COMPANYNAME, CITY)
VALUES (3333,'YYUUJK','LONDON')
SELECT * FROM C9
SELECT * FROM CUSTOMERS
b Chèn thêm một khách hàng mới ở thành phố London và một khách hàng mới ở thành phố Madrid Dùng câu lệnh select trên bảng Customers để xem kết quả
DROP TABLE DONVI
DROP TABLE NHANVIEN
CREATE TABLE donvi
( madv INT PRIMARY KEY,
tendv NVARCHAR(30) NOT NULL,
dienthoai NVARCHAR(10) NULL
)
CREATE TABLE nhanvien
( manv NVARCHAR(10) PRIMARY KEY,
hoten NVARCHAR(30) NOT NULL,
ngaysinh DATETIME NULL,
diachi NVARCHAR(50) NULL,
madv INT FOREIGN KEY
REFERENCES donvi(madv)
ON DELETE CASCADE
ON UPDATE CASCADE
)
Ví dụ: Xét định nghĩa hai bảng DONVI và NHANVIEN như sau:
Insert into DonVi (Madv, Tendv, DienThoai) values (1,'P.Kinh doanh','822321')
Trang 4Insert into DonVi (Madv, Tendv, DienThoai) values (2,'Tiep thi','822012')
Insert into nhanvien(manv,hoten,ngaysinh,diachi,madv) Values('NV01','Tran Van A','3/2/1975','77 Tran Phu',1)
Insert into nhanvien(manv,hoten,ngaysinh,diachi,madv) Values('NV02','Mai Thi Bich','13/2/1977','17 Nguyen Hue',2)
Insert into nhanvien(manv,hoten,ngaysinh,diachi,madv) Values('NV03','Le Van Ha','3/2/1973','12 Tran Phu',2)
SELECT * FROM DONVI
SELECT * FROM NHANVIEN
INSERT INTO nv11 VALUES('NV04','Le Thi D',1)
SELECT * FROM NHANVIEN
CREATE VIEW nv21
AS
SELECT manv,hoten,YEAR(ngaysinh) AS namsinh,
madv FROM nhanvien
GO
SELECT * FROM NV21
INSERT INTO nv21(manv,hoten,madv)
VALUES('NV05','Le Van E',1)
SELECT * FROM NHANVIEN
INSERT INTO nv21
VALUES('NV06','Le Van F',1999,1)
Create Table KH_BAC
(Makh int, TenKh Nchar(30),
Khuvuc Nvarchar(30) NOT NULL
CHECK (Khuvuc='Bac bo'),
PRIMARY KEY (Makh, Khuvuc)
)
Create Table KH_TRUNG
(Makh int, TenKh Nchar(30),
Khuvuc Nvarchar(30) NOT NULL
CHECK (Khuvuc='Trung bo'),
PRIMARY KEY (Makh, Khuvuc))
Trang 5Create Table KH_NAM
(Makh int, TenKh Nchar(30),
Khuvuc Nvarchar(30) NOT NULL CHECK (Khuvuc='Nam bo'),
PRIMARY KEY (Makh, Khuvuc)
SELECT * FROM KH_NAM
SELECT * FROM KH_TRUNG
SELECT * FROM KHACHHANG
INSERT Khachhang VALUES (1, 'CDCN4','Nam Bo')
INSERT Khachhang VALUES (1, 'CDCN4','BAC Bo')
SELECT * FROM KH_Nam
select * from dbo.[1v]
VIEW
1) Tạo view vw_Products_Info hiển thị danh sách
các sản phẩm từ bảng Products và bảng Categories
Thông tin bao gồm CategoryName, Description, ProductName,
QuantityPerUnit, UnitPrice, UnitsInStock
CREATE VIEW vw_Products_Info
AS
SELECT CategoryName, Description, ProductName,
QuantityPerUnit, UnitPrice, UnitsInStock
FROM dbo.Categories C JOIN PRODUCTS P
ON C.CATEGORYID =P.CATEGORYID
SELECT * FROM dbo.vw_Products_Info
2) Tạo view List_Product_view chứa danh sách các sản phẩm dạng hộp (box) có đơngiá > 16, thông tin gồm ProductID, ProductName, UnitPrice, QuantityPerUnit, COUNT
of OrderID
3) Tạo view vw_CustomerTotals hiển thị tổng tiền
bán được từ mỗi khách hàng theo tháng và theo năm
Thông tin gồm CustomerID, YEAR(OrderDate) AS OrderYear,
MONTH(OrderDate) AS OrderMonth,
Trang 6DROP VIEW vw_CustomerTotals
CREATE VIEW vw_CustomerTotals
SELECT * FROM vw_CustomerTotals
XEM CODE CUA VIEW
(CompanyName), Số hóa đơn (CountOfOrders)
6) Tạo view ListProduct_view chứa danh sách những sản phẩm nhóm Beverages và Seafood có tổng số lượng bán trong mỗi năm trên 30 sản phẩm, thông tin gồm
CategoryName, ProductName, Year, SumOfOrderQuantity
7) Tạo view vw_OrderSummary với từ khóa
WITH ENCRYPTION gồm OrderYear
(năm của ngày lập hóa đơn), OrderMonth
(tháng của ngày lập hóa đơn), OrderTotal
(tổng tiền, =UnitPrice*Quantity)
Sau đó xem thông tin và trợ giúp về mã lệnh của
view này
Trang 7CREATE VIEW VW_ORDERSUMARY
TU KHOA WITH SCHE
DROP VIEW VWPRODUCTS
CREATE VIEW vwProducts
ALTER TABLE dbo.Products
DROP COLUMN UnitPrice
ProductID, ProductName, Discount
Xem thông tin của View
Xóa cột Discount Có xóa được không? Vì sao?
DROP VIEW vwProducts
CREATE VIEW vwProducts
Trang 8WITH SCHEMABINDING
AS
SELECT P.ProductID, ProductName, Discount
FROM DBO.PRODUCTS P JOIN DBO.[ORDER DETAILS] OD
ON P.PRODUCTID =OD.PRODUCTID
SELECT * FROM vwProducts
ALTER TABLE DBO.[ORDER DETAILS]
DROP COLUMN DISCOUNT
CREATE VIEW CustomerSLD AS
SELECT * FROM Customers WHERE city='LonDon'
Select * from CustomerSLD
SELECT * FROM CUSTOMERS WHERE CUSTOMERID ='3333'
GO
UPDATE CustomersLD SET city='Anh Quoc'
WHERE CustomerID='3333'
DROP VIEW CUSTOMERSLD
ALTER VIEW CustomerSLD AS
SELECT * FROM Customers WHERE city='LonDon'
WITH CHECK OPTION
Select * from CustomerSLD
SELECT * FROM CUSTOMERS WHERE CUSTOMERID ='3333'
GO
UPDATE CustomersLD SET city='Anh Quoc'
WHERE CustomerID='SEVES'
SELECT * FROM CustomersLD
select * from Customers where CustomerID='AROUT'
9) Tạo view vw_Customer với từ khóa WITH CHECK OPTION chỉ chứa các khách hàng ở thành phố London và Madrid, thông tin gồm: CustomerID, CompanyName, City
a Chèn thêm một khách hàng mới không ở thành phố London và Madrid thông qua viewvừa tạo Có chèn được không? Giải thích
b Chèn thêm một khách hàng mới ở thành phố London và một khách hàng mới ở thành phố Madrid Dùng câu lệnh select trên bảng Customers để xem kết quả
CREATE TABLE donvi1
( madv INT PRIMARY KEY,
tendv NVARCHAR(30) NOT NULL,
dienthoai NVARCHAR(10) NULL
Trang 9)
CREATE TABLE nhanvien1
( manv NVARCHAR(10) PRIMARY KEY,
hoten NVARCHAR(30) NOT NULL,
ngaysinh DATETIME NULL,
diachi NVARCHAR(50) NULL,
madv INT FOREIGN KEY
SELECT * FROM DONVI1
SELECT * FROM NHANVIEN1
CREATE VIEW nv1A
AS
SELECT manv,hoten,madv FROM nhanvien1
GO
INSERT INTO nv1A VALUES('NV04','Le Thi D',1)
SELECT * FROM NV1A
SELECT * FROM NHANVIEN1
CREATE VIEW nv2A
Trang 10+convert(char(4),@b)+'='+convert(char(10),@a-@b)Print convert(char(4),@a)+'*'
+convert(char(4),@b)+'='+convert(char(10),@a*@b)
If @b<>0
print convert(char(4),@a)+'/'
+convert(char(4),@b)+'='+convert(char(10),@a/@b)Else
Print 'Khong chia duoc' Thuc thi
EXEC Tong
xem tro giup thu tuc
sp_helptext tong
sua thu tuc
alter PROC Tong
+convert(char(4),@b)+'='+convert(char(10),@a-@b)Print convert(char(4),@a)+'*'
+convert(char(4),@b)+'='+convert(char(10),@a*@b)
If @b<>0
print convert(char(4),@a)+'/'
+convert(char(4),@b)+'='+convert(char(10),@a/@b)Else
Print 'Khong chia duoc' Thuc thi
EXEC Tong
xem tro giup thu tuc
sp_helptext tong
Trang 11Viet thu tuc giai pt bac 1
+convert(char(4),@b)+'='+convert(char(10),@a-@b)Print convert(char(4),@a)+'*'
+convert(char(4),@b)+'='+convert(char(10),@a*@b)
If @b<>0
print convert(char(4),@a)+'/'
+convert(char(4),@b)+'='+convert(char(10),@a/@b)Else
Print 'Khong chia duoc' Thuc thi cach 1
EXEC Tong1 7,9
thuc thi cach 2
declare @a float, @b float
set @a=45
set @b=78
exec Tong1 @a,@b
xem tro giup thu tuc
sp_helptext tong
Trang 12sua thu tuc
alter PROC Tong
+convert(char(4),@b)+'='+convert(char(10),@a-@b)Print convert(char(4),@a)+'*'
+convert(char(4),@b)+'='+convert(char(10),@a*@b)
If @b<>0
print convert(char(4),@a)+'/'
+convert(char(4),@b)+'='+convert(char(10),@a/@b)Else
Print 'Khong chia duoc' Thuc thi
Trang 13exec ptb1a @a,@b
viet thu tục hiển thị
danh sách khách hàng ở thành phô LonDon
alter proc dskhlondon
@tp nvarchar(15)
as
select * from Customers where city =@tp
exec dskhlondon 'ha noi'
tham so dang output
CREATE PROC Tinhtoan
@a int, @b int , @tong int output, @hieu int output, @tich int output, @thuong real output
as
Begin
Set @tong =@a +@bSet @hieu = @a -@bSet @tich = @a *@b
if @b<>0 begin
Set @thuong = @a/@bPrint 'Thuong ='+convert(varchar(10),@thuong)end
else
Print 'Khong chia duoc'
Set @b = @b *100 End
alter PROC Tinhtoan
@a int, @b int , @tong int output
exec Tinhtoan @a,@b,@tong output
print 'tong ='+convert(char(6),@tong)
Trang 14
print 'Tong = ' +convert(char(10),dbo.tong2so())
print 'Tong = ' +convert(char(10),dbo.tong2so())
select dbo.tong2so() as Tong
Viết 1 hàm tinh tien dien, biet sokw tieu thu
Hàm trả về số tiền phải trả= sokw*dongia
Don gia được tính như sau: nếu skw<100, dg =1000,
skw từ 100 đến 150 thì dongia =1200 cho số vượt,
skw>150 thì dongia =1500 cho số vượt
alter function TienDien()
if (@sokw<150)
set @tt=100*1000+(@sokw-100)*1200else
set @tt=100*1000+50*1200+(@sokw-150)*1500return @tt
end
Thưc thi
print 'Tong tien phai tra ='+convert(char(10),dbo.Tiendien())
select dbo.TienDien() as Tientra
sp_helptext tiendien
Trang 15
Ví dụ 2 : Hàm trả về tổng tiền của khách hàng có mã là TOMSP
drop function Tongtien
Create function Tongtien()
Returns money
AS
Begin
Declare @tong money
Select @tong = sum(unitprice*Quantity) from orders o, [Order Details] d
where o.orderid = d.orderid and customerid = 'TOMSP'
Return @tong
End
print 'Tong = ' +convert(char(10),dbo.tongtien())
select dbo.tongtien() as [Tong Tien Cua Khach Hang TOMPS]
Bài tập áp dụng : Hàm trả về thứ bằng tiếng việt
drop function thu
Create function thu(@ngay datetime)
Return @t
end
thuc thi
set dateformat dmy
declare @ngay date
set @ngay ='16/1/1997'
print 'Hom nay la thu ='+dbo.thu(@ngay)
select employeeid, lastname,firstname,birthdate,
dbo.thu(birthdate)
from employees
Trang 162) Viết hàm tên là InstockProd (dạng scalar function) với tham số vào là
@ProductID và @SupplierID Hàm trả về số lượng tồn kho (UnitInStock) của sản phẩm
@ProductID do nhà cung cấp @SupplierID cung cấp
3) Viết hàm tên SalesOfEmp
(dạng scalar function)
trả về tổng doanh thu bán hàng
(SUM(UnitPrice*Quantity))
của một nhân viên trong một tháng tùy ý và
trong một năm tùy ý,
với tham số vào @EmployeeID, @MonthOrder,
declare @tong money
select @tong =sum(unitprice *quantity)
from [order details] od join orders o
print 'tong tien='+convert(char(10),dbo.tongdt(@manv,@thang,@nam))
ham tra ve bang du lieu
select top 1 with ties orderid, tongtien =SUM(unitprice*quantity)
from dbo.[Order Details]
group by orderid
order by tongtien desc
select orderid, tongtien =SUM(unitprice*quantity)
from dbo.[Order Details]
Trang 17group by orderid
having SUM(unitprice*quantity)
>=all( select SUM(unitprice*quantity)
from [Order Details] group by OrderID)
Hàm
Scalar Function:
1) Viết hàm tên CountOfProducts
(dạng scalar function) với tham số @MaNhom,
giá trị truyền vào lấy từ field CategoryID,
hàm trả về số sản phẩm tương ứng với mã nhóm hàng
Áp dụng hàm đã viết vào câu truy vấn liệt kê danh
sách các nhóm hàng cùng với số sản phẩm thuộc mỗi nhóm, thông tin gồm: CategoryID, CategoryName, CountOfProduct.tenham:CountOfProducts
tham so:mã loại CategoryID
tri tra ve: so sp tuong ung
ALTER FUNCTION CountOfProducts(@MALOAI INT)RETURNS INT
AS
BEGIN
DECLARE @SOSP INT
SELECT @SOSP=COUNT (CATEGORYID)
sách các nhóm hàng cùng với số sản phẩm thuộc mỗi nhóm, thông tin gồm: CategoryID, CategoryName, CountOfProduct
SELECT CategoryID, CategoryName,
CountOfProduct=DBO.CountOfProducts(CategoryID)
FROM dbo.Categories
2) Viết hàm tên là InstockProd (dạng scalar function) với tham số vào là @ProductID và @SupplierID
Hàm trả về số lượng tồn kho (UnitInStock)
của sản phẩm @ProductID do nhà cung cấp
Trang 18@SupplierID cung cấp.
TENHAM:InstockProd
THAMSO:@ProductID và @SupplierID
TRẢ VỀ:số lượng tồn kho (UnitInStock)
của sản phẩm @ProductID do nhà cung cấp
DECLARE @SLTON INT
SELECT @SLTON =UnitsInStock
FROM PRODUCTSWHERE PRODUCTID =@MASP AND SUPPLIERID =@MANCCRETURN @SLTON
SELECT DBO.InstockProd(@MASP,@MANCC)AS STTON
3) Viết hàm tên SalesOfEmp (dạng scalar function)
trả về tổng doanh thu bán hàng
(SUM(UnitPrice*Quantity)) của một nhân viên
trong một tháng tùy ý và trong một năm tùy ý,
với tham số vào @EmployeeID, @MonthOrder, @YearOrder
ALTER FUNCTION SALESOFEMP(@MANV INT, @THANG INT,@NAM INT) RETURNS MONEY
Trang 19DECLARE @MANV INT, @T INT, @N INT
4) Viết hàm SumofOrder với hai tham số @thang và
@nam, trả về danh sách các hóa đơn (OrderID)
lập trong tháng và năm được truyền vào từ
2 tham số @thang và @nam, có tổng tiền >5000,
thông tin gồm OrderID, OrderDate, SubTotal,
trong đó SubTotal =sum(Quantity*UnitPrice)
5) Viết hàm tên SumOfProduct với tham số đầu vào là
@MaNCC (SupplierID),
hàm dùng để tính tổng số lượng (SumOfQuantity)
và chiết khấu cao nhất (MaxOfDiscount)
của các sản phẩm do nhà cung cấp @MaNCC cung cấp,
thông tin gồm ProductID, SumOfQuantity, MaxOfDiscount
CREATE FUNCTION SUMOFPRODUCT(@MANCC INT)
SELECT * FROM SUMOFPRODUCT(@MANCC)
6) Viết hàm tên Discount_Func tính số tiền giảm
trên các hóa đơn (OrderID),
thông tin gồm OrderID, Quantity, Discount,
trong đó, Discount được tính như sau:
Trang 20Nếu Quantity< 10 thì Discount=0,
Nếu 10<= Quantity <30 thì Discount = 5% [UnitPrice*Quantity]
Nếu 30<= Quantity <50 thì Discount = 10%[UnitPrice*Quantity]
Nếu Quantity >=50 thì Discount = 15% [UnitPrice*Quantity]
CREATE FUNCTION DISCOUNT_FUNC()
RETURNS TABLE
AS
RETURN SELECT OrderID, Quantity, Discount=CASE
WHEN QUANTITY<10 THEN 0WHEN QUANTITY BETWEEN 10 AND 50 THEN 0.05*(UNITPRICE*QUANTITY)
WHEN QUANTITY BETWEEN 50 AND 100 THEN 0.1*(UNITPRICE*QUANTITY)
ELSE 0.15*(UNITPRICE*QUANTITY)END
FROM [ORDER DETAILS]
THUC THI
SELECT * FROM DISCOUNT_FUNC()
HAM TRA VE TABLE DANG MULTITABLE
Multi statement Table Valued Functions
8) Viết lại các câu 5,6,7 bằng multi-statement table valued function
7) Viết hàm TotalOfEmp với tham số @MonthOrder,
@YearOrder để tính tổng doanh thu của các nhân viên
trong tháng và năm được truyền vào 2 tham số,
thông tin gồm EmployeeID, Total, với Total=Sum(UnitPrice*Quantity)
TEN HAM: TOTALOFEMP
RETURN SELECT EmployeeID, Total=Sum(UnitPrice*Quantity)
FROM dbo.[Order Details] OD JOIN ORDERS O ON OD.ORDERID =O.ORDERIDWHERE MONTH(ORDERDATE)=@THANG AND YEAR (ORDERDATE)=@NAMGROUP BY EmployeeID
THUC THI
DECLARE @T INT, @N INT
SET @T=7
SET @N=1996
SELECT * FROM BAI7(@T,@N)
SELECT * FROM BAI7(6,1997)
CACH 2: DUNG MULTI TABLE