diff --git a/Exercise1.sql b/Exercise1.sql new file mode 100644 index 0000000..113398e --- /dev/null +++ b/Exercise1.sql @@ -0,0 +1,40 @@ +-- STEP1 +-- Raw table has redundancy: author name repeated across multiple posts +-- Normalization to 3NF requires separating authors from posts + +-- 1NF: each cell has one value, each row is unique ✓ +-- 2NF: add surrogate keys to eliminate partial dependencies +-- 3NF: separate author data into its own table (author info depends on author, not on post) +-- + +--Step2 +--Write the DDL +CREATE TABLE authors ( + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(255) NOT NULL); + +CREATE TABLE posts ( + id INT PRIMARY KEY AUTO_INCREMENT, + author_id INT NOT NULL, + title VARCHAR(255) NOT NULL, + word_count INT, + views INT, + FOREIGN KEY (author_id) REFERENCES authors(id)); + + + +--Step3 + +INSERT INTO authors (name) VALUES +('Mario Wu'), +('Jospe Perez'), +('Emma Houng'); + +INSERT INTO posts (author_id, title, word_count, views) VALUES +(1, 'Best Paint Colors', 814, 14), +(2, 'Small Space Decorating Tips', 1146, 221), +(1, 'Hot Accessories', 986, 105), +(1, 'Mixing Textures', 765, 22), +(2, 'Kitchen Refresh', 1242, 307), +(1, 'Homemade Art Hacks', 1002, 193), +(3, 'Refinishing Wood Floors', 1571, 7542); diff --git a/Exercise2.sql b/Exercise2.sql new file mode 100644 index 0000000..94baa40 --- /dev/null +++ b/Exercise2.sql @@ -0,0 +1,81 @@ +STEP1/2 + +-- Raw table has three independent entities mixed together: +-- - Customer (name, status, total_mileage) → depends only on customer +-- - Aircraft (name, total_seats) → depends only on aircraft +-- - Flight (flight_number, mileage, aircraft) → depends only on flight +-- - Booking → junction between customer and flight +-- + +-- STEP3 + +-- Aircrafts table + +CREATE TABLE aircrafts ( + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(100) NOT NULL, + total_seats INT NOT NULL); + +-- Customers table + +CREATE TABLE customers ( + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + status VARCHAR(50), + total_mileage INT); + +-- Flights table (references aircraft) + +CREATE TABLE flights ( + flight_number VARCHAR(10) PRIMARY KEY, + aircraft_id INT NOT NULL, + mileage INT NOT NULL, + FOREIGN KEY (aircraft_id) REFERENCES aircrafts(id)); + +-- Bookings table (junction: customer ↔ flight) + +CREATE TABLE bookings ( + id INT PRIMARY KEY AUTO_INCREMENT, + customer_id INT NOT NULL, + flight_number VARCHAR(10) NOT NULL, + FOREIGN KEY (customer_id) REFERENCES customers(id), + FOREIGN KEY (flight_number) REFERENCES flights(flight_number)); + +-- STEP4 + +INSERT INTO aircrafts (name, total_seats) VALUES +('Boeing 747', 120), +('Airbus A330', 216), +('Boeing 777', 344); + +INSERT INTO customers (name, status, total_mileage) VALUES +('Agustine Riviera', 'Silver', 1788235), +('Alaina Sepulvida', NULL, 62028), +('Tom Jones', 'Gold', 1345767), +('Sam Rio', NULL, 269653), +('Jessica James', 'Silver', 1278676), +('Ana Janco', 'Silver', 13233273), +('Jennifer Cortez', 'Gold', 3220582), +('Christian Janco', 'Silver', 1466742); + +INSERT INTO flights (flight_number, aircraft_id, mileage) VALUES +('DL143', 1, 1323), +('DL122', 2, 3479), +('DL53', 3, 2988), +('DL222', 3, 10065), +('DL37', 1, 539); + +INSERT INTO bookings (customer_id, flight_number) VALUES +(1, 'DL143'), +(1, 'DL121'), +(2, 'DL122'), +(3, 'DL123'), +(3, 'DL53'), +(3, 'DL242'), +(4, 'DL143'), +(4, 'DL37'), +(5, 'DL143'), +(5, 'DL142'), +(6, 'DL222'), +(7, 'DL222'), +(8, 'DL262'); \ No newline at end of file diff --git a/Exercise3.sql b/Exercise3.sql new file mode 100644 index 0000000..96a04ad --- /dev/null +++ b/Exercise3.sql @@ -0,0 +1,49 @@ +1. Total number of flights +SELECT COUNT(DISTINCT flight_number) AS total_flights +FROM flights; + +-- 2. Average flight distance +SELECT AVG(mileage) AS avg_flight_distance +FROM flights; + +-- 3. Average number of seats per aircraft +SELECT AVG(total_seats) AS avg_seats_per_aircraft +FROM aircrafts; + +-- 4. Average miles flown by customers, grouped by status +SELECT status, AVG(total_mileage) AS avg_mileage +FROM customers +GROUP BY status; + +-- 5. Max miles flown by customers, grouped by status +SELECT status, MAX(total_mileage) AS max_mileage +FROM customers +GROUP BY status; + +-- 6. Number of aircrafts with "Boeing" in their name +SELECT COUNT(*) AS boeing_count +FROM aircrafts +WHERE name LIKE '%Boeing%'; + +-- 7. Flights with distance between 300 and 2000 miles +SELECT * +FROM flights +WHERE mileage BETWEEN 300 AND 2000; + +-- 8. Average flight distance booked, grouped by customer status +SELECT c.status, AVG(f.mileage) AS avg_booked_distance +FROM bookings b +JOIN customers c ON b.customer_id = c.id +JOIN flights f ON b.flight_number = f.flight_number +GROUP BY c.status; + +-- 9. Most booked aircraft among Gold status members +SELECT a.name, COUNT(*) AS total_bookings +FROM bookings b +JOIN customers c ON b.customer_id = c.id +JOIN flights f ON b.flight_number = f.flight_number +JOIN aircrafts a ON f.aircraft_id = a.id +WHERE c.status = 'Gold' +GROUP BY a.name +ORDER BY total_bookings DESC +LIMIT 1; \ No newline at end of file