diff --git a/10_stored_routines_as_functions/script.sql b/10_stored_routines_as_functions/script.sql index e3ee0ca..5fecce4 100644 --- a/10_stored_routines_as_functions/script.sql +++ b/10_stored_routines_as_functions/script.sql @@ -1 +1,25 @@ --- Write your SQL code here \ No newline at end of file +-- Write your SQL code here +CREATE FUNCTION BookFlight( + IN p_flight_number INT, + IN p_passenger_id INT, + IN p_seat_number INT +) +RETURNS BOOLEAN +BEGIN + DECLARE available_seats INT; + + SELECT AvailableSeats INTO available_seats + FROM Flights + WHERE FlightNumber = p_flight_number; + + IF available_seats > 0 THEN + INSERT INTO Bookings (FlightNumber, PassengerID, SeatNumber, BookingDate) + VALUES (p_flight_number, p_passenger_id, p_seat_number, NOW()); + UPDATE Flights + SET AvailableSeats = AvailableSeats - 1 + WHERE FlightNumber = p_flight_number; + RETURN TRUE; + ELSE + RETURN FALSE; + END IF; +END; \ No newline at end of file diff --git a/11_views/script.sql b/11_views/script.sql index e3ee0ca..aec275f 100644 --- a/11_views/script.sql +++ b/11_views/script.sql @@ -1 +1,27 @@ --- Write your SQL code here \ No newline at end of file +-- Write your SQL code here +CREATE VIEW AirportPerformance AS +SELECT + a.AirportCode, + a.AirportName, + AVG(TIMEDIFF(f.ActualArrivalTime, f.ScheduledArrivalTime)) AS AverageDelay, + COUNT(*) AS TotalFlights, + COUNT(CASE WHEN f.FlightStatus = 'On Time' THEN 1 ELSE NULL END) AS OnTimeFlights +FROM + Airports a +INNER JOIN Flights f ON a.AirportCode = f.DepartureAirportCode +GROUP BY + a.AirportCode, a.AirportName; + + + CREATE VIEW HighRevenueFlights AS +SELECT + f.FlightNumber, + SUM(b.Fare) AS TotalRevenue +FROM + Flights f +INNER JOIN Bookings b ON f.FlightNumber = b.FlightNumber +GROUP BY + f.FlightNumber +ORDER BY + TotalRevenue DESC +LIMIT 10; \ No newline at end of file diff --git a/12_database_transactions/script.sql b/12_database_transactions/script.sql index e3ee0ca..01632d4 100644 --- a/12_database_transactions/script.sql +++ b/12_database_transactions/script.sql @@ -1 +1,35 @@ --- Write your SQL code here \ No newline at end of file +-- Write your SQL code here +START TRANSACTION; + +UPDATE Flights +SET FlightStatus = 'Cancelled' +WHERE FlightNumber = 123; + +UPDATE Bookings +SET BookingStatus = 'Cancelled' +WHERE FlightNumber = 123; + +COMMIT; + + +START TRANSACTION; + +UPDATE Bookings +SET RefundStatus = 'Refunded' +WHERE BookingID = 123; + +INSERT INTO Refunds (BookingID, RefundAmount, RefundDate) +VALUES (123, 500, NOW()); + +COMMIT; + +START TRANSACTION; + +INSERT INTO Bookings (FlightNumber, PassengerID, SeatNumber, BookingDate) +VALUES (123, 456, '10A', NOW()); + +UPDATE Flights +SET AvailableSeats = AvailableSeats - 1 +WHERE FlightNumber = 123; + +COMMIT; \ No newline at end of file diff --git a/1_database/script.sql b/1_database/script.sql index e3ee0ca..39bb10d 100644 --- a/1_database/script.sql +++ b/1_database/script.sql @@ -1 +1,55 @@ --- Write your SQL code here \ No newline at end of file +-- Write your SQL code here +CREATE DATABASE airport_system; +USE airport_system; + +-- Create the tables +CREATE TABLE airlines ( + airline_id INT PRIMARY KEY AUTO_INCREMENT, + airline_name VARCHAR(50) NOT NULL, + country VARCHAR(50) +) ENGINE=InnoDB; + +CREATE TABLE airports ( + airport_code CHAR(3) PRIMARY KEY, + airport_name VARCHAR(100) NOT NULL, + city VARCHAR(50), + country VARCHAR(50) +) ENGINE=InnoDB; + +CREATE TABLE flights ( + flight_id INT PRIMARY KEY AUTO_INCREMENT, + airline_id INT, + flight_number INT, + departure_airport CHAR(3), + arrival_airport CHAR(3), + departure_time DATETIME, + arrival_time DATETIME, + aircraft_id INT, + FOREIGN KEY (airline_id) REFERENCES airlines(airline_id), + FOREIGN KEY (departure_airport) REFERENCES airports(airport_code), + FOREIGN KEY (arrival_airport) REFERENCES airports(airport_code) +) ENGINE=InnoDB +INDEX(departure_time), INDEX(arrival_time); + +CREATE TABLE aircraft ( + aircraft_id INT PRIMARY KEY, + aircraft_type VARCHAR(50), + capacity INT +) ENGINE=InnoDB; + +CREATE TABLE passengers ( + passenger_id INT PRIMARY KEY AUTO_INCREMENT, + first_name VARCHAR(50) NOT NULL, + last_name VARCHAR(50) NOT NULL, + passport_number VARCHAR(20) UNIQUE +) ENGINE=InnoDB; + +CREATE TABLE bookings ( + booking_id INT PRIMARY KEY AUTO_INCREMENT, + passenger_id INT, + flight_id INT, + seat_number INT, + booking_date DATETIME, + FOREIGN KEY (passenger_id) REFERENCES passengers(passenger_id), + FOREIGN KEY (flight_id) REFERENCES flights(flight_id) +) ENGINE=InnoDB; \ No newline at end of file diff --git a/2_base_tables/script.sql b/2_base_tables/script.sql index e3ee0ca..557af58 100644 --- a/2_base_tables/script.sql +++ b/2_base_tables/script.sql @@ -1 +1,21 @@ --- Write your SQL code here \ No newline at end of file +-- Write your SQL code here +CREATE TABLE Flights ( + FlightNumber INT PRIMARY KEY, + DepartureDateTime DATETIME NOT NULL, + ArrivalDateTime DATETIME NOT NULL, + DepartureAirportCode CHAR(3) NOT NULL, + FOREIGN KEY (DepartureAirportCode) REFERENCES Airports(AirportCode) +); + +CREATE TABLE Passengers ( + PassengerID INT PRIMARY KEY AUTO_INCREMENT, + FirstName VARCHAR(50) NOT NULL, + LastName VARCHAR(50) NOT NULL +); + +CREATE TABLE Airports ( + AirportCode CHAR(3) PRIMARY KEY, + AirportName VARCHAR(100) NOT NULL, + Country VARCHAR(50) NOT NULL +); + diff --git a/3_normal_triggers/script.sql b/3_normal_triggers/script.sql index e3ee0ca..9361039 100644 --- a/3_normal_triggers/script.sql +++ b/3_normal_triggers/script.sql @@ -1 +1,41 @@ --- Write your SQL code here \ No newline at end of file +-- Write your SQL code here +CREATE TRIGGER prevent_overbooking +BEFORE INSERT ON Bookings +FOR EACH ROW +BEGIN + DECLARE v_available_seats INT; + + SELECT COUNT(*) INTO v_available_seats + FROM Flights + WHERE FlightNumber = NEW.FlightNumber; + + SELECT COUNT(*) INTO v_booked_seats + FROM Bookings + WHERE FlightNumber = NEW.FlightNumber; + + IF v_booked_seats >= v_available_seats THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Flight is fully booked.'; + END IF; +END; + +CREATE TRIGGER log_flight_changes +AFTER UPDATE ON Flights +FOR EACH ROW +BEGIN + IF OLD.FlightStatus <> NEW.FlightStatus THEN + INSERT INTO FlightLogs (FlightNumber, OldStatus, NewStatus, Reason) + VALUES (NEW.FlightNumber, OLD.FlightStatus, NEW.FlightStatus, NEW.DelayReason); + END IF; +END; + +CREATE TRIGGER update_passenger_status_on_cancellation +AFTER UPDATE ON Flights +FOR EACH ROW +BEGIN + IF NEW.FlightStatus = 'Cancelled' THEN + UPDATE Bookings + SET BookingStatus = 'Cancelled' + WHERE FlightNumber = NEW.FlightNumber; + END IF; +END; + diff --git a/4_check_constraints/script.sql b/4_check_constraints/script.sql index e3ee0ca..7675813 100644 --- a/4_check_constraints/script.sql +++ b/4_check_constraints/script.sql @@ -1 +1,35 @@ --- Write your SQL code here \ No newline at end of file +-- Write your SQL code here +CREATE TABLE Flights ( + FlightNumber INT PRIMARY KEY, + DepartureDateTime DATETIME NOT NULL, + ArrivalDateTime DATETIME NOT NULL, + DepartureAirportCode CHAR(3) NOT NULL, + ArrivalAirportCode CHAR(3) NOT NULL, + FOREIGN KEY (DepartureAirportCode) REFERENCES Airports(AirportCode), + FOREIGN KEY (ArrivalAirportCode) REFERENCES Airports(AirportCode), 1 + CHECK (ArrivalDateTime > DepartureDateTime) -- Ensure arrival time is after departure time +) ENGINE=InnoDB +INDEX(DepartureDateTime), INDEX(ArrivalDateTime); + +CREATE TABLE Passengers ( + PassengerID INT PRIMARY KEY AUTO_INCREMENT, + FirstName VARCHAR(50) NOT NULL, + LastName VARCHAR(50) NOT NULL, + Age INT CHECK (Age >= 0) -- Ensure age is non-negative +) ENGINE=InnoDB; +CREATE TABLE Bookings ( + BookingID INT PRIMARY KEY AUTO_INCREMENT, + FlightNumber INT, + PassengerID INT, + SeatNumber INT, + BookingDate DATETIME, + FOREIGN KEY (FlightNumber) REFERENCES Flights(FlightNumber), + FOREIGN KEY (PassengerID) REFERENCES Passengers(PassengerID), + CHECK (SeatNumber BETWEEN 1 AND (SELECT Capacity FROM Aircraft WHERE AircraftID = (SELECT AircraftID FROM Flights WHERE FlightNumber = Bookings.FlightNumber))) -- Ensure seat number is within aircraft capacity +) ENGINE=InnoDB; + +CREATE TABLE Airports ( + AirportCode CHAR(3) PRIMARY KEY, + AirportName VARCHAR(100) NOT NULL, + Country VARCHAR(50) NOT NULL +) ENGINE=InnoDB; \ No newline at end of file diff --git a/5_temporal_triggers/script.sql b/5_temporal_triggers/script.sql index e3ee0ca..a0d3d3e 100644 --- a/5_temporal_triggers/script.sql +++ b/5_temporal_triggers/script.sql @@ -1 +1,59 @@ --- Write your SQL code here \ No newline at end of file +-- Write your SQL code here +CREATE EVENT update_flight_status +ON SCHEDULE EVERY 5 MINUTE +DO +BEGIN + DECLARE cur_flight CURSOR FOR + SELECT FlightNumber + FROM Flights + WHERE DepartureDateTime BETWEEN NOW() AND NOW() + INTERVAL 1 DAY; + + OPEN cur_flight; + + FETCH cur_flight INTO v_flight_number; + + WHILE ROW_COUNT() > 0 DO + -- Fetch real-time flight status for v_flight_number + SET v_flight_status = /* Fetch status from external source */; + SET v_actual_departure_time = /* Fetch actual departure time */; + SET v_actual_arrival_time = /* Fetch actual arrival time */; + SET v_delay_reason = /* Fetch delay reason */; + + UPDATE Flights + SET FlightStatus = v_flight_status, + ActualDepartureTime = v_actual_departure_time, + ActualArrivalTime = v_actual_arrival_time, + DelayReason = v_delay_reason + WHERE FlightNumber = v_flight_number; + + -- Send notifications to passengers and staff + CALL send_flight_status_notifications(v_flight_number, v_flight_status, v_delay_reason); + + FETCH cur_flight INTO v_flight_number; + END WHILE; + + CLOSE cur_flight; +END; + +CREATE EVENT send_check_in_reminders +ON SCHEDULE EVERY 1 DAY +DO +BEGIN + DECLARE cur_booking CURSOR FOR + SELECT PassengerID, Email, PhoneNumber, FlightNumber + FROM Bookings + WHERE DepartureDateTime BETWEEN NOW() + INTERVAL 1 DAY AND NOW() + INTERVAL 2 DAY; + + OPEN cur_booking; + + FETCH cur_booking INTO v_passenger_id, v_email, v_phone_number, v_flight_number; + + WHILE ROW_COUNT() > 0 DO + CALL send_check_in_email(v_email, v_flight_number); + CALL send_check_in_sms(v_phone_number, v_flight_number); + + FETCH cur_booking INTO v_passenger_id, v_email, v_phone_number, v_flight_number; + END WHILE; + + CLOSE cur_booking; +END; \ No newline at end of file diff --git a/6_storage_engines/script.sql b/6_storage_engines/script.sql index e3ee0ca..cc46350 100644 --- a/6_storage_engines/script.sql +++ b/6_storage_engines/script.sql @@ -1 +1,14 @@ --- Write your SQL code here \ No newline at end of file +-- Write your SQL code here +CREATE FUNCTION get_passenger_info(passenger_id INT) +RETURNS VARCHAR(255) +BEGIN + DECLARE first_name VARCHAR(50); + DECLARE last_name VARCHAR(50); + + SELECT FirstName, LastName + INTO first_name, last_name + FROM Passengers + WHERE PassengerID = passenger_id; + + RETURN CONCAT(first_name, ' ', last_name); +END; \ No newline at end of file diff --git a/7_indexes/script.sql b/7_indexes/script.sql index e3ee0ca..e69de29 100644 --- a/7_indexes/script.sql +++ b/7_indexes/script.sql @@ -1 +0,0 @@ --- Write your SQL code here \ No newline at end of file diff --git a/9_stored_routines_as_procedures/script.sql b/9_stored_routines_as_procedures/script.sql index e3ee0ca..17ed014 100644 --- a/9_stored_routines_as_procedures/script.sql +++ b/9_stored_routines_as_procedures/script.sql @@ -1 +1,25 @@ --- Write your SQL code here \ No newline at end of file +-- Write your SQL code here +CREATE PROCEDURE BookFlight( + IN p_flight_number INT, + IN p_passenger_id INT, + IN p_seat_number INT +) +BEGIN + DECLARE available_seats INT; + + SELECT AvailableSeats INTO available_seats + FROM Flights + WHERE FlightNumber = p_flight_number; + + IF available_seats > 0 THEN + START TRANSACTION; + INSERT INTO Bookings (FlightNumber, PassengerID, SeatNumber, BookingDate) + VALUES (p_flight_number, p_passenger_id, p_seat_number, NOW()); + UPDATE Flights + SET AvailableSeats = AvailableSeats - 1 + WHERE FlightNumber = p_flight_number; + COMMIT; + ELSE + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Flight is fully booked.'; + END IF; +END; \ No newline at end of file diff --git a/README.md b/README.md index 8728c63..74c141e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/fbNyN1as) # BBT3104: Advanced Database Sytems Semester Project | **Key** | Value |