From c2a79e343c581e3b884f02243eb5b084774ffecd Mon Sep 17 00:00:00 2001 From: Sevinc Date: Sat, 21 Mar 2026 22:07:42 +0400 Subject: [PATCH] lab2 done --- README.md | 140 ------------------------------------------ erd.mwb | Bin 0 -> 9794 bytes lab2.sql | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 180 insertions(+), 140 deletions(-) delete mode 100644 README.md create mode 100644 erd.mwb create mode 100644 lab2.sql diff --git a/README.md b/README.md deleted file mode 100644 index 648766e..0000000 --- a/README.md +++ /dev/null @@ -1,140 +0,0 @@ -![logo_ironhack_blue 7](https://user-images.githubusercontent.com/23629340/40541063-a07a0a8a-601a-11e8-91b5-2f13e4e6b441.png) - -# LAB | SQL Normalization, DDL & Aggregation - -### Instructions - -1. Fork this repo. -2. Clone your fork to your local machine. -3. Solve the challenges. - - -## Deliverables - -- Upon completion, add your solution to git. -- Then commit to git and push to your repo on GitHub. -- Make a pull request and paste the pull request link in the submission field in the Student Portal. - - -## Exercise 1: Normalize a Blog Database - -**Step 1:** Given the following raw dataset, identify redundancies and normalize the data (at least to 3NF). - -
- -| **author** | **title** | **word_count** | **views** | -|----------------|-----------------------------|------------|-------| -| Maria Charlotte| Best Paint Colors | 814 | 14 | -| Juan Perez | Small Space Decorating Tips | 1146 | 221 | -| Maria Charlotte| Hot Accessories | 986 | 105 | -| Maria Charlotte| Mixing Textures | 765 | 22 | -| Juan Perez | Kitchen Refresh | 1242 | 307 | -| Maria Charlotte| Homemade Art Hacks | 1002 | 193 | -| Gemma Alcocer | Refinishing Wood Floors | 1571 | 7542 | - -
- -**Step 2:** Write the DDL (`CREATE TABLE` statements) to implement your normalized schema. - -**Step 3 (Optional):** Insert the sample data using `INSERT INTO`. - -## Exercise 2: Normalize an Airline Database - -**Step 1:** Normalize the following data (again, at least up to 3NF): - -
- -| **Customer Name** | **Customer Status** | **Flight Number** | **Aircraft** | **Total Aircraft Seats** | **Flight Mileage** | **Total Customer Mileage** | -| ---------------- | --------------- | ------------- | ----------- | -------------------- | -------------- | ---------------------- | -| Agustine Riviera | Silver | DL143 | Boeing 747 | 400 | 135 | 115235 | -| Agustine Riviera | Silver | DL122 | Airbus A330 | 236 | 4370 | 115235 | -| Alaina Sepulvida | None | DL122 | Airbus A330 | 236 | 4370 | 6008 | -| Agustine Riviera | Silver | DL143 | Boeing 747 | 400 | 135 | 115235 | -| Tom Jones | Gold | DL122 | Airbus A330 | 236 | 4370 | 205767 | -| Tom Jones | Gold | DL53 | Boeing 777 | 264 | 2078 | 205767 | -| Agustine Riviera | Silver | DL143 | Boeing 747 | 400 | 135 | 115235 | -| Sam Rio | None | DL143 | Boeing 747 | 400 | 135 | 2653 | -| Agustine Riviera | Silver | DL143 | Boeing 747 | 400 | 135 | 115235 | -| Tom Jones | Gold | DL222 | Boeing 777 | 264 | 1765 | 205767 | -| Jessica James | Silver | DL143 | Boeing 747 | 400 | 135 | 127656 | -| Sam Rio | None | DL143 | Boeing 747 | 400 | 135 | 2653 | -| Ana Janco | Silver | DL222 | Boeing 777 | 264 | 1765 | 136773 | -| Jennifer Cortez | Gold | DL222 | Boeing 777 | 264 | 1765 | 300582 | -| Jessica James | Silver | DL122 | Airbus A330 | 236 | 4370 | 127656 | -| Sam Rio | None | DL37 | Boeing 747 | 400 | 531 | 2653 | -| Christian Janco | Silver | DL222 | Boeing 777 | 264 | 1765 | 14642 | - -
- -**Step 2:** Identify functional dependencies and decompose into smaller, related tables: -- `customers` -- `flights` -- `aircrafts` -- `bookings` - -**Step 3:** Write the DDL scripts (`CREATE TABLE` + `FOREIGN KEY` constraints). - -**Step 4:** Insert the sample data. - -## Exercise 3: Write SQL Queries on the Airline Database - -Use the schema you created in Exercise 2 to answer the following: - -1. Total number of flights: -```sql -SELECT COUNT(DISTINCT flight_number) FROM flights; -``` -2. Average flight distance: -```sql -SELECT AVG(mileage) FROM flights; -``` -3. Average number of seats per aircraft: -```sql -SELECT AVG(total_seats) FROM aircrafts; -``` -4. Average miles flown by customers, grouped by status: -```sql -SELECT status, AVG(total_mileage) FROM customers GROUP BY status; -``` -5. Max miles flown by customers, grouped by status: -```sql -SELECT status, MAX(total_mileage) FROM customers GROUP BY status; -``` -6. Number of aircrafts with "Boeing" in their name: -```sql -SELECT COUNT(*) FROM aircrafts WHERE name LIKE '%Boeing%'; -``` -7. Flights with distance between 300 and 2000 miles: -```sql -SELECT * FROM flights WHERE mileage BETWEEN 300 AND 2000; -``` -8. Average flight distance **booked**, grouped by customer status: -```sql -SELECT c.status, AVG(f.mileage) -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: -```sql -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; -``` - -## Extra Challenge - -- Create `ERD` diagrams to visualize both schemas. -- Use `CHECK`, `NOT NULL`, and `UNIQUE` constraints where appropriate. -- Add indexes where you think performance can improve. - -
- -**Have fun querying!** :dart: \ No newline at end of file diff --git a/erd.mwb b/erd.mwb new file mode 100644 index 0000000000000000000000000000000000000000..8dbdfb4b19d86ecb5d918fb7ac86168fa69d2f54 GIT binary patch literal 9794 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 XEFDeVg{d4t7G`Wz4yI