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

Truy vấn SQL

Ví dụ 1: Kết hợp thông tin từ bảng Cars và Rentals

SELECT Rentals.Reservation_Number, Rentals.Pick_up_date, Rentals.Return_date, Cars.Brand,


Cars.Model, Cars.Color

FROM Rentals

INNER JOIN Cars ON Rentals.CarID = Cars.ID;

Ví dụ 2: Liên kết thông tin từ các bảng Cars, Rentals và Customers

SELECT Rentals.Reservation_Number, Rentals.Pick_up_date, Rentals.Return_date,

Cars.Brand, Cars.Model, Cars.Color,

Customers.First_Name, Customers.Last_Name, Customers.Email

FROM Rentals

INNER JOIN Cars ON Rentals.CarID = Cars.ID

INNER JOIN Customers ON Rentals.Customer_ID = Customers.ID;


Ví dụ 3: Kết hợp thông tin từ nhiều bảng - Cars, Rentals, Customers và Locations

SELECT Rentals.Reservation_Number, Rentals.Pick_up_date, Rentals.Return_date,

Cars.Brand, Cars.Model, Cars.Color,

Customers.First_Name, Customers.Last_Name, Customers.Email,

Locations.Street, Locations.City, Locations.State, Locations.Country

FROM Rentals

INNER JOIN Cars ON Rentals.CarID = Cars.ID

INNER JOIN Customers ON Rentals.Customer_ID = Customers.ID

INNER JOIN Locations ON Rentals.Pick_up_location = Locations.ID;

Ví dụ 4: Kết hợp thông tin từ nhiều bảng - Cars, Rentals, Customers, Locations và Phone Numbers

SELECT Rentals.Reservation_Number, Rentals.Pick_up_date, Rentals.Return_date,

Cars.Brand, Cars.Model, Cars.Color,

Customers.First_Name, Customers.Last_Name, Customers.Email,


Locations.Street, Locations.City, Locations.State, Locations.Country,

PhoneNumbers.Phone_Number

FROM Rentals

INNER JOIN Cars ON Rentals.CarID = Cars.ID

INNER JOIN Customers ON Rentals.Customer_ID = Customers.ID

INNER JOIN Locations ON Rentals.Pick_up_location = Locations.ID

INNER JOIN PhoneNumbers ON Locations.ID = PhoneNumbers.Location_ID;

Ví dụ 5: Kết hợp thông tin từ các bảng Cars, Rentals, Customers và Labels

SELECT Rentals.Reservation_Number, Rentals.Pick_up_date, Rentals.Return_date,

Cars.Brand, Cars.Model, Cars.Color,

Customers.First_Name, Customers.Last_Name, Customers.Email,

Labels.Description AS Car_Label

FROM Rentals

INNER JOIN Cars ON Rentals.CarID = Cars.ID

INNER JOIN Customers ON Rentals.Customer_ID = Customers.ID

INNER JOIN Labels ON Cars.Category = Labels.ID;

Ví dụ 6: Kết hợp thông tin từ nhiều bảng - Rentals, Customers, Locations và Cars

SELECT Rentals.Reservation_Number, Rentals.Pick_up_date, Rentals.Return_date,

Customers.First_Name, Customers.Last_Name, Customers.Email,


Locations.Street, Locations.City, Locations.State, Locations.Country,

Cars.Brand, Cars.Model, Cars.Color

FROM Rentals

INNER JOIN Customers ON Rentals.Customer_ID = Customers.ID

INNER JOIN Locations ON Rentals.Pick_up_location = Locations.ID

INNER JOIN Cars ON Rentals.CarID = Cars.ID;

Ví dụ 7: Truy vấn thông tin chi tiết về đặt hàng kèm thông tin khách hàng và loại xe

SELECT

R.Reservation_Number,

C.First_Name,

C.Last_Name,

Ca.Brand,

Ca.Model,

R.Pick_up_date,

R.Return_date,

R.Amount

FROM Rentals R

INNER JOIN Customers C ON R.Customer_ID = C.ID

INNER JOIN Cars Ca ON R.CarID = Ca.ID;

Ví dụ 8: Truy vấn thông tin khách hàng, loại xe và thông tin đặt hàng được thực hiện sau tháng 5 năm
2015

SELECT

C.First_Name,

C.Last_Name,

Ca.Brand,

Ca.Model,

R.Pick_up_date,
R.Return_date,

R.Amount

FROM Rentals R

INNER JOIN Customers C ON R.Customer_ID = C.ID

INNER JOIN Cars Ca ON R.CarID = Ca.ID

WHERE R.Pick_up_date >= '2015-05-01' AND R.Return_date <= '2015-12-31';

Ví dụ 9: Truy vấn thông tin chi tiết về khách hàng, loại xe và đặt hàng có giá trị thuê xe lớn hơn 200
USD

SELECT

C.First_Name,

C.Last_Name,

Ca.Brand,

Ca.Model,

R.Amount

FROM Rentals R

INNER JOIN Customers C ON R.Customer_ID = C.ID

INNER JOIN Cars Ca ON R.CarID = Ca.ID

WHERE R.Amount > 200;

Ví dụ 10: Truy vấn thông tin về khách hàng, loại xe và đặt hàng có thời gian thuê xe trên 7 ngày

SELECT

C.First_Name,

C.Last_Name,

Ca.Brand,

Ca.Model,

R.Pick_up_date,

R.Return_date

FROM Rentals R
INNER JOIN Customers C ON R.Customer_ID = C.ID

INNER JOIN Cars Ca ON R.CarID = Ca.ID

WHERE DATEDIFF(day, R.Pick_up_date, R.Return_date) > 7;

Ví dụ 11: Truy vấn thông tin chi tiết về đặt hàng, loại xe và địa chỉ của khách hàng

SELECT

R.Reservation_Number,

C.First_Name,

C.Last_Name,

Ca.Brand,

Ca.Model,

L.Street,

L.Street_Number,

L.City,

C.State,

C.Country

FROM Rentals R

INNER JOIN Customers C ON R.Customer_ID = C.ID

INNER JOIN Cars Ca ON R.CarID = Ca.ID

INNER JOIN Locations L ON Rentals.Pick_up_location = L.ID;

Ví dụ 12: Truy vấn thông tin về đặt hàng, loại xe và tổng số lần thuê của mỗi loại xe

SELECT

Ca.Brand,

Ca.Model,

COUNT(R.Reservation_Number) AS TotalRentals

FROM Rentals R

INNER JOIN Cars Ca ON R.CarID = Ca.ID

GROUP BY Ca.Brand, Ca.Model;


Ví dụ 13: Truy vấn thông tin về các đặt hàng, loại xe và địa chỉ trả xe của khách hàng

SELECT

R.Reservation_Number,

C.First_Name,

C.Last_Name,

Ca.Brand,

Ca.Model,

L.Street AS Return_Street,

L.Street_Number AS Return_Street_Number,

L.City AS Return_City,

C.State AS Return_State,

C.Country AS Return_Country

FROM Rentals R

INNER JOIN Customers C ON R.Customer_ID = C.ID

INNER JOIN Cars Ca ON R.CarID = Ca.ID

INNER JOIN Locations L ON Rentals.Pick_up_location = L.ID ;

Ví dụ 14: Truy vấn thông tin chi tiết về đặt hàng, loại xe và danh sách các thuộc tính của từng loại xe

SELECT

R.Reservation_Number,

Ca.Brand,

Ca.Model,

JSON_QUERY(Ca.Description) AS Car_Details

FROM Rentals R

INNER JOIN Cars Ca ON R.CarID = Ca.ID;


Ví dụ 15: Truy vấn thông tin chi tiết về đặt hàng, loại xe và số lần thuê của mỗi loại xe theo từng khách
hang

SELECT

C.First_Name,

C.Last_Name,

Ca.Brand,

Ca.Model,

COUNT(R.Reservation_Number) AS TotalRentals

FROM Rentals R

INNER JOIN Customers C ON R.Customer_ID = C.ID

INNER JOIN Cars Ca ON R.CarID = Ca.ID

GROUP BY C.First_Name, C.Last_Name, Ca.Brand, Ca.Model;

Ví dụ 16: Truy vấn thông tin về các đặt hàng, loại xe và thông tin địa chỉ của khách hàng đã thuê xe tại
một địa điểm cụ thể

SELECT

C.First_Name,

C.Last_Name,

Ca.Brand,

Ca.Model,

L.Street,

L.Street_Number,

L.City,

C.State,

C.Country

FROM Rentals R

INNER JOIN Customers C ON R.Customer_ID = C.ID

INNER JOIN Cars Ca ON R.CarID = Ca.ID


INNER JOIN Location L ON R.Pick_up_location = L.ID

WHERE R.Pick_up_location = 1;

Ví dụ 17: Truy vấn thông tin chi tiết về đặt hàng, loại xe và thông tin chi tiết về thuộc tính của từng loại
xe theo tháng

SELECT

YEAR(R.Pick_up_date) AS Rent_Year,

MONTH(R.Pick_up_date) AS Rent_Month,

Ca.Brand,

Ca.Model,

JSON_QUERY(Ca.Description) AS Car_Details

FROM Rentals R

INNER JOIN Cars Ca ON R.CarID = Ca.ID;

Ví dụ 18: Truy vấn thông tin về các loại xe, tổng số lần thuê và tổng doanh thu từ mỗi loại xe

SELECT

Cars.Brand,

Cars.Model,

COUNT(R.Reservation_Number) AS TotalRentals,

SUM(R.Amount) AS TotalRevenue

FROM Cars

LEFT JOIN Rentals R ON Cars.ID = R.CarID

GROUP BY Cars.Brand, Cars.Model;

Ví dụ 19: Truy vấn thông tin về khách hàng, loại xe, và thông tin đặt hàng của khách hàng trong một
thời gian cụ thể

SELECT

Customers.First_Name,

Customers.Last_Name,
Cars.Brand,

Cars.Model,

R.Pick_up_date,

R.Return_date

FROM Customers

INNER JOIN Rentals R ON Customers.ID = R.Customer_ID

INNER JOIN Cars ON R.CarID = Cars.ID

WHERE R.Pick_up_date BETWEEN '2016-01-01' AND '2016-12-31';

Ví dụ 20: Truy vấn thông tin về khách hàng, loại xe và địa chỉ của khách hàng có đặt hàng tại một địa
điểm cụ thể

SELECT

Customers.First_Name,

Customers.Last_Name,

Cars.Brand,

Cars.Model,

L.Street,

L.Street_Number,

L.City,

L.State,

L.Country

FROM Rentals R

INNER JOIN Customers ON Customers.ID = R.Customer_ID

INNER JOIN Cars ON R.CarID = Cars.ID

INNER JOIN Location L ON R.Pick_up_location = L.ID

WHERE R.Pick_up_location = 2; -- Điều kiện lấy thông tin từ địa điểm thuê xe có ID = 2 --(có thể thay đổi)

Ví dụ 21: Truy vấn thông tin chi tiết về khách hàng, loại xe và doanh thu từng tháng

SELECT

YEAR(R.Pick_up_date) AS Rent_Year,
MONTH(R.Pick_up_date) AS Rent_Month,

Customers.First_Name,

Customers.Last_Name,

Cars.Brand,

Cars.Model,

SUM(R.Amount) AS TotalRevenue

FROM Rentals R

INNER JOIN Customers ON R.Customer_ID = Customers.ID

INNER JOIN Cars ON R.CarID = Cars.ID

GROUP BY YEAR(R.Pick_up_date), MONTH(R.Pick_up_date), Customers.First_Name,


Customers.Last_Name, Cars.Brand, Cars.Model;

Ví dụ 22: Truy vấn thông tin chi tiết về đặt hàng, loại xe và thông tin địa chỉ của khách hang

SELECT

R.Reservation_Number,

C.First_Name,

C.Last_Name,

Ca.Brand,

Ca.Model,

L.Street,

L.Street_Number,

L.City,

L.State,

L.Country

FROM Rentals R

INNER JOIN Customers C ON R.Customer_ID = C.ID

INNER JOIN Cars Ca ON R.CarID = Ca.ID

INNER JOIN Location L ON R.Pick_up_location = L.ID;


Ví dụ 23: Truy vấn thông tin chi tiết về đặt hàng, loại xe và thông tin địa chỉ trả xe của khách hàng

SELECT

R.Reservation_Number,

C.First_Name,

C.Last_Name,

Ca.Brand,

Ca.Model,

L.Street AS Return_Street,

L.Street_Number AS Return_Street_Number,

L.City AS Return_City,

L.State AS Return_State,

L.Country AS Return_Country

FROM Rentals R

INNER JOIN Customers C ON R.Customer_ID = C.ID

INNER JOIN Cars Ca ON R.CarID = Ca.ID

INNER JOIN Location L ON R.Pick_up_location = L.ID;

Ví dụ 24: Truy vấn thông tin chi tiết về đặt hàng, loại xe và danh sách các thuộc tính của từng loại xe có
màu đen (Black)

SELECT

R.Reservation_Number,

Ca.Brand,

Ca.Model,

JSON_QUERY(Ca.Description) AS Car_Details

FROM Rentals R

INNER JOIN Cars Ca ON R.CarID = Ca.ID

WHERE Ca.Color = 'Black';


Ví dụ 25: Truy vấn thông tin về các loại xe, số lần thuê và doanh thu từng tháng trong một năm cụ thể

SELECT

YEAR(R.Pick_up_date) AS Rent_Year,

MONTH(R.Pick_up_date) AS Rent_Month,

Ca.Brand,

Ca.Model,

COUNT(R.Reservation_Number) AS TotalRentals,

SUM(R.Amount) AS TotalRevenue

FROM Rentals R

INNER JOIN Cars Ca ON R.CarID = Ca.ID

WHERE YEAR(R.Pick_up_date) = 2015 -- Chọn năm cụ thể (có thể thay đổi)

GROUP BY YEAR(R.Pick_up_date), MONTH(R.Pick_up_date), Ca.Brand, Ca.Model;

PROCEDURE
Ví dụ Procedure 3: Tạo một procedure để lấy thông tin về các đơn đặt xe của một khách hàng dựa
trên ID của khách hàng.
CREATE PROCEDURE GetCustomerReservations

@CustomerID INT

AS

BEGIN

SELECT * FROM Rentals WHERE Customer_ID = @CustomerID;

END;

Procedure 4: Tạo một procedure để thêm một đơn đặt xe mới.

CREATE PROCEDURE AddNewReservation

@PickUpDate DATE,

@ReturnDate DATE,

@CarID INT,

@CustomerID INT,

@PickUpLocation INT,

@ReturnLocation INT,

@Amount DECIMAL

AS

BEGIN

INSERT INTO Rentals (Pick_up_date, Return_date, CarID, Customer_ID, Pick_up_location,


Return_location, Amount)

VALUES (@PickUpDate, @ReturnDate, @CarID, @CustomerID, @PickUpLocation, @ReturnLocation,


@Amount);

END;

Procedure 5: Tạo một procedure để cập nhật thông tin khách hàng.

CREATE PROCEDURE UpdateCustomerInfo

@CustomerID INT,

@NewFirstName NVARCHAR(50),

@NewLastName NVARCHAR(50),
@NewEmail NVARCHAR(100)

AS

BEGIN

UPDATE Customers

SET First_Name = @NewFirstName, Last_Name = @NewLastName, Email = @NewEmail

WHERE ID = @CustomerID;

END;

Procedure 6: Tạo một procedure để xóa một đơn đặt xe dựa trên số đặt.

CREATE PROCEDURE DeleteRentals

@ReservationNumber INT

AS

BEGIN

DELETE FROM Rentals WHERE Reservation_Number = @ReservationNumber;

END;

Procedure 7: Tạo một procedure để tính tổng số tiền các đơn đặt xe của một khách hàng dựa trên ID
của khách hàng.

CREATE PROCEDURE CalculateTotalAmountForCustomer

@CustomerID INT

AS

BEGIN

SELECT SUM(Amount) AS Total_Amount

FROM Rentals

WHERE Customer_ID = @CustomerID;

END;

Procedure 8: Tạo một procedure để cập nhật thông tin vị trí địa chỉ trong bảng địa điểm.

CREATE PROCEDURE UpdateLocationAddress

@LocationID INT,
@NewStreet NVARCHAR(100),

@NewCity NVARCHAR(50),

@NewCountry NVARCHAR(50)

AS

BEGIN

UPDATE Locations

SET Street = @NewStreet, City = @NewCity, Country = @NewCountry

WHERE ID = @LocationID;

END;

Procedure 9: Tạo một procedure để lấy thông tin về các xe được đặt nhiều lần.

CREATE PROCEDURE GetPopularCars

AS

BEGIN

SELECT Cars.Brand, Cars.Model, COUNT(*) AS Reservation_Count

FROM Rentals

INNER JOIN Cars ON Rentals.CarID = Cars.ID

GROUP BY Cars.Brand, Cars.Model

ORDER BY Reservation_Count DESC;

END;

Procedure 10: Tạo một procedure để tính tổng số lần đặt xe theo mỗi loại xe.

CREATE PROCEDURE GetReservationCountByCategory

AS

BEGIN

SELECT Labels.Description AS Category, COUNT(*) AS Reservation_Count

FROM Cars

INNER JOIN Labels ON Cars.Category = Labels.ID

INNER JOIN Rentals ON Cars.ID = Rentals.CarID


GROUP BY Labels.Description;

END;

Procedure 11: Tạo một procedure để cập nhật số điện thoại cho một khách hàng dựa trên ID.

CREATE PROCEDURE UpdateCustomerPhone

@CustomerID INT,

@NewPhoneNumber NVARCHAR(20)

AS

BEGIN

UPDATE Customers

SET Mobile_phone = @NewPhoneNumber

WHERE ID = @CustomerID;

END;

Procedure 12: Tạo một procedure để lấy thông tin về các đơn đặt xe trong một thời gian cụ thể

CREATE PROCEDURE GetReservationsInTimeRange

@StartDate DATE,

@EndDate DATE

AS

BEGIN

SELECT *

FROM Rentals

WHERE Pick_up_date BETWEEN @StartDate AND @EndDate;

END;

Procedure 13: Tạo một procedure để lấy thông tin chi tiết của một đơn đặt xe dựa trên số đặt.

CREATE PROCEDURE GetReservationDetailsByNumber

@ReservationNumber INT
AS

BEGIN

SELECT *

FROM Rentals

WHERE Reservation_Number = @ReservationNumber;

END;

Procedure 14: Tạo một procedure để thêm một khách hàng mới.

CREATE PROCEDURE AddNewCustomer

@SSN INT,

@FirstName NVARCHAR(50),

@LastName NVARCHAR(50),

@Email NVARCHAR(100),

@MobilePhone NVARCHAR(20),

@State NVARCHAR(50),

@Country NVARCHAR(50)

AS

BEGIN

INSERT INTO Customers (SSN, First_Name, Last_Name, Email, Mobile_phone, State, Country)

VALUES (@SSN, @FirstName, @LastName, @Email, @MobilePhone, @State, @Country);

END;

Procedure 15: Tạo một procedure để lấy thông tin về tất cả khách hàng trong một quốc gia cụ thể.

CREATE PROCEDURE GetCustomersByCountry

@CountryName NVARCHAR(50)

AS

BEGIN

SELECT *

FROM Customers
WHERE Country = @CountryName;

END;

Procedure 16: Tạo một procedure để cập nhật thông tin chi tiết về một xe dựa trên ID.

CREATE PROCEDURE UpdateCarDetails

@CarID INT,

@NewDescription NVARCHAR(255),

@NewColor NVARCHAR(50)

AS

BEGIN

UPDATE Cars

SET Description = @NewDescription, Color = @NewColor

WHERE ID = @CarID;

END;

Procedure 17: Tạo một procedure để lấy thông tin chi tiết của một khách hàng dựa trên ID.

CREATE PROCEDURE GetCustomerDetailsByID

@CustomerID INT

AS

BEGIN

SELECT *

FROM Customers

WHERE ID = @CustomerID;

END;

Procedure 18: Tạo một procedure để thêm một đơn đặt xe mới.

CREATE PROCEDURE AddNewReservation

@PickUpDate DATE,
@ReturnDate DATE,

@CarID INT,

@CustomerID INT,

@PickUpLocation INT,

@ReturnLocation INT,

@Amount DECIMAL

AS

BEGIN

INSERT INTO Rentals (Pick_up_date, Return_date, CarID, Customer_ID, Pick_up_location,


Return_location, Amount)

VALUES (@PickUpDate, @ReturnDate, @CarID, @CustomerID, @PickUpLocation, @ReturnLocation,


@Amount);

END;

Procedure 19: Tạo một procedure để lấy thông tin về tất cả các đặt xe được thực hiện bởi một khách
hàng cụ thể.

CREATE PROCEDURE GetReservationsByCustomer

@CustomerID INT

AS

BEGIN

SELECT *

FROM Rentals

WHERE Customer_ID = @CustomerID;

END;

Procedure 20: Tạo một procedure để cập nhật thông tin chi tiết về một địa điểm dựa trên ID

CREATE PROCEDURE UpdateLocationDetails

@LocationID INT,

@NewStreet NVARCHAR(100),

@NewCity NVARCHAR(50),
@NewCountry NVARCHAR(50)

AS

BEGIN

UPDATE Locations

SET Street = @NewStreet, City = @NewCity, Country = @NewCountry

WHERE ID = @LocationID;

END;

Procedure 21: Tạo một procedure để lấy thông tin về tất cả các đặt xe trong một khoảng thời gian cụ
thể.

CREATE PROCEDURE GetReservationsInTimeRange

@StartDate DATE,

@EndDate DATE

AS

BEGIN

SELECT *

FROM Rentals

WHERE Pick_up_date BETWEEN @StartDate AND @EndDate;

END;

Procedure 22: Tạo một procedure để cập nhật thông tin chi tiết của một khách hàng.

CREATE PROCEDURE UpdateCustomerDetails

@CustomerID INT,

@NewEmail NVARCHAR(100),

@NewMobilePhone NVARCHAR(20)

AS

BEGIN

UPDATE Customers

SET Email = @NewEmail, Mobile_phone = @NewMobilePhone


WHERE ID = @CustomerID;

END;

Procedure 23: Tạo một procedure để lấy thông tin về tất cả các khách hàng có đặt xe trong một thời
gian cụ thể.

CREATE PROCEDURE GetCustomersWithReservationsInTimeRange

@StartDate DATE,

@EndDate DATE

AS

BEGIN

SELECT DISTINCT Customers.*

FROM Customers

INNER JOIN Rentals ON Customers.ID = Rentals.Customer_ID

WHERE Rentals.Pick_up_date BETWEEN @StartDate AND @EndDate;

END;

Procedure 24: Tạo một procedure để xóa thông tin về một đặt xe dựa trên số đặt.

CREATE PROCEDURE DeleteReservationByNumber

@ReservationNumber INT

AS

BEGIN

DELETE FROM Rentals

WHERE Reservation_Number = @ReservationNumber;

END;

Procedure 25: Tạo một procedure để tính toán số lượng xe đã được thuê bởi mỗi khách hàng.

CREATE PROCEDURE CalculateCarsRentedByCustomer

AS
BEGIN

DECLARE @CustomerID INT;

DECLARE @TotalRentedCars INT;

DECLARE customer_cursor CURSOR FOR

SELECT DISTINCT Customer_ID

FROM Rentals;

OPEN customer_cursor;

FETCH NEXT FROM customer_cursor INTO @CustomerID;

WHILE @@FETCH_STATUS = 0

BEGIN

SELECT @TotalRentedCars = COUNT(*)

FROM Rentals

WHERE Customer_ID = @CustomerID;

FETCH NEXT FROM customer_cursor INTO @CustomerID;

END;

CLOSE customer_cursor;

DEALLOCATE customer_cursor;

END;

Procedure 26: Tạo một procedure để tính toán tổng số lần mà mỗi khách hàng đã thuê các loại xe khác
nhau.

CREATE PROCEDURE CalculateTotalRentalsPerCustomer

AS

BEGIN
CREATE TABLE #TempRentals (

CustomerID INT,

CarCategoryCount INT

);

DECLARE @CustomerID INT;

DECLARE customer_cursor CURSOR FOR

SELECT DISTINCT Customer_ID

FROM Rentals;

OPEN customer_cursor;

FETCH NEXT FROM customer_cursor INTO @CustomerID;

WHILE @@FETCH_STATUS = 0

BEGIN

INSERT INTO #TempRentals (CustomerID, CarCategoryCount)

SELECT @CustomerID, COUNT(DISTINCT Category_ID)

FROM Rentals

WHERE Customer_ID = @CustomerID;

FETCH NEXT FROM customer_cursor INTO @CustomerID;

END;

CLOSE customer_cursor;

DEALLOCATE customer_cursor;

SELECT * FROM #TempRentals;

DROP TABLE #TempRentals;

END;
Procedure 27: Tạo một procedure để tính toán tổng doanh thu từ việc thuê xe theo từng tháng của
một năm cụ thể.

CREATE PROCEDURE CalculateMonthlyRentalRevenue

@Year INT

AS

BEGIN

CREATE TABLE #MonthlyRevenue (

MonthNumber INT,

TotalRevenue DECIMAL(10, 2)

);

DECLARE @Month INT = 1;

WHILE @Month <= 12

BEGIN

INSERT INTO #MonthlyRevenue (MonthNumber, TotalRevenue)

SELECT

MONTH(Pick_up_date) AS MonthNumber,

SUM(Amount) AS TotalRevenue

FROM Rentals

WHERE YEAR(Pick_up_date) = @Year

AND MONTH(Pick_up_date) = @Month

GROUP BY MONTH(Pick_up_date);

SET @Month = @Month + 1;

END;

SELECT * FROM #MonthlyRevenue;

DROP TABLE #MonthlyRevenue;

END;
Procedure 28: Tạo một procedure để tổng hợp thông tin chi tiết về khách hàng và số lần thuê xe.

CREATE PROCEDURE SummarizeCustomerRentals

AS

BEGIN

CREATE TABLE #CustomerRentalsSummary (

CustomerID INT,

FirstName NVARCHAR(50),

LastName NVARCHAR(50),

TotalRentals INT

);

INSERT INTO #CustomerRentalsSummary (CustomerID, FirstName, LastName, TotalRentals)

SELECT

C.ID AS CustomerID,

C.First_Name AS FirstName,

C.Last_Name AS LastName,

ISNULL(SUM(R.Amount), 0) AS TotalRentals

FROM Customers C

LEFT JOIN Rentals R ON C.ID = R.Customer_ID

GROUP BY C.ID, C.First_Name, C.Last_Name;

SELECT * FROM #CustomerRentalsSummary;

DROP TABLE #CustomerRentalsSummary;

END;

Procedure 29: Tạo một procedure để kiểm tra và cập nhật thông tin đặt xe với các điều kiện cụ thể.
CREATE PROCEDURE UpdateRentalInformation

AS

BEGIN

CREATE TABLE #UpdatedRentals (

ReservationNumber INT,

NewAmount DECIMAL(10, 2),

ReturnDate DATE

);

INSERT INTO #UpdatedRentals (ReservationNumber, NewAmount, ReturnDate)

SELECT

Reservation_Number,

CASE

WHEN DATEDIFF(DAY, Pick_up_date, Return_date) > 10 THEN Amount * 1.1

ELSE Amount

END AS NewAmount,

CASE

WHEN DATEDIFF(DAY, Pick_up_date, Return_date) > 20 THEN DATEADD(DAY, 5, Return_date)

ELSE Return_date

END AS ReturnDate

FROM Rentals

WHERE Pick_up_date <= GETDATE() AND Return_date <= GETDATE(); -- Điều kiện: Thời gian hiện tại

UPDATE Rentals

SET Amount = UR.NewAmount, Return_date = UR.ReturnDate

FROM #UpdatedRentals UR

WHERE Rentals.Reservation_Number = UR.ReservationNumber;

SELECT * FROM #UpdatedRentals;

DROP TABLE #UpdatedRentals;

END;
Procedure 30: Tạo một procedure để tính toán tổng doanh thu từ việc thuê xe theo từng tháng của
năm cụ thể và lưu kết quả vào bảng tổng hợp.

CREATE PROCEDURE CalculateMonthlyRentalRevenue

@Year INT

AS

BEGIN

CREATE TABLE MonthlyRevenueSummary (

MonthNumber INT,

Year INT,

TotalRevenue DECIMAL(10, 2)

);

DECLARE @Month INT = 1;

WHILE @Month <= 12

BEGIN

INSERT INTO MonthlyRevenueSummary (MonthNumber, Year, TotalRevenue)

SELECT

@Month AS MonthNumber,

@Year AS Year,

SUM(Amount) AS TotalRevenue

FROM Rentals

WHERE YEAR(Pick_up_date) = @Year

AND MONTH(Pick_up_date) = @Month;

SET @Month = @Month + 1;

END;

SELECT * FROM MonthlyRevenueSummary;

DROP TABLE MonthlyRevenueSummary;


END;

Trigger
Trigger 1: Tạo một trigger để kiểm tra việc thêm mới đơn đặt xe.

CREATE TRIGGER CheckReservation

ON Rentals

AFTER INSERT

AS

BEGIN

IF EXISTS (SELECT * FROM inserted WHERE Return_date < Pick_up_date)

BEGIN

PRINT 'Lỗi: Ngày trả xe không thể trước ngày nhận xe.';

ROLLBACK;

END

END;

Trigger 2: Tạo một trigger để cập nhật thông tin khi thay đổi địa chỉ khách hàng.

CREATE TRIGGER UpdateCustomerLocation

ON Customers

AFTER UPDATE

AS

BEGIN

IF UPDATE(State) OR UPDATE(Country)

BEGIN

UPDATE Customers

SET Address = State + ', ' + Country


FROM Customers c

INNER JOIN inserted i ON c.ID = i.ID;

END

END;

Trigger 3: Tạo một trigger để kiểm tra việc xóa thông tin khách hàng.

CREATE TRIGGER PreventCustomerDeletion

ON Customers

INSTEAD OF DELETE

AS

BEGIN

PRINT 'Không thể xóa thông tin khách hàng.';

END;

Trigger 4: Tạo một trigger để tự động cập nhật thông tin ngày trả xe khi ngày nhận xe thay đổi.

CREATE TRIGGER UpdateReturnDate

ON Rentals

AFTER UPDATE OF Pick_up_date

AS

BEGIN

UPDATE Rentals

SET Return_date = DATEADD(DAY, DATEDIFF(DAY, inserted.Pick_up_date, deleted.Pick_up_date),


Return_date)

FROM Reservations

INNER JOIN inserted ON Rentals.Reservation_Number = inserted.Reservation_Number

INNER JOIN deleted ON inserted.Reservation_Number = deleted.Reservation_Number;

END;

Trigger 5: Tạo một trigger để ghi log khi có sự thay đổi trong bảng khách hàng.
CREATE TRIGGER CustomerChangeLog

ON Customers

AFTER INSERT, UPDATE, DELETE

AS

BEGIN

IF (SELECT COUNT(*) FROM inserted) > 0

BEGIN

INSERT INTO Customer_Log (Action, ChangeDate)

VALUES ('Customer data modified', GETDATE());

END

END;

Trigger 6: Tạo một trigger để kiểm tra việc thay đổi giá trị số tiền trong bảng đặt xe.

CREATE TRIGGER CheckReservationAmount

ON Rentals

AFTER UPDATE

AS

BEGIN

IF UPDATE(Amount)

BEGIN

IF (SELECT Amount FROM inserted) < 0

BEGIN

ROLLBACK;

END

END

END;

Trigger 7: Tạo một trigger để tự động cập nhật ngày trả xe khi ngày nhận xe thay đổi.

CREATE TRIGGER UpdateReturnDate


ON Rentals

AFTER UPDATE OF Pick_up_date

AS

BEGIN

UPDATE Rentals

SET Return_date = DATEADD(DAY, DATEDIFF(DAY, inserted.Pick_up_date, deleted.Pick_up_date),


Return_date)

FROM Reservations

INNER JOIN inserted ON Rentals.Reservation_Number = inserted.Reservation_Number

INNER JOIN deleted ON inserted.Reservation_Number = deleted.Reservation_Number;

END;

Trigger 8: Tạo một trigger để kiểm tra việc thêm mới thông tin khách hàng.

CREATE TRIGGER CheckNewCustomer

ON Customers

AFTER INSERT

AS

BEGIN

IF NOT EXISTS (SELECT * FROM inserted WHERE First_Name IS NOT NULL AND Last_Name IS NOT
NULL AND Email IS NOT NULL)

BEGIN

ROLLBACK;

END

END;

Trigger 9: Tạo một trigger để ghi log khi có sự thay đổi trong bảng đặt xe.

CREATE TRIGGER ReservationChangeLog

ON Rentals

AFTER INSERT, UPDATE, DELETE

AS
BEGIN

IF (SELECT COUNT(*) FROM inserted) > 0

BEGIN

INSERT INTO Reservation_Log (Action, ChangeDate)

VALUES ('Reservation data modified', GETDATE());

END

END;

Trigger 10: Tạo một trigger để kiểm tra việc thêm mới thông tin đặt xe.

CREATE TRIGGER CheckNewReservation

ON Rentals

AFTER INSERT

AS

BEGIN

IF (SELECT COUNT(*) FROM inserted WHERE Amount < 0) > 0

BEGIN

ROLLBACK;

END

END;

Trigger 11: Tạo một trigger để cập nhật thông tin khi địa chỉ đón xe thay đổi.

CREATE TRIGGER UpdatePickupLocation

ON Rentals

AFTER UPDATE OF Pick_up_location

AS

BEGIN

UPDATE Reservations

SET Return_location = inserted.Pick_up_location

FROM Rentals
INNER JOIN inserted ON Rentals.Reservation_Number = inserted.Reservation_Number;

END;

Trigger 12: Tạo một trigger để kiểm tra việc xóa thông tin loại xe.

CREATE TRIGGER PreventCategoryDeletion

ON Labels

INSTEAD OF DELETE

AS

BEGIN

IF EXISTS (SELECT * FROM Cars WHERE Category = deleted.ID)

BEGIN

PRINT 'Không thể xóa loại xe vì có dữ liệu liên quan.';

END

ELSE

BEGIN

DELETE FROM Labels WHERE ID = deleted.ID;

END

END;

Trigger 13: Tạo một trigger để kiểm tra việc thay đổi số lượng xe trong bảng đặt xe.

CREATE TRIGGER CheckCarQuantity

ON Rentals

AFTER INSERT, UPDATE

AS

BEGIN

IF (SELECT COUNT(*) FROM Cars) > 100

BEGIN

PRINT 'Số lượng xe đã vượt quá giới hạn cho phép.';

ROLLBACK;
END

END;

Trigger 14: Tạo một trigger để ghi log khi có thay đổi trong bảng khách hàng.

CREATE TRIGGER CustomerChangeLog

ON Customers

AFTER INSERT, UPDATE, DELETE

AS

BEGIN

IF (SELECT COUNT(*) FROM inserted) > 0 OR (SELECT COUNT(*) FROM deleted) > 0

BEGIN

INSERT INTO Customer_Log (Action, ChangeDate)

VALUES ('Customer data modified', GETDATE());

END

END;

Trigger 15: Tạo một trigger để kiểm tra việc thêm mới thông tin vị trí địa điểm.

CREATE TRIGGER CheckNewLocation

ON Locations

AFTER INSERT

AS

BEGIN

IF (SELECT COUNT(*) FROM inserted WHERE Country = 'Unknown') > 0

BEGIN

PRINT 'Lỗi: Quốc gia không được để trống.';

ROLLBACK;

END

END;
Trigger 16: Tạo một trigger để cập nhật ngày trả xe khi ngày nhận xe thay đổi.

CREATE TRIGGER UpdateReturnDate

ON Rentals

AFTER UPDATE OF Pick_up_date

AS

BEGIN

UPDATE Rentals

SET Return_date = DATEADD(DAY, DATEDIFF(DAY, inserted.Pick_up_date, deleted.Pick_up_date),


Return_date)

FROM Rentals

INNER JOIN inserted ON Rentals.Reservation_Number = inserted.Reservation_Number

INNER JOIN deleted ON inserted.Reservation_Number = deleted.Reservation_Number;

END;

Trigger 17: Tạo một trigger để kiểm tra việc cập nhật thông tin xe.

CREATE TRIGGER CheckCarUpdate

ON Cars

AFTER UPDATE

AS

BEGIN

IF (SELECT COUNT(*) FROM deleted WHERE Brand <> inserted.Brand OR Model <> inserted.Model) > 0

BEGIN

PRINT 'Không thể thay đổi thương hiệu hoặc mô hình của xe.';

ROLLBACK;

END

END;

Trigger 18: Tạo một trigger để ghi log khi có sự thay đổi trong bảng đặt xe.
CREATE TRIGGER ReservationChangeLog

ON Rentals

AFTER INSERT, UPDATE, DELETE

AS

BEGIN

INSERT INTO Reservation_Log (Action, ChangeDate)

VALUES ('Reservation data modified', GETDATE());

END;

Trigger 19: Tạo một trigger để kiểm tra việc thêm mới thông tin khách hàng.

CREATE TRIGGER CheckNewCustomer

ON Customers

AFTER INSERT

AS

BEGIN

IF (SELECT COUNT(*) FROM inserted WHERE First_Name IS NULL OR Last_Name IS NULL OR Email IS
NULL) > 0

BEGIN

PRINT 'Không thể thêm khách hàng với thông tin trống.';

ROLLBACK;

END

END;

Trigger 20: Tạo một trigger để kiểm tra việc thay đổi số lượng xe trong bảng đặt xe.

CREATE TRIGGER CheckCarQuantityChange

ON Rentals

AFTER UPDATE

AS

BEGIN
IF (SELECT COUNT(*) FROM Cars) > 150

BEGIN

PRINT 'Số lượng xe đã vượt quá giới hạn cho phép.';

ROLLBACK;

END

END;

Trigger 21: Tạo một trigger để kiểm tra việc thêm mới thông tin đặt xe.

CREATE TRIGGER CheckNewReservation

ON Rentals

AFTER INSERT

AS

BEGIN

IF (SELECT COUNT(*) FROM inserted WHERE Amount < 0) > 0

BEGIN

PRINT 'Số tiền không được âm trong đơn đặt xe.';

ROLLBACK;

END

END;

Trigger 22: Tạo một trigger để ghi log khi có sự thay đổi trong bảng khách hàng.

CREATE TRIGGER CustomerChangeLog

ON Customers

AFTER INSERT, UPDATE, DELETE

AS

BEGIN

INSERT INTO Customer_Log (Action, ChangeDate)

VALUES ('Customer data modified', GETDATE());


END;

Trigger 23: Tạo một trigger để ghi log khi có sự thay đổi trong bảng đặt xe.

CREATE TRIGGER ReservationChangeLog

ON Rentals

AFTER INSERT, UPDATE, DELETE

AS

BEGIN

INSERT INTO Reservation_Log (Action, ChangeDate)

VALUES ('Reservation data modified', GETDATE());

END;

Trigger 24: Tạo một trigger để kiểm tra việc thay đổi giá trị số tiền trong đơn đặt xe.

CREATE TRIGGER CheckReservationAmountChange

ON Rentals

AFTER UPDATE

AS

BEGIN

IF (SELECT COUNT(*) FROM inserted WHERE Amount < 0) > 0

BEGIN

PRINT 'Số tiền không được âm trong đơn đặt xe.';

ROLLBACK;

END

END;

Trigger 25: Tạo một trigger để ghi lại thông tin khi có dữ liệu mới được thêm vào bảng 'Rentals'.

CREATE TRIGGER RecordNewRentalInfo

ON Rentals

AFTER INSERT

AS
BEGIN

INSERT INTO RentalLog (Event, Timestamp)

VALUES ('New rental added', GETDATE());

END;

Trigger 26: Tạo một trigger để cập nhật thông tin khi có sự thay đổi trong bảng 'Reservations'.

CREATE TRIGGER UpdateReservationInfo

ON Rentals

AFTER UPDATE

AS

BEGIN

UPDATE Rentals

SET LastModified = GETDATE()

FROM Rentals R

JOIN inserted I ON R.Reservation_Number = I.Reservation_Number;

END;

Trigger 27: Tạo một trigger để ngăn chặn việc xóa thông tin khách hàng nếu có đặt hàng liên kết với
khách hàng đó.

CREATE TRIGGER PreventCustomerDeletion

ON Customers

INSTEAD OF DELETE

AS

BEGIN

SET NOCOUNT ON;

IF EXISTS (SELECT 1 FROM Reservations WHERE Customer_ID IN (SELECT deleted.ID FROM deleted))

BEGIN

RAISERROR('Cannot delete this customer as there are reservations linked to this customer.', 16, 1);
END

ELSE

BEGIN

DELETE FROM Customers WHERE ID IN (SELECT deleted.ID FROM deleted);

END

END;

Trigger 28: Tạo một trigger để cập nhật tổng số lượng xe được thuê trong bảng khi có thông tin đặt
hàng mới được thêm vào bảng Reservations.

CREATE TRIGGER UpdateTotalCarsRented

ON Rentals

AFTER INSERT

AS

BEGIN

DECLARE @CarID INT;

DECLARE @TotalRentedCars INT;

SELECT @CarID = CarID FROM inserted;

SELECT @TotalRentedCars = COUNT(*) FROM Reservations WHERE CarID = @CarID;

UPDATE Cars

SET TotalRentals = @TotalRentedCars

WHERE ID = @CarID;

END;

Trigger 29: Tạo một trigger để theo dõi và ghi lại thông tin khi có dữ liệu được cập nhật trong bảng
'Customers'.

CREATE TRIGGER LogCustomerChanges


ON Customers

AFTER UPDATE

AS

BEGIN

DECLARE @OldValue NVARCHAR(1000);

DECLARE @NewValue NVARCHAR(1000);

DECLARE @ChangeDescription NVARCHAR(1000);

SELECT @OldValue = CONVERT(NVARCHAR(MAX), d.*), @NewValue = CONVERT(NVARCHAR(MAX),


i.*)

FROM deleted d

JOIN inserted i ON d.ID = i.ID;

SET @ChangeDescription = 'Customer details updated - Old Values: ' + @OldValue + ', New Values: ' +
@NewValue;

INSERT INTO CustomerChangeLog (ChangeDescription, ChangeDateTime)

VALUES (@ChangeDescription, GETDATE());

END;

You might also like