Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
400 KB
Nội dung
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 tất 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' Hiển thị loại sinh vật 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' Hiển thị tất độ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' Hiển thị 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ĩ' Hiển thị sinh vật thuộc lớp Thực vật hai 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 tất thông tin 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 BÀI TẬP NORTHWIND NORTHWIND -Câu 1: Liệt kê khách hàng thành phố London SELECT * FROM Customers WHERE City= 'London' Câu 2: Liệt kê tất sản phẩm theo thứ tự tăng dần đơn giá (UnitPrice), đơn giá trùng theo thứ tự giảm dần số lượng sản phẩm tồn 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 sản phẩm có giá nhỏ nhất, sản phẩm có số lượng kho (UnitsInStock) nhiều số lượng kho C2: SELECT TOP WITH TIES ProductID, FROM Products ORDER BY [Giá MAX] DESC SELECT TOP WITH TIES ProductID, FROM Products ORDER BY [Giá MIN] ASC SELECT TOP WITH TIES ProductID, FROM Products ORDER BY [Số lượng MAX] DESC SELECT TOP WITH TIES ProductID, FROM Products ORDER BY [Số lượng MIN] ASC ProductName, UnitPrice AS [Giá MAX] ProductName, UnitPrice AS [Giá MIN] ProductName, UnitsInStock AS [Số lượng MAX] ProductName, UnitsInStock AS [Số lượng MIN] 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 kho SELECT SUM(UnitsInStock) AS [Tổng số lượng kho] FROM Products Câu 5: Trung bình sản phẩm có giá SELECT CategoryID, AVG(UnitPrice) AS [Giá Trung Bình] FROM Products GROUP BY CategoryID Câu 6: Liệt kê sản phẩm có giá cao SELECT TOP * FROM Products ORDER BY UnitPrice DESC Câu 7: Cho biết nhà cung cấp (Suppliers) cung cấp 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ị sản phẩm có đơn vị tính (QuantiyPerUnit) 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 Câu 9: Hiện thị sản phẩm có đơn vị tính (QuantiyPerUnit) 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ị 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 = or SupplierID = or SupplierID = 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ị khách hàng có mã số (CustomerID) có ký tự bắt đầu L SELECT * FROM Customers WHERE CustomerID LIKE('L%') Câu 12: Hiển thị KH có mã số (CustomerID) có ký tự bắt đầu S SELECT * FROM Customers WHERE CustomerID LIKE('S%') Câu 13: Liệt kê KH có Address có ký tự bắt đầu số SELECT * FROM Customers WHERE LEFT([Address], 1) between and > có lỗi, vài address la NULL WHERE LEFT([Address], 1) between '0' and '9' Câu 14: Liệt kê KH có Address có ký tự bắt đầu chữ SELECT * FROM Customers WHERE LEFT([Address], 1) between 'a' and 'z' NORTHWIND -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 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 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 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 = 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 ‘Queso’ kết thúc chuỗi 'Pastora' 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 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 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 cho biết tổng giá trị cột Freight EmployeeID có 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 mã EmployeeID có 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 table Products 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 trung bình cột UnitPrice suppliers ID có ProductID < 10 (loại mặt hàng có 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 Câu 37: Trong table Employees, cho biết thành phố có nhiều nhân viên số lượng SELECT TOP WITH TIES City, COUNT(EmployeeID) AS [MaxEmployeeInCity] FROM Employees GROUP BY City ORDER BY MaxEmployeeInCity DESC Câu 38: Trong table Employees, cho biết thành phố có nhân viên số lượng nhân viên SELECT TOP WITH TIES City, COUNT(EmployeeID) AS [MinEmployeeInCity] FROM Employees GROUP BY City ORDER BY MinEmployeeInCity ASC Câu 39: Dùng table Customers hiển thị cột: CustomerID, CompanyName, Phone với điều kiện hiển thị ký tự cuối số phone, cột Fax record Cnào có giá trị NULL thay từ 'UnAvailable', record có chứa mã vùng cặp dấu ngoặc () phân thành 'Type1', lại 'Type2' SELECT CustomerID, CompanyName, Phone, CASE Fax: đặt field đây, ta dùng hàm 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 sản phẩm table Products theo mức /* _ Dưới 50 là: ‘Cheap Price’ _ Từ 50 đến 200 ‘Medium Price’ _ Trên 200 ‘Expensive price’ _ Nếu khơng có giá ‘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 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 danh sách 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 lồi sinh vật 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" 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 II - STORE PROCEDURE: Câu 1: Tạo SP tên spSinhVat_SL_NSV, xuất danh sách sinh vật thuộc ngành "Động vật có xương sống" với số lượng BEGIN RAISERROR('Không xoá lúc 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 cứng', NULL, 'EX'), ('DV0014', N'Khủng long sừng', 'Ceratopsia', 'LBSat', 1, NULL, N'To, đầu nặng có sừng', NULL, 'EX'), ('DV0015', N'Khủng long bọc giáp', 'Ankylosauria', 'LBSat', 1, NULL, N'Toàn thân bọc giáp cứng 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 liệu bảng ChiTietSinhVat, thông tin Update lưu 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 xố thơng tin bảng ChiTietSinhVat, thơng tin 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 xoá liệu bảng ChiTietSinhVat liệu bảng Backup_ChiTietSinhVat xố theo CREATE TRIGGER TG_D_XoaHet ON ChiTietSinhVat INSTEAD OF DELETE AS BEGIN DELETE FROM Backup_ChiTietSinhVat WHERE MaSinhVat IN ( SELECT MaSinhVat FROM DELETED ) END GO DELETE FROM ChiTietSinhVat WHERE MaSinhVat IN ( SELECT MaSinhVat FROM DELETED ) 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 bảng từ bảng có SELECT EmployeeID, (FirstName + ' ' + LastName) AS FullName INTO NewEmployees FROM Employees Tạo bảng thành biến cục SELECT EmployeeID, (FirstName + ' ' + LastName) AS FullName INTO #NewEmployees1 FROM Employees Emp Tạo 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 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) > ORDER BY City ASC, [Số Người] DESC Lấy tổng thành tiền 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 tổng thành tiền hóa đơn, với mức giảm giá cho trc 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 hoá đơn đặ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 tổng thành tiền hóa đơn, với mức giảm giá cho trc, có điều kiện tên 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 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 SET IDENTITY_INSERT SACH ON SET IDENTITY_INSERT TACGIA ON INSERT INTO SACH(ID, TenSach) INSERT INTO TACGIA(ID, TenTacGia) VALUES (1, N'Ngôn ngữ thể'), VALUES (1, N'Nguyễn Thanh Tuấn'), (2, N'Kĩ giao tiếp'), (2, N'Võ Thị Thanh Thuỷ'), (3, N'Thuyết tán gái') (3, N'Nguyễn Đức Duy') SET IDENTITY_INSERT SACH OFF SET IDENTITY_INSERT TACGIA OFF SubQuery: Câu 1: Hãy liệt kê khách hàng (liệt kê hết cột) có đơn đặt hàng tháng (bất kể năm nào) SELECT * FROM Customers WHERE CustomerID IN ( SELECT CustomerID FROM Orders WHERE MONTH(OrderDate) = ) Câu 2: Hãy liệt kê khách hàng (*) có đơn đặt hàng 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 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 COUNT OrID (OrDetails) để số lượng đơn orID Trong OrDetails có nhiều đơn hàng (OrID) Sau có số lượng đơn, ta lấy tổng đơn cũa 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 nhiều 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 nhà phân phối nhiều mặt hàng Câu 6: Tính tổng số lượng mặt hàng bán theo 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 khách hàng không đặt hàng C1: (không nên dùng) SELECT CustomerID FROM Customers 91 ROW EXCEPT Giao bảng lại để dược 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 UnitPrice from Products ) all: lớn tất liệu subquery any: cần lớn liệu 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 TỐ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 200, ROUDND SELECT LEFT(@Name, CHARINDEX(' ', @Name)) Hàm UPPER / LOWER SELECT UPPER(FirstName) + ' ' + LOWER(LastName) FROM Employees WHERE EmployeeID = Hàm LEN SELECT LEN(FirstName + ' ' + LastName) AS [Độ dài] FROM Employees WHERE EmployeeID = 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 = SELECT * FROM Employees WHERE LEFT(FirstName, 1) = 'M' SELECT FirstName, SUBSTRING(FirstName, 2, 3) FROM Employees WHERE EmployeeID = 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 Giờ tại], CONVERT(date, GETDATE()) AS [Ngày tại], CONVERT(time, GETDATE()) AS [Giờ tại] SELECT GO GETDATE() AS [Ngày Giờ 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 Năm], DATEPART(WEEK, GETDATE()) AS [Tuần], DATEPART(WEEKDAY, GETDATE()) AS [Thứ] 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 = 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 + 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 -Bài tập Nothwind 01 Bài tập Nothwind 02 Triển Khai Hệ Quản Trị CSDL -Một số lab Một số hàm tốn thơng dụng Tóm tắt số cú pháp SQL thông dụng - Phân Tích – Thiết Kế - Triển Khai Hệ Quản Trị CSDL Page Page Page Page Page 13 Page 16 Page 18 Page 20 ... 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. .. 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 TRIỂN KHAI HỆ QUẢN TRỊ CSDL Lệnh: VIEW, STORE PROCEDURE (PROC), FUNCTIONS, TRIGGERS... 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,