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

Phân tích thiết kế & Triển khai hệ quản trị CSDL pdf

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 (429.61 KB, 20 trang )

PHÂN TÍCH THIẾT KẾ CSDL

USE TuLieuDVTV
GO

SELECT * FROM GioiSinhVat
SELECT * FROM NganhSinhVat
SELECT * FROM LopSinhVat
SELECT * FROM DanhSachDo
SELECT * FROM VungSong
SELECT * FROM ChiTietSinhVat

Lệnh: SELECT (JOIN, GROUP BY, SUB QUERY, )
1. Xuất ra tất cả sinh vật thuộc lớp Thú (LThu)
SELECT CT.MaSinhVat, CT.Ten, CT.TenKhoaHoc, CT.MoiTruongSong, LSV.TenLop
FROM ChiTietSinhVat CT
JOIN LopSinhVat LSV ON CT.MaLop = LSV.MaLop
WHERE LSV.MaLop = 'LThu'
2. Hiển thị những loại sinh vật đang trong tình trạng Nguy cấp (EN)
SELECT CT.MaSinhVat, CT.Ten, CT.TenKhoaHoc, CT.SoLuong, DSD.DoDeDoa
FROM ChiTietSinhVat CT
JOIN DanhSachDo DSD ON CT.MaMucDo = DSD.MaMucDo
WHERE DSD.MaMucDo = 'EN'
3. Hiển thị tất cả những động vật thuộc ngành Động vật có xương sống (DVCXS)
SELECT CT.MaSinhVat, CT.Ten, LSV.TenLop, NSV.TenNganh
FROM ChiTietSinhVat CT
JOIN LopSinhVat LSV ON CT.MaLop = LSV.MaLop
JOIN NganhSinhVat NSV ON LSV.MaNganh = NSV.MaNganh
WHERE NSV.MaNganh = 'DVCXS'
4. Hiển thị những sinh vật thuộc khu vực Nam Mĩ
SELECT CT.MaSinhVat, CT.Ten, CT.TenKhoaHoc, VS.QuocGia, VS.KhuVuc


FROM ChiTietSinhVat CT
JOIN VungSong VS ON CT.MaVung = VS.MaVung
WHERE VS.KhuVuc = N'Nam Mĩ'
5. Hiển thị những sinh vật thuộc lớp Thực vật hai lá mầm (2LMam)
SELECT CT.MaSinhVat, CT.Ten, CT.TenKhoaHoc, LSV.TenLop
FROM ChiTietSinhVat CT
JOIN LopSinhVat LSV ON CT.MaLop = LSV.MaLop
WHERE LSV.MaLop = '2LMam'
Xuất ra tất cả thông tin của sinh vật
SELECT CTSV.MaSinhVat, CTSV.Ten, CTSV.TenKhoaHoc, CTSV.MoiTruongSong, LSV.TenLop,
NSV.TenNganh, GSV.TenGioi,VS.QuocGia, VS.KhuVuc, DSD.DoDeDoa
FROM ChiTietSinhVat CTSV
JOIN VungSong VS ON CTSV.MaVung = VS.MaVung
JOIN DanhSachDo DSD ON CTSV.MaMucDo = DSD.MaMucDo
JOIN LopSinhVat LSV ON CTSV.MaLop = LSV.MaLop
JOIN NganhSinhVat NSV ON LSV.MaNganh = NSV.MaNganh
JOIN GioiSinhVat GSV ON NSV.MaGioi = GSV.MaGioi
GO


Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 1
BÀI TẬP NORTHWIND
NORTHWIND 1
Câu 1: Liệt kê những khách hàng ở thành phố London
SELECT * FROM Customers
WHERE City= 'London'
Câu 2: Liệt kê tất cả các sản phẩm theo thứ tự tăng dần của đơn giá (UnitPrice),
nếu đơn giá trùng nhau thì sắp theo thứ tự giảm dần của số lượng sản phẩm tồn trong
kho (UnitsInStock)
SELECT distinct * FROM Products

Order by UnitPrice ASC, UnitsInStock DESC
Câu 3: Hãy cho biết sản phẩm có giá (UnitPrice) lớn nhất và sản phẩm có giá nhỏ
nhất, sản phẩm có số lượng trong kho (UnitsInStock) nhiều nhất và số lượng trong kho
ít nhất
C2:
SELECT TOP 1 WITH TIES ProductID, ProductName, UnitPrice AS [Giá MAX]
FROM Products
ORDER BY [Giá MAX] DESC
SELECT TOP 1 WITH TIES ProductID, ProductName, UnitPrice AS [Giá MIN]
FROM Products
ORDER BY [Giá MIN] ASC
SELECT TOP 1 WITH TIES ProductID, ProductName, UnitsInStock AS [Số lượng MAX]
FROM Products
ORDER BY [Số lượng MAX] DESC
SELECT TOP 1 WITH TIES ProductID, ProductName, UnitsInStock AS [Số lượng MIN]
FROM Products
ORDER BY [Số lượng MIN] ASC
C3: (Chính xác nhất)
DECLARE @MAXPrice money, @MINPrice money, @MAXStock int, @MINStock int
SELECT @MAXPrice = MAX(UnitPrice) FROM Products
SELECT @MINPrice = MIN(UnitPrice) FROM Products
SELECT @MAXStock = MAX(UnitsInStock) FROM Products
SELECT @MINStock = MIN(UnitsInStock) FROM Products
SELECT * FROM Products WHERE UnitPrice = @MAXPrice
SELECT * FROM Products WHERE UnitPrice = @MINPrice
SELECT * FROM Products WHERE UnitsInStock = @MAXStock
SELECT * FROM Products WHERE UnitsInStock = @MINStock
Câu 4: Cho biết tổng số lương sản phẩm trong kho là bao nhiêu
SELECT SUM(UnitsInStock) AS [Tổng số lượng trong kho]
FROM Products

Câu 5: Trung bình mỗi sản phẩm có giá là bao nhiêu
SELECT CategoryID, AVG(UnitPrice) AS [Giá Trung Bình]
FROM Products
GROUP BY CategoryID
Câu 6: Liệt kê 5 sản phẩm có giá cao nhất
SELECT TOP 5 * FROM Products
ORDER BY UnitPrice DESC
Câu 7: Cho biết mỗi nhà cung cấp (Suppliers) đã cung cấp bao nhiêu sản phẩm (2 cột:
SupplierID, 'so san pham')
SELECT SupplierID, COUNT(ProductID) AS [Số Sản Phẩm]
FROM Products GROUP BY SupplierID
Câu 8: Hiển thị những sản phẩm có đơn vị tính (QuantiyPerUnit) là boxes (Hint: tìm
kiếm tương đối theo QuantityPerUnit)
SELECT * FROM Products
WHERE QuantityPerUnit LIKE('%boxes%')
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 2
Câu 9: Hiện thị những sản phẩm có đơn vị tính (QuantiyPerUnit) là boxes (Hint: tìm
kiếm tương đối theo QuantityPerUnit)
SELECT * FROM Products
WHERE UnitPrice Between 15 and 30
Câu 10: Hiển thị những sản phẩm có mã nhà cung cấp (supplierid) là: 1, 7, 8,
17,18,19, 22
C1:
SELECT * FROM Products
WHERE SupplierID = 1 or SupplierID = 7 or SupplierID = 8 or SupplierID = 17 or
SupplierID = 18 or SupplierID = 19 or SupplierID = 22
C2:
SELECT * FROM Products
WHERE SupplierID IN(1, 7, 8, 17, 18, 19, 22)
Câu 11: Hiển thị những khách hàng có mã số (CustomerID) có ký tự bắt đầu bằng L

SELECT * FROM Customers
WHERE CustomerID LIKE('L%')
Câu 12: Hiển thị những KH có mã số (CustomerID) có ký tự bắt đầu bằng S
SELECT * FROM Customers
WHERE CustomerID LIKE('S%')
Câu 13: Liệt kê những KH có Address có ký tự bắt đầu bằng con số
SELECT * FROM Customers
WHERE LEFT([Address], 1) between 0 and 9
> sẽ có lỗi, do một vài address la NULL
WHERE LEFT([Address], 1) between '0' and '9'
Câu 14: Liệt kê những KH có Address có ký tự bắt đầu bằng chữ cái
SELECT * FROM Customers
WHERE LEFT([Address], 1) between 'a' and 'z'
NORTHWIND 2
Câu 3:
SELECT distinct City
FROM Customers
Câu 4:
SELECT UnitPrice, UnitsInStock
FROM Products
ORDER By UnitPrice DESC, UnitsInStock DESC
Câu 5:
SELECT * FROM Orders
WHERE Freight < 50
Câu 6:
SELECT * FROM Employees
WHERE City = 'London'
Câu 7:
SELECT * FROM Employees
WHERE LEFT(FirstName, 1) = 'A'

Câu 8:
SELECT * FROM Employees
WHERE YEAR(BirthDate) between 1950 and 1960
Câu 9: (Chưa được)
SELECT * FROM Shippers
Câu 10:
SELECT * FROM Employees
WHERE RIGHT(HomePhone, 4) = 4444
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 3
Câu 11:
SELECT * FROM Employees
WHERE City = 'Tacoma' or City = 'Seattle'
Câu 12:
SELECT * FROM Employees
WHERE TitleOfCourtesy = 'Mr.' or TitleOfCourtesy = 'Ms.'
Câu 13:
SELECT * FROM Suppliers
WHERE Fax is not null and SupplierID between 5 and 20
Câu 14:
SELECT * FROM Suppliers
WHERE Country IN ('GERMANY', 'AUSTRALIA', 'DENMARK')
AND Region IS NULL IS NOT NULL
Câu 15:
SELECT * FROM Suppliers
WHERE (SupplierID between 5 and 20) and Country != 'Germany'
Câu 16:
SELECT * FROM Suppliers
WHERE SupplierID not between 10 and 20
Câu 17:
SELECT * FROM Products

WHERE UnitPrice < 20 and UnitsInStock > 30
Câu 18
SELECT * FROM Products
WHERE CategoryID = 1 and ProductName != 'Chang'
Câu 19:
SELECT CategoryName, P.*
FROM Categories JOIN Products P ON Categories.CategoryID = P.CategoryID
WHERE CategoryName = 'SEAFOOD'
Câu 20:
SELECT ProductID, ProductName, QuantityPerUnit, UnitsInStock, CategoryName, P.*
FROM Categories JOIN Products P ON Categories.CategoryID = P.CategoryID
WHERE CategoryName = 'Confections' and
(QuantityPerUnit LIKE('%boxes%') or QuantityPerUnit LIKE('%bags%'))
Câu 21:
SELECT * FROM Products
WHERE ProductName LIKE('%Chef%')
Câu 22: Tìm sản phẩm có tên bắt đầu là ‘Queso’ và kết thúc là chuỗi 'Pastora' trong
table Products
SELECT * FROM Products
WHERE ProductName LIKE('Queso%Pastora')
Câu 23:
SELECT R.RegionID, R.RegionDescription, COUNT(T.TerritoryDescription) AS
TerriotoryPerRegion
FROM Region R JOIN Territories T ON T.RegionID = R.RegionID
GROUP BY R.RegionID, R.RegionDescription
Câu 24:
SELECT CustomerID, COUNT(Fax) FROM Customers
WHERE Fax IS NULL
GROUP BY CustomerID
Câu 25:

SELECT *
FROM Customers
WHERE LEN(CompanyName) < 10
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 4
Cầu 26:
SELECT * FROM [Order Details]
ORDER BY UnitPrice ASC, Quantity DESC
Câu 27:
SELECT ProductID, MAX(UnitPrice) AS MAX_UnitPrice, MAX(Quantity) AS MAX_Quantity
FROM [Order Details]
GROUP BY ProductID
Câu 28:
SELECT AVG(UnitPrice) AS [Giá trị trung bình]
FROM [Order Details]
Câu 30:
SELECT TOP 1 WITH TIES CategoryID, MIN(UnitsInStock) AS [MIN UnitsInStock]
FROM Products
GROUP BY CategoryID
ORDER BY [MIN UnitsInStock] ASC
Câu 31:
SELECT P.CategoryID, AVG(UnitPrice) AS [AVG UnitPrice]
FROM Products P JOIN Categories C ON P.CategoryID = C.CategoryID
GROUP BY P.CategoryID
HAVING AVG(UnitPrice) between 20 and 30
Câu 32:
SELECT CategoryName, AVG(UnitPrice) AS [AVG UnitPrice]
FROM Products P JOIN Categories C ON P.CategoryID = C.CategoryID
WHERE CategoryName = 'Seafood'
GROUP BY CategoryName
HAVING CategoryName = 'Seafood'

Câu 33: Trong bảng Orders hãy cho biết tổng giá trị cột Freight của những
EmployeeID nào có ít hơn 50 OrderID.
SELECT EmployeeID, SUM(Freight) AS [SUM Freight]
FROM Orders
GROUP BY EmployeeID
HAVING COUNT(OrderID) < 50
ORDER BY EmployeeID ASC
Câu 34: Hãy cho biết những mã EmployeeID nào có hơn 50 OrderID
SELECT EmployeeID, COUNT(OrderID) AS [Quantity Orders]
FROM Orders
GROUP BY EmployeeID
HAVING COUNT(OrderID) > 50
Câu 35: Tính tổng cột UnitsInStock trong table Products của những CategoryName bắt
đầu với ký tự 'C'
SELECT CategoryName, SUM(UnitsInStock) AS [MAX UnitsInStock]
FROM Products P JOIN Categories C ON P.CategoryID = C.CategoryID
GROUP BY CategoryName
HAVING LEFT(CategoryName, 1) = 'C'
HAVING CategoryName LIKE('C%')
Câu 36: Tổng giá trị cột UnitInStock và trung bình cột UnitPrice của những
suppliers ID có ProductID < 10 (loại mặt hàng có ít hơn 10 sản phẩm)
SELECT CategoryID,
SUM(UnitsInStock) AS 'SUM UnitsInStock',
AVG(UnitPrice) AS [AVG_UnitPrice]
FROM Products
WHERE ProductID < 10
GROUP BY CategoryID
HAVING SUM(UnitsInStock) > 20 and AVG(UnitPrice) > 20
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 5
Câu 37: Trong table Employees, hãy cho biết thành phố nào có nhiều nhân viên nhất

và số lượng là bao nhiêu
SELECT TOP 1 WITH TIES City, COUNT(EmployeeID) AS [MaxEmployeeInCity]
FROM Employees
GROUP BY City
ORDER BY MaxEmployeeInCity DESC
Câu 38: Trong table Employees, hãy cho biết các thành phố có ít nhân viên nhất và
số lượng nhân viên là bao nhiêu
SELECT TOP 1 WITH TIES City, COUNT(EmployeeID) AS [MinEmployeeInCity]
FROM Employees
GROUP BY City
ORDER BY MinEmployeeInCity ASC
Câu 39: Dùng table Customers và hiển thị các cột: CustomerID, CompanyName, Phone
với điều kiện chỉ hiển thị 8 ký tự cuối của số phone, đối với cột Fax thì record Cnào
có giá trị NULL thì thay thế bằng từ 'UnAvailable', những record có chứa mã vùng
trong cặp dấu ngoặc () thì phân thành 'Type1', còn lại là 'Type2'
SELECT CustomerID, CompanyName, Phone,
CASE Fax: khi đặt field ở đây, ta không thể dùng hàm được
WHEN Fax IS NULL THEN 'UnAvailable'
WHEN Fax LIKE('%(%)%') THEN 'Type1'
ELSE 'Type2'
END AS [Loại FAX]
FROM Customers
Câu 40: Hãy đánh giá UnitPrice của sản phẩm trong table Products theo 3 mức
/*
_ Dưới 50 là: ‘Cheap Price’
_ Từ 50 đến 200 là ‘Medium Price’
_ Trên 200 là ‘Expensive price’
_ Nếu không có giá thì là ‘Have no price yet’
*/
SELECT ProductID, ProductName, UnitPrice,

CASE
WHEN UnitPrice < 50 THEN 'CHEAP PRICE'
WHEN UnitPrice < 200 THEN 'MEDIUM PRICE'
WHEN UnitPrice >= 200 THEN 'EXPENSIVE PRICE'
ELSE 'HAVE NO PRICE YET'
END AS [Đơn Giá]
FROM Products
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 6
TRIỂN KHAI HỆ QUẢN TRỊ CSDL
Lệnh: VIEW, STORE PROCEDURE (PROC), FUNCTIONS, TRIGGERS
I - VIEW:
Câu 1: Tạo View tên vChiTietSinhVat, xuất ra danh sách các loài Động vật – Thực vật
CREATE VIEW vChiTietSinhVat
AS
SELECT * FROM ChiTietSinhVat
GO
SELECT * FROM vChiTietSinhVat
GO
Câu 2:Tạo View tên vChiTietSinhVat_DV, xuất danh sach sinh vật thuộc giới 'Động
Vật'
Create view VChiTietSinhVat_DV
AS
Select CTSV.MaSinhVat,CTSV.Ten,CTSV.TenKhoaHoc,
LSV.TenLop, NSV.TenNganh,GSV.TenGioi
from ChiTietSinhVat CTSV
JOIN LopSinhVat LSV ON CTSV.MaLop = LSV.MaLop
JOIN NganhSinhVat NSV ON LSV.MaNganh = NSV.MaNganh
JOIN GioiSinhVat GSV ON GSV.MaGioi = NSV.MaGioi
where GSV.TenGioi = N'Động vật'
GO

SELECT * FROM vChiTietSinhVat_DV
GO
Câu 3: Update thông tin của loài sinh vật bất kì thông qua vChiTietSinhVat
UPDATE vChiTietSinhVat SET MaVung = '4'
WHERE MaSinhVat = 'DV0010'
GO
SELECT * FROM vChiTietSinhVat
GO
Câu 4:Tạo View tên vChiTietSinhVat_MTSong_SL, xuất danh sách sinh vật có MTSong
chứa chuỗi "Rừng rậm" và SoLuong >= 500
CREATE View vChiTietSinhVat_MTSong_SL
AS
Select Ten,TenKhoaHoc,MoiTruongSong,SoLuong from ChiTietSinhVat
Where MoiTruongSong like N'%Rừng rậm%' and SoLuong >= 500
GO
SELECT * FROM vChiTietSinhVat_MTSong_SL
GO
Câu 5: Tạo View tên vChiTietSinhVat_KV, xuất danh sách sinh vật có KhuVuc chứa
chuỗi "Đông" (vd: Đông Nam Á, Đông Âu,…)
CREATE VIEW vChiTietSinhVat_KV
AS
SELECT CTSV.MaSinhVat, CTSV.Ten, CTSV.MaVung, VS.KhuVuc
FROM ChiTietSinhVat CTSV JOIN VungSong VS ON CTSV.MaVung = VS.MaVung
WHERE VS.KhuVuc LIKE(N'%Đông%')
GO
SELECT * FROM vChiTietSinhVat_KV
GO
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 7
II - STORE PROCEDURE:
Câu 1: Tạo SP tên spSinhVat_SL_NSV, xuất ra danh sách sinh vật thuộc ngành "Động

vật có xương sống" với số lượng <= 500
CREATE PROC spSinhVat_SL_NSV
@MaNganh varchar(10),
@SoLuong int
AS
BEGIN
SELECT CTSV.Ten, CTSV.TenKhoaHoc, CTSV.SoLuong, LSV.TenLop, NSV.TenNganh
FROM ChiTietSinhVat CTSV
JOIN LopSinhVat LSV ON CTSV.MaLop = LSV.MaLop
JOIN NganhSinhVat NSV ON LSV.MaNganh = NSV.MaNganh
WHERE CTSV.SoLuong <= @SoLuong and NSV.MaNganh = @MaNganh
END
GO
EXEC spSinhVat_SL_NSV 'DVCXS', 500
GO
Câu 2: Tạo SP tên spSinhVat_MucDo, xuất ra MaSinhVat, Ten, DoDeDoa (bảng
DanhSachDo) các loài sinh vật đang trong tình trạng "Nguy cấp" và "Sắp bị đe doạ"
CREATE PROC spSinhVat_MucDo
AS
BEGIN
SELECT CTSV.MaSinhVat, CTSV.Ten, DSD.DoDeDoa
FROM ChiTietSinhVat CTSV
JOIN DanhSachDo DSD ON CTSV.MaMucDo = DSD.MaMucDo
WHERE CTSV.MaMucDo = 'EN' or CTSV.MaMucDo = 'NT'
END
GO
EXEC spSinhVat_MucDo
GO
Câu 3: Tạo SP tên spSinhVat_Ten, xuất ra danh sách sinh vật có Ten bắt đầu bằng 1
kí tự bất kì (@Ten: tham số truyền từ bên ngoài)

CREATE PROC spSinhVat_Ten
@Ten varchar(10)
AS
BEGIN
SELECT * FROM ChiTietSinhVat
WHERE Ten LIKE(@Ten + '%')
END
GO
EXEC spSinhVat_Ten 'K'
GO
Câu 4: Tạo SP tên spSinhVat_SL, xuất ra danh sách sinh vật với số lượng nhập từ bên
ngoài (@SoLuong)
CREATE PROC spSinhVat_SL
@SoLuong int
AS
BEGIN
SELECT * FROM ChiTietSinhVat
WHERE SoLuong < @SoLuong
END
GO
EXEC spSinhVat_SL '500'
GO
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 8
Câu 5: * Tạo SP tên spSinhVat_SL_NSV, xuất ra tổng số lượng sinh vật của tất cả
ngành sinh vật (dùng SubQuery)
CREATE PROC spSinhVat_SL_NSV
AS
SELECT N.TenNganh, SUM([Số Lượng Lớp]) AS [Số Lượng SV trong Ngành]
FROM LopSinhVat L
JOIN NganhSinhVat N ON L.MaNganh = N.MaNganh

JOIN (
SELECT L.TenLop, COUNT(CT.MaSinhVat) AS [Số Lượng Lớp]
FROM ChiTietSinhVat CT JOIN LopSinhVat L ON CT.MaLop = L.MaLop
GROUP BY L.TenLop
) AS SUB ON L.TenLop = SUB.TenLop
GROUP BY N.TenNganh
GO
EXEC spSinhVat_SL_NSV
GO
Câu 6: Tạo SP tên spSinhVat_Update thực hiện cập nhật Ten, TenKhoaHoc, MaLop,
MaVung, MTSong, KichThuoc, SoLuong, MaMucDo của sinh vật có MaSinhVat bất kí (tham số
từ bên ngoài)
CREATE PROC spSinhVat_Update
@MaSinhVat varchar(10), @Ten nvarchar(50), @TenKhoaHoc varchar(50),
@MaLop varchar(50), @MaVung int, @MoiTruongSong nvarchar(50),
@KichThuocTB nvarchar(50), @SoLuong int, @MaMucDo varchar(10)
AS
BEGIN
UPDATE ChiTietSinhVat
SET Ten=@Ten, TenKhoaHoc=@TenKhoaHoc, MaLop=@MaLop,
MaVung=@MaVung, MoiTruongSong=@MoiTruongSong, KichThuocTB=@KichThuocTB,
SoLuong=@SoLuong, MaMucDo=@MaMucDo
WHERE MaSinhVat=@MaSinhVat
END
GO
EXEC spSinhVat_Update 'DV0001', N'Con Khỉ', 'Monkey', 'LThu', 2, N'Trong Rừng', N'Khá
là nhỏ', 20000, 'LC'
GO
Câu 7: Tạo SP tên spSinhVat_Insert thực hiện thêm vào một sinh vật (tham số từ bên
ngoài)

CREATE PROC spSinhVat_Insert
@MaSinhVat varchar(10), @Ten nvarchar(50), @TenKhoaHoc varchar(50),
@MaLop varchar(50), @MaVung int,@MoiTruongSong nvarchar(50),
@KichThuocTB nvarchar(50), @SoLuong int, @MaMucDo varchar(10)
AS
BEGIN
INSERT INTO ChiTietSinhVat
VALUES (@MaSinhVat, @Ten, @TenKhoaHoc, @MaLop, @MaVung,
@MoiTruongSong, @KichThuocTB, @SoLuong, @MaMucDo)
END
GO
EXEC spSinhVat_Insert 'DV0014', N'Con Mèo', 'TomCat', 'LThu', 2, N'Trong Nhà', N'Vô
số kể', NULL, 'LC'
GO
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 9
III - FUNCTIONS:
Câu 1: Viết hàm trả về danh sách sinh vật, có SoLuong NULL được thay bằng chuỗi
"N/A"
CREATE FUNCTION fcSinhVat_SL
(@string varchar(10))
RETURNS varchar(10)
AS
BEGIN
IF (@string IS NULL)
SET @string = 'N/A'
RETURN @string
END
GO
SELECT MaSinhVat, Ten, TenKhoaHoc, MoiTruongSong,
dbo.fcSinhVat_SL(SoLuong) AS [SoLuong], MaMucDo

FROM ChiTietSinhVat
GO
Câu 2: Viết hàm trả về bảng dữ liệu gồm các sinh vật sống ở "Đông Nam Á"
CREATE FUNCTION fcSinhVat_VS
(@KhuVuc nvarchar(50))
RETURNS TABLE
AS
RETURN
(
SELECT CT.MaSinhVat, CT.Ten, CT.TenKhoaHoc, VS.*
FROM ChiTietSinhVat CT JOIN VungSong VS ON CT.MaVung = VS.MaVung
WHERE KhuVuc = @KhuVuc
)
GO
SELECT * FROM fcSinhVat_VS(N'Đông Nam Á')
GO
Câu 3: Viết hàm xuất ra phẩn tên đầu tiên của sinh vật (vd: Khỉ mặt đỏ -> Khỉ)
C1: Xuất Table
CREATE FUNCTION fcSinhVat_Ten01()
RETURNS TABLE
AS
RETURN
(
SELECT MaSinhVat, Ten, LEFT(Ten, CHARINDEX(' ', Ten) -1) AS
[TenThuongGoi],
TenKhoaHoc, MaVung, SoLuong, MaMucDo
FROM ChiTietSinhVat
)
GO
SELECT * FROM fcSinhVat_Ten01()

GO
C2: Xuất giá trị
CREATE FUNCTION fcSinhVat_Ten02
(@Ten nvarchar(50))
RETURNS nvarchar(50)
AS
BEGIN
DECLARE @TenThuongGoi nvarchar(50)
SELECT @TenThuongGoi = LEFT(@Ten, CHARINDEX(' ', @Ten) -1)
RETURN @TenThuongGoi
END
GO
SELECT MaSinhVat, Ten, dbo.fcSinhVat_Ten02(Ten) AS TenThuongGoi,
TenKhoaHoc, MaVung, SoLuong, MaMucDo
FROM ChiTietSinhVat
GO
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 10
Câu 5: Viết hàm xuất ra các sinh vật thuộc một lớp nào đó (xuất thêm TenLop)
CREATE FUNCTION fcSinhVat_LopSV
(@MaLop varchar(10))
RETURNS TABLE
AS
RETURN
(
SELECT CT.MaSinhVat, CT.Ten, CT.MaLop, L.TenLop, CT.MaMucDo
FROM ChiTietSinhVat CT JOIN LopSinhVat L ON CT.MaLop = L.MaLop
WHERE L.MaLop = @MaLop
)
GO
SELECT * FROM fcSinhVat_LopSV('2LMam')

GO
IV - TRIGGERS:
Câu 1: Tạo Trigger không cho phép xoá cùng lúc hơn 2 dữ liệu trong bảng
ChiTietSinhVat
CREATE TRIGGER TG_D_SinhVat
ON ChiTietSinhVat
FOR DELETE
AS
BEGIN
IF (SELECT COUNT(*) FROM DELETED) > 2
BEGIN
RAISERROR('Không được xoá cùng lúc hơn 2 sản phẩm', 16, 1)
ROLLBACK TRAN
END
END
GO
Kiểm tra:
INSERT INTO ChiTietSinhVat
VALUES ('DV0013', N'Khủng long phiến sừng', 'Stegosaurs', 'LBSat', 1, NULL,
N'Lưng có vãy chắc cứng', NULL, 'EX'),
('DV0014', N'Khủng long sừng', 'Ceratopsia', 'LBSat', 1, NULL, N'To, đầu
nặng và có sừng', NULL, 'EX'),
('DV0015', N'Khủng long bọc giáp', 'Ankylosauria', 'LBSat', 1, NULL,
N'Toàn thân được bọc giáp cứng và nặng', NULL, 'EX')
GO
SELECT * FROM ChiTietSinhVat
DELETE FROM ChiTietSinhVat WHERE MaSinhVat = 'DV0015'
GO OK
DELETE FROM ChiTietSinhVat
GO Lỗi

Câu 2: Tạo Trigger lưu lại việc Update dữ liệu bảng ChiTietSinhVat, thông tin
Update được lưu trong bảng Backup_ChiTietSinhVat (có cấu trúc tương tự)
CREATE TABLE Backup_ChiTietSinhVat
(
MaSinhVat varchar(10), Primary Key NOT NULL,
Ten nvarchar(50),
TenKhoaHoc varchar(50),
MaLop varchar(10), Foreign Key references LopSinhVat(MaLop),
MaVung int, Foreign Key references VungSong(MaVung),
MoiTruongSong nvarchar(50),
KichThuocTB nvarchar(50),
SoLuong int,
MaMucDo varchar(10) Foreign Key references DanhSachDo(MaMucDo)
)
GO
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 11
CREATE TRIGGER TG_U_SinhVat
ON ChiTietSinhVat
FOR UPDATE
AS
BEGIN
DECLARE @MaSinhVat varchar(10), @Ten nvarchar(50), @TenKhoaHoc varchar(50),
@MaLop varchar(10), @MaVung int, @MoiTruongSong nvarchar(50),
@KichThuocTB nvarchar(50), @SoLuong int, @MaMucDo varchar(10)
SELECT @MaSinhVat = MaSinhVat, @Ten = Ten, @TenKhoaHoc = TenKhoaHoc,
@MaLop = MaLop, @MaVung = MaVung, @MoiTruongSong = MoiTruongSong,
@KichThuocTB = KichThuocTB, @SoLuong = SoLuong, @MaMucDo = MaMucDo
FROM DELETED
INSERT INTO Backup_ChiTietSinhVat
VALUES (@MaSinhVat, @Ten, @TenKhoaHoc, @MaLop, @MaVung,

@MoiTruongSong, @KichThuocTB, @SoLuong, @MaMucDo)
END
GO
UPDATE ChiTietSinhVat SET TenKhoaHoc = 'Nodosauridae'
WHERE MaSinhVat = 'DV0015'
GO
Câu 3: Tạo Trigger lưu lại việc xoá thông tin trong bảng ChiTietSinhVat, thông tin
được lưu vào bảng Deleted_ChiTietSinhVat có cấu trúc: MaSinhVat, Ten, MaVung, MaMucDo
CREATE TABLE Deleted_ChiTietSinhVat
(
MaSinhVat varchar(10), Primary Key,
Ten nvarchar(50),
MaVung int, Foreign Key references VungSong(MaVung),
MaMucDo varchar(10) Foreign Key references DanhSachDo(MaMucDo)
)
GO
CREATE TRIGGER TG_D_SinhVat_Backup
ON ChiTietSinhVat
FOR DELETE
AS
BEGIN
DECLARE @MaSinhVat varchar(10), @Ten nvarchar(50),
@MaVung int, @MaMucDo varchar(10)
SELECT @MaSinhVat = MaSinhVat, @Ten = Ten,
@MaVung = MaVung, @MaMucDo = MaMucDo
FROM DELETED
INSERT INTO Deleted_ChiTietSinhVat
VALUES (@MaSinhVat, @Ten, @MaVung, @MaMucDo)
END
GO

DELETE FROM ChiTietSinhVat WHERE MaSinhVat = 'DV0014'
GO
Câu 4: Tạo Trigger khi xoá dữ liệu trong bảng ChiTietSinhVat thì dữ liệu trong bảng
Backup_ChiTietSinhVat cũng được xoá theo.
CREATE TRIGGER TG_D_XoaHet
ON ChiTietSinhVat
INSTEAD OF DELETE
AS
BEGIN
DELETE FROM Backup_ChiTietSinhVat
WHERE MaSinhVat IN
( SELECT MaSinhVat FROM DELETED )
DELETE FROM ChiTietSinhVat
WHERE MaSinhVat IN
( SELECT MaSinhVat FROM DELETED )
END
GO
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 12
MỘT SỐ BÀI LAB
SELECT:
USE Northwind
Tạo ra bảng mới từ bảng đã có
SELECT EmployeeID, (FirstName + ' ' + LastName) AS FullName
INTO NewEmployees
FROM Employees
Tạo bảng thành một biến cục bộ
SELECT EmployeeID, (FirstName + ' ' + LastName) AS FullName
INTO #NewEmployees1
FROM Employees Emp
Tạo bảng mới bằng WITH

WITH Emp(EmployeeID, Firstname, Lastname)
AS
(
SELECT EmployeeID, FirstName, LastName
FROM Employees
)
SELECT * FROM Emp
Các Hàm Thống Kế
/*Hàm GROUP BY
SELECT DS Các Cột | Hàm Thống Kê AS Bí Danh
FROM TenBang
[WHERE điều kiện lọc]
GROUP BY Danh sách cột nhóm
[ORDER BY ]
*/
Ví dụ: cần đếm số nhân viên ở các quốc gia
SELECT Country, COUNT(EmployeeID) AS 'Số Người'
FROM Employees
GROUP BY Country
SELECT City, COUNT(EmployeeID) AS 'Số Người'
FROM Employees
GROUP BY City
ORDER BY City ASC, [Số Người] DESC
HAVING
SELECT City, COUNT(EmployeeID) AS 'Số Người'
FROM Employees
GROUP BY City
HAVING COUNT(EmployeeID) > 1
ORDER BY City ASC, [Số Người] DESC
Lấy ra tổng thành tiền của từng hóa đơn, với mức giảm giá cho trc

SELECT OrderID, SUM(UnitPrice * Quantity * (1 - Discount)) AS [Tổng Số Tiền]
FROM [Order Details]
GROUP BY OrderID
Lấy ra tổng thành tiền của từng hóa đơn, với mức giảm giá cho trc và có điều kiện
SELECT OrderID, SUM(UnitPrice * Quantity * (1 - Discount)) AS [Tổng Số Tiền]
FROM [Order Details]
GROUP BY OrderID
HAVING SUM(UnitPrice * Quantity * (1 - Discount)) > 10000
Lấy ra những hoá đơn được đặt vào năm 1996
SELECT P.ProductName, O.OrderID, O.OrderDate
FROM Products P
JOIN [Order Details] OD ON P.ProductID = OD.ProductID
JOIN Orders O ON OD.OrderID = O.OrderID
WHERE YEAR(O.OrderDate) = 1996
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 13
Lấy ra tổng thành tiền của từng hóa đơn, với mức giảm giá cho trc, có điều kiện và
tên các employee
WITH HOADON(OrderID, [Tổng Tiền])
AS
(
SELECT od.OrderID,
SUM(UnitPrice * Quantity * (1 - Discount)) AS [Tổng Số Tiền]
FROM [Order Details] OD
Không cho phép truy cập trực tiếp nên không JOIN ở đây
INNER JOIN Orders O ON OD.OrderID = O.OrderID
INNER JOIN Employees Emp ON O.EmployeeID = Emp.EmployeeID
GROUP BY OrderID
HAVING SUM(UnitPrice * Quantity * (1 - Discount)) > 10000
)
SELECT hd.*, (Emp.FirstName + ' ' + Emp.LastName) AS FullName

FROM HOADON hd
JOIN Orders O ON hd.OrderID = O.OrderID
JOIN Employees Emp ON O.EmployeeID = Emp.EmployeeID
Constraint PrimaryKey:
CREATE TABLE ChiTietSach
(
IDSach int foreign key references SACH(ID),
IDTacGia int foreign key references TACGIA(ID),
Constraint PK_SachTacGia Primary Key(IDSach, IDTacGia)
)
Để tắt chế độ identity tự điền ID không bắt đầu từ 1
SET IDENTITY_INSERT SACH ON
INSERT INTO SACH(ID, TenSach)
VALUES (1, N'Ngôn ngữ cơ thể'),
(2, N'Kĩ năng giao tiếp'),
(3, N'Thuyết tán gái')
SET IDENTITY_INSERT SACH OFF
SET IDENTITY_INSERT TACGIA ON
INSERT INTO TACGIA(ID, TenTacGia)
VALUES (1, N'Nguyễn Thanh Tuấn'),
(2, N'Võ Thị Thanh Thuỷ'),
(3, N'Nguyễn Đức Duy')
SET IDENTITY_INSERT TACGIA OFF
SubQuery:
Câu 1: Hãy liệt kê những khách hàng (liệt kê hết các cột) có đơn đặt hàng trong
tháng 7 (bất kể năm nào)
SELECT * FROM Customers
WHERE CustomerID IN
(
SELECT CustomerID FROM Orders

WHERE MONTH(OrderDate) = 7
)
Câu 2: Hãy liệt kê những khách hàng (*) có đơn đặt hàng trong khoảng thời gian từ
tháng 7/1996 đến tháng 10/1996
SELECT * FROM Customers
WHERE CustomerID IN
(
SELECT CustomerID FROM Orders
WHERE OrderDate between '7/1/1996' and '10/31/1996'
)
Câu 3: Hãy liệt kê 10 khách hàng có số đơn đặt hàng nhiều nhất
C1:
SELECT TOP 10 WITH TIES CustomerID, COUNT(OD.OrderID) AS [Số Đơn Đặt Hàng]
FROM [Order Details] OD JOIN Orders O ON OD.OrderID = O.OrderID
GROUP BY CustomerID
ORDER BY [Số Đơn Đặt Hàng] DESC
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 14
C2:
SELECT TOP 10 WITH TIES O.CustomerID, SUM([Số Lượng Đơn]) AS [Số Đơn Đặt Hàng]
FROM Orders O
JOIN (
SELECT O.OrderID, COUNT(OD.OrderID) AS [Số Lượng Đơn]
FROM Orders O
JOIN [Order Details] OD ON O.OrderID = OD.OrderID
GROUP BY O.OrderID
) AS SUB ON O.OrderID = SUB.OrderID
GROUP OrID (Orders) lại và COUNT OrID (OrDetails)
để ra được số lượng đơn của mỗi orID
Trong OrDetails có nhiều đơn hàng (OrID)
Sau khi có số lượng đơn, ta lấy ra tổng đơn cũa mỗi OrID (Orders)

Mỗi CustomerID có nhiều đơn hàng (OrID), nên phải dùng hàm tổng
GROUP BY O.CustomerID
ORDER BY [Số Đơn Đặt Hàng] DESC
Câu 4: Hãy liệt kê 10 khách hàng có số tiền mua hàng là nhiều nhất
SELECT TOP 10 WITH TIES O.CustomerID, SUM([Thành Tiền]) AS [Tổng Thành Tiền]
FROM Orders O
JOIN (
SELECT O.OrderID, SUM(OD.Quantity * OD. UnitPrice) AS [Thành Tiền]
FROM Orders O
JOIN [Order Details] OD ON O.OrderID = OD.OrderID
GROUP BY O.OrderID
) AS SUB ON O.OrderID = SUB.OrderID
GROUP BY O.CustomerID
ORDER BY [Tổng Thành Tiền] DESC
Câu 5: Liệt kê danh sách các nhà phân phối nhiều mặt hàng nhất
Câu 6: Tính tổng số lượng các mặt hàng đã bán theo từng nhà cung cấp
C1:
SELECT P.SupplierID, S.CompanyName, SUM(OD.Quantity) AS [Tổng SL MH Đã Bán]
FROM Products P JOIN Suppliers S ON P.SupplierID = S.SupplierID
JOIN [Order Details] OD ON P.ProductID = OD.ProductID
Lấy ra 2 khách hàng không đặt hàng
C1: (không nên dùng)
SELECT CustomerID FROM Customers 91 ROW
EXCEPT Giao 2 bảng lại để dược 2 người không đặt hàng
SELECT CustomerID FROM Orders 89 ROW (có đơn đặt hàng)
C2:
SELECT CustomerID FROM Customers
WHERE CustomerID NOT IN
(
SELECT DISTINCT CustomerID FROM Orders

)
C3:
SELECT C.CustomerID FROM Customers C
WHERE NOT EXISTS
(
SELECT * FROM Orders O
WHERE O.CustomerID = C.CustomerID
)

SELECT * FROM Products
WHERE UnitPrice
> any (
select top 5 UnitPrice
from Products
)
all: lớn hơn tất cả các dữ liệu trong subquery
any: chỉ cần lớn hơn 1 trong các dữ liệu của subquery
order by UnitPrice
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 15
MỘT SỐ HÀM TOÁM THÔNG DỤNG
Hàm làm tròn ROUND:
DECLARE @A float
SET @A = 784.584
SELECT @A AS [Giá Trị A],
ROUND(@A, 3) AS [3],
ROUND(@A, 2) AS [2],
ROUND(@A, 1) AS [1],
ROUND(@A, 0) AS [0],
ROUND(@A, -1) AS [-1],
ROUND(@A, -2) AS [-2],

ROUND(@A, -3) AS [-3]
GO
SELECT 155 AS [Giá Trị],
ROUND(155, -1) AS [-1],
ROUND(145, -2) AS [-2] *KQ đúng là 200, nhưng ROUDND <=0 có đặc điểm cắt
ngang
GO
Các hàm về chuỗi:
Hàm CHAR()
SELECT FirstName + CHAR(32) + LastName
FROM Employees
WHERE EmployeeID = 1
DECLARE @Name nvarchar(50)
SET @Name = N'Nguyễn Thanh Tuấn'
SELECT CHARINDEX(' ', @Name , -1) [Độ dài của chuỗi Họ]
Lấy ra độ dài chuỗi bắt đầu từ 1 kí tự bên trái đến trước khoảng trắng ' '
LEFT(Tên, Độ dài chuỗi cần lấy) ==>
SELECT LEFT(@Name, CHARINDEX(' ', @Name))
Hàm UPPER / LOWER
SELECT UPPER(FirstName) + ' ' + LOWER(LastName)
FROM Employees
WHERE EmployeeID = 1
Hàm LEN
SELECT LEN(FirstName + ' ' + LastName) AS [Độ dài]
FROM Employees
WHERE EmployeeID = 1
Hàm LTRIM / RTRIM
DECLARE @FirstName nvarchar(20),
@LastName nvarchar(20)
SET @FirstName = ' King '

SET @LastName = ' Hero '
SELECT (RTRIM(LTRIM(@FirstName)) + LTRIM(RTRIM(@LastName))) AS [FullName]
Hàm LEFT / RIGHT / SUBSTRING
SELECT LEFT(FirstName, 1) + RIGHT(LastName, 2)
FROM Employees
WHERE EmployeeID = 1
SELECT * FROM Employees
WHERE LEFT(FirstName, 1) = 'M'
SELECT FirstName, SUBSTRING(FirstName, 2, 3)
FROM Employees
WHERE EmployeeID = 4
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 16
Hàm ngày tháng:
Hàm GETDATE
SELECT GETDATE() AS [Ngày và Giờ hiện tại],
CONVERT(date, GETDATE()) AS [Ngày hiện tại],
CONVERT(time, GETDATE()) AS [Giờ hiện tại]
SELECT GETDATE() AS [Ngày và Giờ hiện tại],
DATEPART(YEAR, GETDATE()) AS [Năm],
DATEPART(MONTH, GETDATE()) AS [Tháng],
DATEPART(DAY, GETDATE()) AS [Ngày],
DATEPART(DAYOFYEAR, GETDATE()) AS [Ngày của Năm],
DATEPART(WEEK, GETDATE()) AS [Tuần],
DATEPART(WEEKDAY, GETDATE()) AS [Thứ]
GO
Hàm DATEDIFF(X, Y)
DECLARE @NgaySinh datetime = '1993-12-03';
DECLARE @NgayHomNay datetime = GETDATE();
SELECT DATEDIFF(day, @NgaySinh, @NgayHomNay) AS [Số Ngày],
DATEDIFF(WEEK, @NgaySinh, @NgayHomNay) AS [Số Tuần]

GO
Hàm DAY(), MONTH(), YEAR()
SELECT * FROM Employees
WHERE MONTH(BirthDate) = 12
WHERE YEAR(BirthDate) = 1960
Hàm chuyển đổi CAST() / CONVERT()
DECLARE @NgaySinh datetime = '1993-12-03', @Tuoi int
SET @Tuoi = YEAR(GETDATE()) - YEAR(@NgaySinh)
Print N'KingHero được: ' + CONVERT(varchar(10), @Tuoi) + N' Tuổi'
GO

CASE WHEN, IF ELSE, WHILE,
Cấu trúc CASE WHEN
SELECT EmployeeID, FirstName, LastName,
CASE TitleOfCourtesy
WHEN 'MS.' THEN 'Lady'
WHEN 'DR.' THEN N'Qúy Ông TS'
WHEN 'Mrs.' THEN N'Qúy Bà'
WHEN 'Mr.' THEN 'Quý Ông'
END AS [Danh Xưng]
FROM Employees
Cấu trúc IF ELSE
DECLARE @GT int, @GioiTinh nvarchar(5)
SET @GT = 1
IF (@GT = 1)
SET @GioiTinh = N'Nữ'
ELSE SET @GioiTinh = N'Nam'
SELECT @GioiTinh
GO
Cấu trúc WHILE

DECLARE @A int = 5, @Count int = 0, @KQ int
WHILE (@Count < 10)
BEGIN
SET @Count = @Count + 1
SET @KQ = @A * @Count
Print CONVERT(Char(5), @A) + ' x ' +
CAST(@A AS char(5)) + ' x ' +
CAST(@Count AS char(5)) + ' = ' +
CAST(@KQ AS char(5))
END
GO
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 17
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 18
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 19
Mục lục:
Phân Tích – Thiết Kế CSDL Page 1
Bài tập Nothwind 01 Page 2
Bài tập Nothwind 02 Page 3
Triển Khai Hệ Quản Trị CSDL Page 7
Một số bài lab Page 13
Một số hàm toán thông dụng Page 16
Tóm tắt một số cú pháp SQL thông dụng Page 18
Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page 20

×