Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 25 additions & 1 deletion 10_stored_routines_as_functions/script.sql
Original file line number Diff line number Diff line change
@@ -1 +1,25 @@
-- Write your SQL code here
-- 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;
28 changes: 27 additions & 1 deletion 11_views/script.sql
Original file line number Diff line number Diff line change
@@ -1 +1,27 @@
-- Write your SQL code here
-- 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;
36 changes: 35 additions & 1 deletion 12_database_transactions/script.sql
Original file line number Diff line number Diff line change
@@ -1 +1,35 @@
-- Write your SQL code here
-- 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;
56 changes: 55 additions & 1 deletion 1_database/script.sql
Original file line number Diff line number Diff line change
@@ -1 +1,55 @@
-- Write your SQL code here
-- 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;
22 changes: 21 additions & 1 deletion 2_base_tables/script.sql
Original file line number Diff line number Diff line change
@@ -1 +1,21 @@
-- Write your SQL code here
-- 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
);

42 changes: 41 additions & 1 deletion 3_normal_triggers/script.sql
Original file line number Diff line number Diff line change
@@ -1 +1,41 @@
-- Write your SQL code here
-- 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;

36 changes: 35 additions & 1 deletion 4_check_constraints/script.sql
Original file line number Diff line number Diff line change
@@ -1 +1,35 @@
-- Write your SQL code here
-- 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;
60 changes: 59 additions & 1 deletion 5_temporal_triggers/script.sql
Original file line number Diff line number Diff line change
@@ -1 +1,59 @@
-- Write your SQL code here
-- 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;
15 changes: 14 additions & 1 deletion 6_storage_engines/script.sql
Original file line number Diff line number Diff line change
@@ -1 +1,14 @@
-- Write your SQL code here
-- 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;
1 change: 0 additions & 1 deletion 7_indexes/script.sql
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@
-- Write your SQL code here
26 changes: 25 additions & 1 deletion 9_stored_routines_as_procedures/script.sql
Original file line number Diff line number Diff line change
@@ -1 +1,25 @@
-- Write your SQL code here
-- 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;
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -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 |
Expand Down