Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 13

1. Liệt kê tất cả các mẫu xe màu đỏ.

SELECT Model FROM Cars WHERE Color = 'Red'


2. Tìm tất cả khách hàng ở Hy Lạp.
SELECT * FROM Customers WHERE Country = 'Greece'
3. Liệt kê các đơn đặt xe có ngày trả xe sau ngày 27/5/2014.
SELECT * FROM Rentals WHERE Return_date > '2014-05-27'
4. Tính tổng doanh thu từ các đơn đặt xe trong năm 2014.
SELECT SUM(Amount) FROM Rentals WHERE YEAR(Pick_up_date) = 2014
5. Liệt kê các mẫu xe thuộc hãng Chevrolet.
SELECT Model FROM Cars WHERE Brand = 'Chevrolet'
6. Đếm số lượng khách hàng có email đuôi @gmail.com.
SELECT COUNT(*) FROM Customers WHERE Email LIKE '%@gmail.com'
7. Tìm đơn đặt xe có mức phí cao nhất.
SELECT * FROM Rentals ORDER BY Amount DESC LIMIT 1
8. Liệt kê các mẫu xe màu đen hoặc trắng.
SELECT Model FROM Cars WHERE Color IN ('Black', 'White')
9. Tìm khách hàng có tên bắt đầu bằng 'M'.
SELECT * FROM Customers WHERE First_Name LIKE 'M%'
10. Liệt kê các địa điểm thuê xe ở Canada.
SELECT * FROM Location WHERE Country = 'Canada'
1. Liệt kê tất cả các mẫu xe trong bảng Cars.
SELECT Model FROM Cars
2. Đếm số lượng khách hàng trong bảng Customers.
SELECT COUNT(*) FROM Customers
3. Tìm khách hàng có mã ID là 5.
SELECT * FROM Customers WHERE ID = 5
4. Lấy ra danh sách các quốc gia trong bảng Customers.
SELECT DISTINCT Country FROM Customers
5. Liệt kê các địa điểm ở Canada trong bảng Location.
SELECT * FROM Location WHERE Country = 'Canada'
6. Lấy ra thông tin điện thoại chính của mỗi địa điểm.
SELECT * FROM Location_Phone_Number WHERE Is_MainPhone = 1
7. Tìm các đơn đặt xe có tổng chi phí trên 100 đô la.
SELECT * FROM Rentals WHERE Amount > 100
8. Liệt kê các đơn đặt xe trong tháng 5 năm 2014.
SELECT * FROM Rentals WHERE YEAR(Pick_up_date) = 2014 AND MONTH(Pick_up_date) =
5
9. Đếm số lượng đơn đặt xe của mỗi khách hàng.
SELECT Customer_ID, COUNT(*) FROM Rentals GROUP BY Customer_ID
10. Tính tổng doanh thu theo từng năm.
SELECT YEAR(Pick_up_date), SUM(Amount) FROM Rentals GROUP BY YEAR(Pick_up_date)
11. Lấy ra thông tin các đơn đặt xe bị trễ hạn (quá Return_date).
SELECT * FROM Rentals WHERE GETDATE() > Return_date
12. Tìm các khách hàng chưa từng thuê xe.
SELECT * FROM Customers WHERE ID NOT IN (SELECT Customer_ID FROM Rentals)
13. Lấy ra thông tin các đơn đặt xe có ngày trả xe là null.
SELECT * FROM Rentals WHERE Return_date IS NULL
14. Liệt kê các mẫu xe được thuê ít nhất 3 lần.
SELECT CarID, COUNT() AS RentedCount FROM Rentals GROUP BY CarID HAVING COUNT()
>= 3
15. Tìm top 5 khách hàng có tổng chi phí thuê xe cao nhất.
SELECT TOP 5 Customer_ID, SUM(Amount) AS TotalAmount FROM Rentals GROUP BY
Customer_ID ORDER BY TotalAmount DESC
1. Liệt kê tất cả các mẫu xe trong bảng Cars.
SELECT Model FROM Cars
2. Đếm số lượng khách hàng trong bảng Customers.
SELECT COUNT(*) FROM Customers
3. Tìm khách hàng có mã ID là 5.
SELECT * FROM Customers WHERE ID = 5
4. Lấy ra danh sách các quốc gia trong bảng Customers.
SELECT DISTINCT Country FROM Customers
5. Liệt kê các địa điểm ở Canada trong bảng Location.
SELECT * FROM Location WHERE Country = 'Canada'
6. Lấy ra thông tin điện thoại chính của mỗi địa điểm.
SELECT * FROM Location_Phone_Number WHERE Is_MainPhone = 1
7. Tìm các đơn đặt xe có tổng chi phí trên 100 đô la.
SELECT * FROM Rentals WHERE Amount > 100
8. Liệt kê các đơn đặt xe trong tháng 5 năm 2014.
SELECT * FROM Rentals WHERE YEAR(Pick_up_date) = 2014 AND MONTH(Pick_up_date) =
5
9. Đếm số lượng đơn đặt xe của mỗi khách hàng.
SELECT Customer_ID, COUNT(*) FROM Rentals GROUP BY Customer_ID
10. Tính tổng doanh thu theo từng năm.
SELECT YEAR(Pick_up_date), SUM(Amount) FROM Rentals GROUP BY YEAR(Pick_up_date)
11. Lấy ra thông tin các đơn đặt xe bị trễ hạn (quá Return_date).
SELECT * FROM Rentals WHERE GETDATE() > Return_date
12. Tìm các khách hàng chưa từng thuê xe.
SELECT * FROM Customers WHERE ID NOT IN (SELECT Customer_ID FROM Rentals)
13. Lấy ra thông tin các đơn đặt xe có ngày trả xe là null.
SELECT * FROM Rentals WHERE Return_date IS NULL
14. Liệt kê các mẫu xe được thuê ít nhất 3 lần.
SELECT CarID, COUNT() AS RentedCount FROM Rentals GROUP BY CarID HAVING COUNT()
>= 3
15. Tìm top 5 khách hàng có tổng chi phí thuê xe cao nhất.
SELECT TOP 5 Customer_ID, SUM(Amount) AS TotalAmount FROM Rentals GROUP BY
Customer_ID ORDER BY TotalAmount DESC
Tôi sẽ tiếp tục bổ sung thêm nhiều câu hỏi đa dạng khác để đảm bảo đưa ra được tất cả các
trường hợp câu lệnh SQL có thể có trên database này. Hãy cố gắng làm bài tập để nắm chắc
càng nhiều câu lệnh SQL khác nhau nhé!
Copy
ra đề từ dễ đến khó
PD
Được rồi, dưới đây tôi sẽ đưa ra các câu hỏi SQL từ đơn giản đến phức tạp dần:
1. Liệt kê tất cả các mẫu xe trong bảng Cars.
SELECT Model FROM Cars
2. Đếm số lượng khách hàng trong bảng Customers.
SELECT COUNT(*) FROM Customers
3. Lấy ra danh sách các quốc gia trong bảng Customers.
SELECT DISTINCT Country FROM Customers
4. Tìm các khách hàng ở Hy Lạp.
SELECT * FROM Customers WHERE Country = 'Greece'
5. Liệt kê các đơn đặt xe trong tháng 5 năm 2014.
SELECT * FROM Rentals WHERE YEAR(Pick_up_date) = 2014 AND MONTH(Pick_up_date) =
5
6. Tính tổng doanh thu theo từng năm.
SELECT YEAR(Pick_up_date), SUM(Amount) FROM Rentals
GROUP BY YEAR(Pick_up_date)
7. Lấy ra thông tin các đơn đặt xe bị trễ hạn.
SELECT * FROM Rentals WHERE GETDATE() > Return_date
8. Liệt kê các mẫu xe được thuê ít nhất 3 lần.
SELECT CarID, COUNT() AS RentedCount
FROM Rentals GROUP BY CarID HAVING COUNT() >= 3
9. Tìm khách hàng có tổng chi phí thuê xe cao nhất.
SELECT TOP 1 Customer_ID, SUM(Amount) AS TotalAmount FROM Rentals GROUP BY
Customer_ID ORDER BY TotalAmount DESC
10. Liệt kê các đơn đặt xe có tổng chi phí trên 500 và ngày trả xe trễ hạn.
SELECT * FROM Rentals WHERE Amount > 500 AND GETDATE() > Return_date
1. Liệt kê các mẫu xe của hãng Ford sản xuất sau năm 2010.
SELECT Model FROM Cars WHERE Brand = 'Ford' AND YEAR(Purchase_Date) > 2010
2. Tìm 5 khách hàng có tên bắt đầu bằng chữ 'M' và sống ở Châu Âu.
SELECT TOP 5 * FROM Customers WHERE First_Name LIKE 'M%' AND Country IN ('Belgium',
'France', 'Germany', 'Greece', 'Italy', 'Switzerland')
3. Đếm số lượng đơn đặt xe của mỗi khách hàng và sắp xếp từ cao đến thấp.
SELECT Customer_ID, COUNT(*) AS NumOrders FROM Rentals GROUP BY Customer_ID
ORDER BY NumOrders DESC
4. Tính tổng doanh thu theo từng tháng trong năm 2015.
SELECT MONTH(Pick_up_date) AS Month, SUM(Amount) AS TotalRevenue
FROM Rentals WHERE YEAR(Pick_up_date) = 2015 GROUP BY MONTH(Pick_up_date)
5. Lấy ra thông tin đầy đủ của 5 khách hàng có mã ID lớn nhất.
SELECT TOP 5 * FROM Customers ORDER BY ID DESC
6. Kiểm tra xem mỗi khách hàng đã thuê bao nhiêu lần xe tại mỗi địa điểm.
SELECT c.ID, l.ID AS LocationID, COUNT(*) AS RentalCount FROM Customers c JOIN Rentals
r ON c.ID = r.Customer_ID JOIN Location l ON r.Pick_up_location = l.ID GROUP BY c.ID, l.ID
7. Tìm khách hàng có tuổi cao nhất dựa trên số SSN.
SELECT TOP 1 * FROM Customers ORDER BY DATEPART(YEAR, SSN) DESC
8. Liệt kê các mẫu xe được đặt nhiều hơn 3 lần trong tháng 6 năm 2015.
SELECT Model, COUNT() AS NumRentals FROM Cars c JOIN Rentals r ON c.ID = r.CarID
WHERE MONTH(Pick_up_date) = 6 AND YEAR(Pick_up_date) = 2015
GROUP BY Model HAVING COUNT() > 3
9. Tìm địa điểm có nhiều điện thoại nhất.
SELECT TOP 1 l.City, COUNT(lpn.ID) AS NumPhones FROM Location l LEFT JOIN
Location_Phone_Number lpn ON l.ID = lpn.Location_ID GROUP BY l.City ORDER BY
NumPhones DESC
10. Liệt kê các đơn đặt xe có tổng chi phí trên mức trung bình.
SELECT * FROM Rentals WHERE Amount > (SELECT AVG(Amount) FROM Rentals)

2. Liệt kê các khách hàng đã thuê xe ít nhất 2 lần.


SELECT c.First_Name, c.Last_Name FROM Customers c
INNER JOIN Rentals r ON c.ID =r.Customer_ID
GROUP BY c.First_Name, c.Last_Name
HAVING COUNT(r.Customer_ID) >= 2

2. Tìm 5 khách hàng có tổng chi phí thuê xe cao nhất.


SELECT TOP 5 c.First_Name, c.Last_Name, SUM(r.Amount) AS Total_Amount FROM
Customers c INNER JOIN Rentals r ON c.ID = r.Customer_ID
GROUP BY c.First_Name, c.Last_Name
ORDER BY Total_Amount DESC

3. Liệt kê các mẫu xe chưa được thuê.


SELECT c.Model FROM Cars c LEFT JOIN Rentals r ON c.ID = r.CarID
WHERE r.CarID IS NULL
4. Tìm địa điểm có nhiều số điện thoại nhất.
SELECT TOP 1 l.ID, l.City, COUNT(lpn.ID) AS Num_Phones FROM Location l LEFT JOIN
Location_Phone_Number lpn ON l.ID = lpn.Location_ID
GROUP BY l.ID, l.City
ORDER BY Num_Phones DESC

5. Tính tổng doanh thu theo từng tháng trong năm 2015.
SELECT MONTH(Pick_up_date) AS Month, SUM(Amount) AS Total_Revenue FROM Rentals
WHERE YEAR(Pick_up_date) = 2015
GROUP BY MONTH(Pick_up_date)
ORDER BY Month

6. Tìm khách hàng ở các quốc gia Châu Âu.


SELECT * FROM Customers WHERE Country IN ('Greece', 'Belgium', 'France', 'Germany', 'Italy',
'Switzerland')

8. Tìm các mẫu xe được sản xuất trước năm 2010.


SELECT Model FROM Cars
WHERE Purchase_Date < '2010-01-01'

9. Đếm số lượng khách hàng theo mỗi quốc gia.


SELECT Country, COUNT(ID) AS Num_Customers FROM Customers
GROUP BY Country

10. Liệt kê các đơn đặt xe có tổng chi phí trên 200 đô la.
SELECT * FROM Rentals WHERE Amount > 200

11.Tìm top 3 khách hàng có tổng số lượng đơn đặt xe nhiều nhất và sắp xếp theo
alphabet tên khách hàng.
SELECT TOP 3 c.First_Name, c.Last_Name, COUNT(r.Customer_ID) AS Num_Orders FROM
Customers c INNER JOIN Rentals r ON c.ID = r.Customer_ID
GROUP BY c.First_Name, c.Last_Name
ORDER BY Num_Orders DESC, c.Last_Name, c.First_Name

2. Liệt kê các mẫu xe được thuê ít nhất 3 lần, sắp xếp theo số lượng lần đặt giảm dần.
SELECT c.Model, COUNT(r.CarID) AS Rented_Count FROM Cars c INNER JOIN Rentals r ON
c.ID = r.CarID GROUP BY c.Model HAVING COUNT(r.CarID) >= 3 ORDER BY Rented_Count
DESC
3. Tìm khách hàng có chi phí trung bình cho mỗi lần thuê xe cao nhất.
SELECT TOP 1 c.First_Name, c.Last_Name, AVG(r.Amount) AS Avg_Amount FROM
Customers c INNER JOIN Rentals r ON c.ID = r.Customer_ID GROUP BY c.First_Name,
c.Last_Name ORDER BY Avg_Amount DESC
4. Tính tổng doanh thu theo từng quý của năm 2015.
SELECT DATEPART(quarter, Pick_up_date) AS Quarter, SUM(Amount) AS Total_Revenue
FROM Rentals WHERE YEAR(Pick_up_date) = 2015 GROUP BY DATEPART(quarter,
Pick_up_date)
5. Tìm các khách hàng chưa thuê xe mẫu Chevrolet Sonic.
SELECT c.* FROM Customers c WHERE NOT EXISTS ( SELECT * FROM Rentals r INNER JOIN
Cars ca ON ca.ID = r.CarID WHERE ca.Model = 'Sonic' AND c.ID = r.Customer_ID )
6. Liệt kê các địa điểm có cả số điện thoại chính và phụ.
SELECT l.* FROM Location l INNER JOIN Location_Phone_Number lpn ON l.ID =
lpn.Location_ID WHERE EXISTS ( SELECT * FROM Location_Phone_Number WHERE
Location_ID = l.ID AND Is_MainPhone = 1 ) AND EXISTS ( SELECT * FROM
Location_Phone_Number WHERE Location_ID = l.ID AND Is_MainPhone = 0
)
7. Tìm các khách hàng chưa từng thuê xe tại địa điểm có mã ID là 5.
SELECT c.* FROM Customers c WHERE NOT EXISTS ( SELECT * FROM Rentals r WHERE c.ID
= r.Customer_ID AND r.Pick_up_location = 5 )
8. Liệt kê các mẫu xe được thuê với tần suất tăng dần theo năm.
WITH Rented_Cars AS ( SELECT YEAR(Pick_up_date) AS Rental_Year, CarID, COUNT(CarID)
AS Rent_Count FROM Rentals GROUP BY YEAR(Pick_up_date), CarID ) SELECT c.Model,
Rental_Year, Rent_Count FROM Rented_Cars rc INNER JOIN Cars c ON rc.CarID = c.ID
ORDER BY c.Model, Rental_Year
9. Tìm địa điểm có số lượng điện thoại nhiều nhất.
SELECT TOP 1 l.ID, COUNT(lpn.ID) AS Num_Phones FROM Location l LEFT JOIN
Location_Phone_Number lpn ON l.ID = lpn.Location_ID
GROUP BY l.ID ORDER BY Num_Phones DESC
10. Tìm các khách hàng chưa từng đặt xe dưới 30 ngày.
SELECT c.* FROM Customers c WHERE NOT EXISTS ( SELECT * FROM Rentals r WHERE c.ID
= r.Customer_ID AND DATEDIFF(day, Pick_up_date, Return_date) < 30 )

PROCEDURE,trigger,view
1. Tạo một stored procedure để thêm một khách hàng mới vào bảng Customers.
CREATE PROCEDURE spAddNewCustomer @FirstName nvarchar(100), @LastName
nvarchar(100), @Email nvarchar(100), @Phone nvarchar(20), @State nvarchar(100),
@Country nvarchar(100)
AS
INSERT INTO Customers (First_Name, Last_Name, Email, Mobile_phone, State, Country)
VALUES (@FirstName, @LastName, @Email, @Phone, @State, @Country)
2. Tạo trigger để tự động cập nhật trường Return_location trong bảng Rentals bằng
Pick_up_location khi không nhập Return_location.
CREATE TRIGGER trgAutoUpdateReturnLocation ON Rentals AFTER INSERT AS BEGIN
UPDATE Rentals SET Return_location = Pick_up_location WHERE Return_location IS NULL
END
3. Tạo view để lấy ra thông tin các khách hàng đã từng đặt xe, bao gồm các trường:
Tên, Email, Số điện thoại, Quốc gia.
CREATE VIEW vCustomerRentedCars AS SELECT c.First_Name, c.Last_Name, c.Email,
c.Mobile_phone, c.Country FROM Customers c INNER JOIN Rentals r ON c.ID =
r.Customer_ID
4. Tạo stored procedure có đầu vào là mã khách hàng và trả về tổng số lượng lần khách
hàng đó đã thuê xe.
CREATE PROCEDURE spGetRentalCountByCustomer @CustomerID int
AS
BEGIN SELECT COUNT(*) AS TotalRentals FROM Rentals WHERE Customer_ID =
@CustomerID
END
5. Tạo trigger để tự động cập nhật trường Category_ID trong bảng Cars dựa trên giá trị
của Brand và Model.
CREATE TRIGGER trgAutoUpdateCategory ON Cars AFTER INSERT, UPDATE AS BEGIN
UPDATE
Cars SET Category_ID = CASE WHEN Brand = 'Chevrolet' AND Model IN ('Spark', 'Sonic')
THEN 2 WHEN Brand = 'Toyota' AND Model IN ('Yaris', 'Aygo') THEN 4 ELSE 1 END WHERE
Category_ID IS NULL END
6. Tạo view để lấy ra doanh thu theo từng tháng của năm 2014.
CREATE VIEW vRevenueByMonth2014 AS SELECT DATENAME(month, Pick_up_date) AS
Month, SUM(Amount) AS TotalRevenue FROM Rentals WHERE YEAR(Pick_up_date) = 2014
GROUP BY DATENAME(month, Pick_up_date)
7. Viết stored procedure có đầu vào là mã khách hàng và xóa thông tin khách hàng đó
khỏi bảng Customers.
CREATE PROCEDURE spDeleteCustomer @CustomerID int AS BEGIN DELETE FROM
Customers WHERE ID = @CustomerID END
8. Tạo trigger để khi xóa một đơn đặt xe, cũng xóa luôn các bản ghi liên quan trong
bảng Rentals.
CREATE TRIGGER trgDeleteRelatedRentals ON Rentals AFTER DELETE AS BEGIN DELETE
FROM Rentals WHERE Customer_ID IN (SELECT Customer_ID FROM deleted) AND CarID IN
(SELECT CarID FROM deleted) AND Pick_up_location IN (SELECT Pick_up_location FROM
deleted) AND Return_location IN (SELECT Return_location FROM deleted) END
9. Tạo view lấy ra thông tin các đơn đặt xe bao gồm: Mã đơn, Tên khách hàng, Ngày
thuê, Ngày trả, Mã xe.
CREATE VIEW vRentalDetails AS SELECT r.Reservation_Number, c.First_Name + ' ' +
c.Last_Name AS CustomerName, r.Pick_up_date, r.Return_date, r.CarID
FROM Rentals r JOIN Customers c ON r.Customer_ID = c.ID
10. Viết stored procedure có đầu vào là mã khách hàng, cập nhật email của khách hàng
đó trong bảng Customers.
CREATE PROCEDURE spUpdateCustomerEmail @CustomerID int, @Email nvarchar(100) AS
BEGIN UPDATE Customers SET Email = @Email WHERE ID = @CustomerID
END
1. Tạo stored procedure để lấy ra thông tin của 5 khách hàng có chi tiêu cao nhất.
CREATE PROCEDURE spTop5CustomersBySpending AS BEGIN SELECT TOP 5 * FROM
Customers c INNER JOIN Rentals r ON c.ID = r.Customer_ID GROUP BY c.ID ORDER BY
SUM(r.Amount) DESC END
2. Viết trigger cập nhật tự động trường Return_date trong bảng Rentals bằng ngày hôm
nay nếu Return_date để trống.
CREATE TRIGGER trgUpdateReturnDate ON Rentals AFTER INSERT AS BEGIN UPDATE
Rentals SET Return_date = GETDATE() WHERE Return_date IS NULL END
3. Tạo view để lấy ra tổng doanh thu theo từng tháng trong năm 2015.
CREATE VIEW vRevenueByMonth2015 AS SELECT DATENAME(month, Pick_up_date) AS
Month, YEAR(Pick_up_date) AS Year, SUM(Amount) AS TotalRevenue FROM Rentals WHERE
YEAR(Pick_up_date) = 2015 GROUP BY DATENAME(month, Pick_up_date),
YEAR(Pick_up_date)
4. Viết stored procedure có đầu vào là mã khách hàng, cập nhật số điện thoại của
khách hàng trong bảng Customers.
CREATE PROCEDURE spUpdateCustomerPhone @CustomerID int, @Phone nvarchar(20) AS
BEGIN UPDATE Customers SET Mobile_phone = @Phone WHERE ID = @CustomerID END
5. Tạo trigger để ngăn chặn việc xóa bản ghi khỏi bảng Location nếu địa điểm đó đã
được sử dụng trong bảng Rentals.
CREATE TRIGGER trgRestrictDeleteLocation ON Location INSTEAD OF DELETE AS BEGIN IF
EXISTS (SELECT * FROM deleted d INNER JOIN Rentals r ON d.ID = r.Pick_up_location OR
d.ID = r.Return_location) BEGIN RAISERROR('Cannot delete location used in rentals', 16, 1)
ROLLBACK TRANSACTION END END
6. Tạo view bao gồm các thông tin: Mã đơn đặt xe, tên khách hàng, mã xe, ngày thuê,
ngày trả.
CREATE VIEW vRentalDetails AS SELECT r.Reservation_Number, c.First_Name + ' ' +
c.Last_Name AS CustomerName, r.CarID, r.Pick_up_date, r.Return_date FROM Rentals r JOIN
Customers c ON r.Customer_ID = c.ID
7. Viết stored procedure để xóa toàn bộ dữ liệu khỏi bảng Location_Phone_Number.
CREATE PROCEDURE spTruncateLocationPhones AS BEGIN TRUNCATE TABLE
Location_Phone_Number END
8. Tạo trigger không cho phép cập nhật hoặc xóa bản ghi khỏi bảng Cars nếu xe đó
đang được thuê.
CREATE TRIGGER trgRestrictUpdateDeleteCars ON Cars INSTEAD OF UPDATE, DELETE AS
BEGIN IF EXISTS (SELECT * FROM deleted d INNER JOIN Rentals r ON d.ID = r.CarID) BEGIN
RAISERROR('Cannot update/delete rented car', 16, 1) ROLLBACK TRANSACTION END
END
9. Viết stored procedure có đầu vào là mã khách hàng, xóa khách hàng đó khỏi bảng
Customers.
CREATE PROCEDURE spDeleteCustomer @CustomerID int AS BEGIN DELETE FROM
Customers WHERE ID = @CustomerID END
10. Tạo view lấy ra các đơn đặt xe có tổng chi phí lớn hơn 500.
CREATE VIEW vExpensiveRentals AS SELECT * FROM Rentals WHERE Amount > 500
1. Viết trigger để tự động tính giá cho thuê xe dựa trên số ngày thuê, loại xe và áp dụng
chiết khấu cho khách hàng thân thiết.
CREATE TRIGGER trgCalculateRentalPrice ON Rentals AFTER INSERT, UPDATE AS BEGIN
UPDATE Rentals SET Amount = DATEDIFF(DAY, Pick_up_date, Return_date) * c.DailyRate *
CASE WHEN c.Category = 'Luxury' THEN 1.2 WHEN EXISTS (SELECT 1 FROM
FrequentRenters WHERE CustomerID = Customer_ID) THEN 0.9 ELSE 1 END FROM Cars c
WHERE c.ID = CarID END
2. Viết stored procedure để tìm khách hàng có số lần đặt xe nhiều nhất ở mỗi quốc gia.
CREATE PROCEDURE spTopCustomerByCountry AS BEGIN SELECT c.Country,
MAX(RentalCount) AS MaxRentals, FIRST_VALUE(c.FirstName) OVER (PARTITION BY
c.Country ORDER BY RentalCount DESC) AS TopCustomer FROM ( SELECT c.Country,
c.FirstName, COUNT(*) AS RentalCount FROM Customers c INNER JOIN Rentals r ON c.ID =
r.CustomerID GROUP BY c.Country, c.FirstName ) c GROUP BY c.Country END
3. Viết trigger để ngăn chặn việc chỉnh sửa bản ghi trong bảng Rentals nếu đơn đặt xe
đó đã quá hạn trả.
CREATE TRIGGER trgRestrictUpdateOverdueRental ON Rentals INSTEAD OF UPDATE AS
BEGIN IF EXISTS (SELECT 1 FROM inserted i INNER JOIN Rentals r ON
i.Reservation_Number = r.Reservation_Number WHERE r.Return_Date < GETDATE()) BEGIN
RAISERROR('Cannot update overdue rental', 16, 1) ROLLBACK TRANSACTION END END
4. Tạo view để lấy ra các đơn đặt xe có ngày trả xe sau ngày dự kiến.
CREATE VIEW vOverdueRentals AS SELECT * FROM Rentals WHERE Return_Date >
Expected_Return_Date
5. Viết stored procedure để xóa toàn bộ dữ liệu của bảng Cars và cập nhật lại ID tự
động tăng.
CREATE PROCEDURE spResetCars AS BEGIN TRUNCATE TABLE Cars
DBCC CHECKIDENT ('Cars', RESEED, 0) END
6. Tạo trigger không cho phép xóa khách hàng nếu khách hàng đó vẫn còn đơn đặt xe
chưa trả.
CREATE TRIGGER trgRestrictDeleteCustomer ON Customers INSTEAD OF DELETE AS BEGIN
IF EXISTS (SELECT * FROM deleted d INNER JOIN Rentals r ON d.ID = r.Customer_ID WHERE
r.Return_Date IS NULL) BEGIN RAISERROR('Cannot delete customer with active rentals', 16,
1) ROLLBACK TRANSACTION
END END
7. Viết stored procedure để lấy ra doanh thu hàng tháng của 1 năm bất kỳ.
CREATE PROCEDURE spRevenueByMonth @Year int AS BEGIN SELECT DATENAME(month,
Pickup_Date) AS Month, SUM(Amount) AS Revenue FROM Rentals WHERE
YEAR(Pickup_Date) = @Year GROUP BY DATENAME(month, Pickup_Date) END
8. Tạo trigger cập nhật tự động trạng thái Đã trả cho đơn đặt xe khi ngày trả xe nhỏ hơn
hoặc bằng ngày hiện tại.
CREATE TRIGGER trgUpdateRentalStatus ON Rentals AFTER UPDATE AS BEGIN UPDATE
Rentals SET Status = 'Returned' WHERE Return_Date <= GETDATE() END
9. Viết view để lấy ra các đơn đặt xe đã quá hạn nhưng vẫn chưa được trả.
CREATE VIEW vOverdueRentals AS SELECT * FROM Rentals WHERE Return_Date <
GETDATE() AND Status = 'Active'
10. Tạo stored procedure để xóa toàn bộ dữ liệu trong các bảng Rentals, Cars và
Customers.
CREATE PROCEDURE spDeleteAllData AS BEGIN DELETE FROM Rentals DELETE FROM Cars
DELETE FROM Customers END

You might also like