From b51756c5332937088422777bc1f71b6c3ce1621c Mon Sep 17 00:00:00 2001 From: Eduardo Montealvo Date: Tue, 12 Aug 2025 23:55:48 +0200 Subject: [PATCH 1/4] Final lab solution files added --- cars.mwb | Bin 0 -> 8120 bytes cars.mwb.bak | Bin 0 -> 7927 bytes creation.sql | 0 final_query_output.csv | 4 + ironhack_lab_solution.sql | 1342 +++++++++++++++++++++++++++++++++++++ 5 files changed, 1346 insertions(+) create mode 100644 cars.mwb create mode 100644 cars.mwb.bak create mode 100644 creation.sql create mode 100644 final_query_output.csv create mode 100644 ironhack_lab_solution.sql diff --git a/cars.mwb b/cars.mwb new file mode 100644 index 0000000000000000000000000000000000000000..7a23e34dd2679b1d4e12af96ad8e170c81a373de GIT binary patch literal 8120 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 Honda +UPDATE invoices SET car_id = 2 WHERE id = 2; -- INV-0002 -> Mercedes +UPDATE invoices SET car_id = 1 WHERE id = 3; -- INV-0003 -> Honda + +-- Sanity check: should show matching car_table_id values (not NULL) +SELECT i.id, i.invoice_num, i.car_id, ca.id AS car_table_id +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +WHERE i.car_id IS NULL OR ca.id IS NULL; +-- Ok if it says the index already exists +CREATE INDEX idx_invoices_car_id ON invoices(car_id); + +ALTER TABLE invoices + ADD CONSTRAINT fk_invoices_car + FOREIGN KEY (car_id) REFERENCES cars(id); + SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id +USE ironhack_lab; + +-- Quick data peek +SELECT * FROM invoices; +SELECT * FROM customers; +SELECT * FROM salespersons; +SELECT * FROM cars; + +-- Diagnose each link (NULL on the right means the match failed) +SELECT i.id, i.invoice_num, i.cust_id, c.cust_id AS match_customer +FROM invoices i LEFT JOIN customers c ON i.cust_id = c.cust_id; + +SELECT i.id, i.staff_id, s.staff_id AS match_staff +FROM invoices i LEFT JOIN salespersons s ON i.staff_id = s.staff_id; + +SELECT i.id, i.car_id, ca.id AS match_car +FROM invoices i LEFT JOIN cars ca ON i.car_id = ca.id; +USE ironhack_lab; + +-- Link the first two invoices to real cars (IDs from your cars table) +UPDATE invoices SET car_id = 1 WHERE id = 1; -- INV-0001 -> car id 1 +UPDATE invoices SET car_id = 2 WHERE id = 2; -- INV-0002 -> car id 2 + +-- Quick check (should show no NULLs) +SELECT i.id, i.car_id, ca.id AS match_car +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +WHERE i.car_id IS NULL OR ca.id IS NULL; + +-- Final proof +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id; +USE ironhack_lab; + +-- 1) Ensure base data exists (no duplicates) +INSERT INTO cars (vin, manufacturer, model, year, color) +VALUES +('1HGCM82633A004352','Honda','Civic',2020,'Blue'), +('WDBUF56X38B123456','Mercedes','E350',2018,'Black') +ON DUPLICATE KEY UPDATE vin = vin; -- no-op if already there + +INSERT INTO customers (cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) +VALUES +('C001','Alice Smith','555-1234','alice@example.com','123 Main St','New York','NY','USA'), +('C002','John Doe','555-5678','john@example.com','456 Park Ave','New York','NY','USA'), +('C003','Maria Lopez','555-8765','maria@example.com','789 Broadway','New York','NY','USA') +ON DUPLICATE KEY UPDATE cust_name = cust_name; + +INSERT INTO salespersons (staff_id, name, store) +VALUES +('S001','Bob Jones','Downtown'), +('S002','Eva Lee','Uptown'), +('S003','Carlos Perez','Midtown') +ON DUPLICATE KEY UPDATE name = name; + +-- 2) Point invoices to real cars (IDs 1 & 2 after the inserts above) +UPDATE invoices SET car_id = 1 WHERE id = 1; +UPDATE invoices SET car_id = 2 WHERE id = 2; +UPDATE invoices SET car_id = 1 WHERE id = 3; + +-- 3) Quick sanity (should be 0 rows) +SELECT i.id, i.car_id, ca.id AS car_table_id +FROM invoices i LEFT JOIN cars ca ON i.car_id = ca.id +WHERE i.car_id IS NULL OR ca.id IS NULL; + +-- 4) Final proof (should show 3 rows) +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id; + USE ironhack_lab; + +-- Customer match (right column must NOT be NULL) +SELECT i.id, i.invoice_num, i.cust_id, c.cust_id AS match_customer +FROM invoices i LEFT JOIN customers c ON i.cust_id = c.cust_id; + +-- Salesperson match (right column must NOT be NULL) +SELECT i.id, i.invoice_num, i.staff_id, s.staff_id AS match_staff +FROM invoices i LEFT JOIN salespersons s ON i.staff_id = s.staff_id; +-- Customers +INSERT INTO customers (cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) +VALUES +('C001','Alice Smith','555-1234','alice@example.com','123 Main St','New York','NY','USA'), +('C002','John Doe','555-5678','john@example.com','456 Park Ave','New York','NY','USA'), +('C003','Maria Lopez','555-8765','maria@example.com','789 Broadway','New York','NY','USA') +ON DUPLICATE KEY UPDATE cust_name = VALUES(cust_name); + +-- Salespersons +INSERT INTO salespersons (staff_id, name, store) +VALUES +('S001','Bob Jones','Downtown'), +('S002','Eva Lee','Uptown'), +('S003','Carlos Perez','Midtown') +ON DUPLICATE KEY UPDATE name = VALUES(name); +USE ironhack_lab; + +-- 1) Do we have customers? +SELECT COUNT(*) AS customers_rows FROM customers; + +-- 2) If 0, (re)insert customers (safe: no duplicates) +INSERT INTO customers (cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) +VALUES +('C001','Alice Smith','555-1234','alice@example.com','123 Main St','New York','NY','USA'), +('C002','John Doe','555-5678','john@example.com','456 Park Ave','New York','NY','USA'), +('C003','Maria Lopez','555-8765','maria@example.com','789 Broadway','New York','NY','USA') +ON DUPLICATE KEY UPDATE cust_name = VALUES(cust_name); + +-- 3) Quick customer match check (right column must NOT be NULL) +SELECT i.id, i.invoice_num, i.cust_id, c.cust_id AS match_customer +FROM invoices i LEFT JOIN customers c ON i.cust_id = c.cust_id; + +-- 4) Final proof (should now show 3 rows) +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id; +USE ironhack_lab; + +SELECT + SUM(ca.id IS NULL) AS missing_car_links, + SUM(c.cust_id IS NULL) AS missing_customer_links, + SUM(s.staff_id IS NULL) AS missing_staff_links +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id; +USE ironhack_lab; + +-- Fix missing cars (assuming IDs 1 and 2 exist in cars table) +UPDATE invoices SET car_id = 1 WHERE car_id IS NULL AND id IN (1,3); +UPDATE invoices SET car_id = 2 WHERE car_id IS NULL AND id = 2; + +-- Fix missing customers (assuming C001, C002, C003 exist in customers table) +UPDATE invoices SET cust_id = 'C001' WHERE cust_id IS NULL AND id = 1; +UPDATE invoices SET cust_id = 'C002' WHERE cust_id IS NULL AND id = 2; +UPDATE invoices SET cust_id = 'C003' WHERE cust_id IS NULL AND id = 3; + +-- Re-check: should all be zero now +SELECT + SUM(ca.id IS NULL) AS missing_car_links, + SUM(c.cust_id IS NULL) AS missing_customer_links, + SUM(s.staff_id IS NULL) AS missing_staff_links +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id; + +-- Final joined query (should now show data) +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id; +USE ironhack_lab; + +-- 0) Make sure the parent rows exist (no duplicates will be created) +INSERT INTO cars (vin, manufacturer, model, year, color) VALUES +('1HGCM82633A004352','Honda','Civic',2020,'Blue'), +('WDBUF56X38B123456','Mercedes','E350',2018,'Black') +ON DUPLICATE KEY UPDATE vin = vin; + +INSERT INTO customers (cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) VALUES +('C001','Alice Smith','555-1234','alice@example.com','123 Main St','New York','NY','USA'), +('C002','John Doe','555-5678','john@example.com','456 Park Ave','New York','NY','USA'), +('C003','Maria Lopez','555-8765','maria@example.com','789 Broadway','New York','NY','USA') +ON DUPLICATE KEY UPDATE cust_name = cust_name; + +INSERT INTO salespersons (staff_id, name, store) VALUES +('S001','Bob Jones','Downtown'), +('S002','Eva Lee','Uptown'), +('S003','Carlos Perez','Midtown') +ON DUPLICATE KEY UPDATE name = name; + +-- 1) Link INVOICES → CUSTOMERS (by invoice_num so it’s unambiguous) +UPDATE invoices SET cust_id = 'C001' WHERE invoice_num = 'INV-0001'; +UPDATE invoices SET cust_id = 'C002' WHERE invoice_num = 'INV-0002'; +UPDATE invoices SET cust_id = 'C003' WHERE invoice_num = 'INV-0003'; + +-- 2) Link INVOICES → SALESPERSONS (harmless if already set) +UPDATE invoices SET staff_id = 'S001' WHERE invoice_num = 'INV-0001'; +UPDATE invoices SET staff_id = 'S002' WHERE invoice_num = 'INV-0002'; +UPDATE invoices SET staff_id = 'S003' WHERE invoice_num = 'INV-0003'; + +-- 3) Link INVOICES → CARS +-- (we inserted only two cars, so their ids are the first two in the table) +-- set INV-0001 and INV-0003 to the first car id, and INV-0002 to the second +UPDATE invoices SET car_id = (SELECT id FROM cars ORDER BY id LIMIT 1) +WHERE invoice_num IN ('INV-0001','INV-0003'); + +UPDATE invoices SET car_id = (SELECT id FROM cars ORDER BY id LIMIT 1 OFFSET 1) +WHERE invoice_num = 'INV-0002'; + +-- 4) Sanity check — these must all be 0 +SELECT + SUM(ca.id IS NULL) AS missing_car_links, + SUM(c.cust_id IS NULL) AS missing_customer_links, + SUM(s.staff_id IS NULL) AS missing_staff_links +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id; + +-- 5) Final proof (this should finally show 3 rows) +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id; +USE ironhack_lab; + +-- 0) Make sure the parent rows exist (no duplicates will be created) +INSERT INTO cars (vin, manufacturer, model, year, color) VALUES +('1HGCM82633A004352','Honda','Civic',2020,'Blue'), +('WDBUF56X38B123456','Mercedes','E350',2018,'Black') +ON DUPLICATE KEY UPDATE vin = vin; + +INSERT INTO customers (cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) VALUES +('C001','Alice Smith','555-1234','alice@example.com','123 Main St','New York','NY','USA'), +('C002','John Doe','555-5678','john@example.com','456 Park Ave','New York','NY','USA'), +('C003','Maria Lopez','555-8765','maria@example.com','789 Broadway','New York','NY','USA') +ON DUPLICATE KEY UPDATE cust_name = cust_name; + +INSERT INTO salespersons (staff_id, name, store) VALUES +('S001','Bob Jones','Downtown'), +('S002','Eva Lee','Uptown'), +('S003','Carlos Perez','Midtown') +ON DUPLICATE KEY UPDATE name = name; + +-- 1) Link INVOICES → CUSTOMERS (by invoice_num so it’s unambiguous) +UPDATE invoices SET cust_id = 'C001' WHERE invoice_num = 'INV-0001'; +UPDATE invoices SET cust_id = 'C002' WHERE invoice_num = 'INV-0002'; +UPDATE invoices SET cust_id = 'C003' WHERE invoice_num = 'INV-0003'; + +-- 2) Link INVOICES → SALESPERSONS (harmless if already set) +UPDATE invoices SET staff_id = 'S001' WHERE invoice_num = 'INV-0001'; +UPDATE invoices SET staff_id = 'S002' WHERE invoice_num = 'INV-0002'; +UPDATE invoices SET staff_id = 'S003' WHERE invoice_num = 'INV-0003'; + +-- 3) Link INVOICES → CARS +-- (we inserted only two cars, so their ids are the first two in the table) +-- set INV-0001 and INV-0003 to the first car id, and INV-0002 to the second +UPDATE invoices SET car_id = (SELECT id FROM cars ORDER BY id LIMIT 1) +WHERE invoice_num IN ('INV-0001','INV-0003'); + +UPDATE invoices SET car_id = (SELECT id FROM cars ORDER BY id LIMIT 1 OFFSET 1) +WHERE invoice_num = 'INV-0002'; + +-- 4) Sanity check — these must all be 0 +SELECT + SUM(ca.id IS NULL) AS missing_car_links, + SUM(c.cust_id IS NULL) AS missing_customer_links, + SUM(s.staff_id IS NULL) AS missing_staff_links +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id; + +-- 5) Final proof (this should finally show 3 rows) +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id; +USE ironhack_lab; + +/* 1) Make sure parent rows exist (idempotent) */ +INSERT INTO cars (vin, manufacturer, model, year, color) VALUES +('1HGCM82633A004352','Honda','Civic', 2020,'Blue'), +('WDBUF56X38B123456','Mercedes','E350', 2018,'Black') +ON DUPLICATE KEY UPDATE vin = vin; + +INSERT INTO customers +(cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) +VALUES +('C001', 'Alice Smith', '555-1234', 'alice@example.com', '123 Main St', 'New York','NY','USA'), +('C002', 'John Doe', '555-5678', 'john@example.com', '456 Park Ave', 'New York','NY','USA'), +('C003', 'Maria Lopez', '555-8765', 'maria@example.com', '789 Broadway', 'New York','NY','USA') +ON DUPLICATE KEY UPDATE cust_name = cust_name; + +INSERT INTO salespersons (staff_id, name, store) +VALUES +('S001', 'Bob Jones', 'Downtown'), +('S002', 'Eva Lee', 'Uptown'), +('S003', 'Carlos Perez','Midtown') +ON DUPLICATE KEY UPDATE name = name; + +/* 2) Link each invoice to real parents (use invoice_num so Safe Updates won’t block) */ +-- Customers +UPDATE invoices SET cust_id = 'C001' WHERE invoice_num = 'INV-0001'; +UPDATE invoices SET cust_id = 'C002' WHERE invoice_num = 'INV-0002'; +UPDATE invoices SET cust_id = 'C003' WHERE invoice_num = 'INV-0003'; + +-- Salespersons +UPDATE invoices SET staff_id = 'S001' WHERE invoice_num = 'INV-0001'; +UPDATE invoices SET staff_id = 'S002' WHERE invoice_num = 'INV-0002'; +UPDATE invoices SET staff_id = 'S003' WHERE invoice_num = 'INV-0003'; + +-- Cars: use the first two car IDs in the table (works no matter what the actual IDs are) +UPDATE invoices +SET car_id = (SELECT id FROM cars ORDER BY id LIMIT 1) +WHERE invoice_num IN ('INV-0001','INV-0003'); + +UPDATE invoices +SET car_id = (SELECT id FROM cars ORDER BY id LIMIT 1 OFFSET 1) +WHERE invoice_num = 'INV-0002'; + +/* 3) Sanity: all zeros means joins will return rows */ +SELECT + SUM(ca.id IS NULL) AS missing_car_links, + SUM(c.cust_id IS NULL) AS missing_customer_links, + SUM(s.staff_id IS NULL) AS missing_staff_links +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id; + +/* 4) Final proof (take this screenshot) */ +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id; +USE ironhack_lab; + +-- Make sure parent rows exist (won’t create duplicates) +INSERT INTO cars (vin, manufacturer, model, year, color) VALUES +('1HGCM82633A004352','Honda','Civic',2020,'Blue'), +('WDBUF56X38B123456','Mercedes','E350',2018,'Black') +ON DUPLICATE KEY UPDATE vin = vin; + +INSERT INTO customers (cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) VALUES +('C001','Alice Smith','555-1234','alice@example.com','123 Main St','New York','NY','USA'), +('C002','John Doe','555-5678','john@example.com','456 Park Ave','New York','NY','USA'), +('C003','Maria Lopez','555-8765','maria@example.com','789 Broadway','New York','NY','USA') +ON DUPLICATE KEY UPDATE cust_name = cust_name; + +INSERT INTO salespersons (staff_id, name, store) VALUES +('S001','Bob Jones','Downtown'), +('S002','Eva Lee','Uptown'), +('S003','Carlos Perez','Midtown') +ON DUPLICATE KEY UPDATE name = name; + +-- Link INVOICES → CUSTOMERS (by invoice_num so safe-updates won’t block) +UPDATE invoices SET cust_id = 'C001' WHERE invoice_num = 'INV-0001'; +UPDATE invoices SET cust_id = 'C002' WHERE invoice_num = 'INV-0002'; +UPDATE invoices SET cust_id = 'C003' WHERE invoice_num = 'INV-0003'; + +-- Link INVOICES → SALESPERSONS +UPDATE invoices SET staff_id = 'S001' WHERE invoice_num = 'INV-0001'; +UPDATE invoices SET staff_id = 'S002' WHERE invoice_num = 'INV-0002'; +UPDATE invoices SET staff_id = 'S003' WHERE invoice_num = 'INV-0003'; + +-- Link INVOICES → CARS (use the first two car IDs that exist) +UPDATE invoices +SET car_id = (SELECT id FROM cars ORDER BY id LIMIT 1) +WHERE invoice_num IN ('INV-0001','INV-0003'); + +UPDATE invoices +SET car_id = (SELECT id FROM cars ORDER BY id LIMIT 1 OFFSET 1) +WHERE invoice_num = 'INV-0002'; + +-- Sanity: must all be zeros +SELECT + SUM(ca.id IS NULL) AS missing_car_links, + SUM(c.cust_id IS NULL) AS missing_customer_links, + SUM(s.staff_id IS NULL) AS missing_staff_links +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id; + +-- Final proof (should show 3 rows) +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id; +USE ironhack_lab; + +-- Replace the 3 invoices with clean, linked rows +DELETE FROM invoices; + +INSERT INTO invoices (invoice_num, cust_id, staff_id, car_id) +VALUES +('INV-0001','C001','S001',(SELECT id FROM cars ORDER BY id LIMIT 1)), +('INV-0002','C002','S002',(SELECT id FROM cars ORDER BY id LIMIT 1 OFFSET 1)), +('INV-0003','C003','S003',(SELECT id FROM cars ORDER BY id LIMIT 1)); + +-- Final proof +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id; + +USE ironhack_lab; + +-- 1) Make sure parent rows exist (idempotent) +INSERT INTO cars (vin, manufacturer, model, year, color) VALUES +('1HGCM82633A004352','Honda','Civic', 2020,'Blue'), +('WDBUF56X38B123456','Mercedes','E350', 2018,'Black') +ON DUPLICATE KEY UPDATE vin = vin; + +INSERT INTO customers +(cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) +VALUES +('C001', 'Alice Smith', '555-1234', 'alice@example.com', '123 Main St', 'New York','NY','USA'), +('C002', 'John Doe', '555-5678', 'john@example.com', '456 Park Ave', 'New York','NY','USA'), +('C003', 'Maria Lopez', '555-8765', 'maria@example.com', '789 Broadway', 'New York','NY','USA') +ON DUPLICATE KEY UPDATE cust_name = cust_name; + +INSERT INTO salespersons (staff_id, name, store) +VALUES +('S001', 'Bob Jones', 'Downtown'), +('S002', 'Eva Lee', 'Uptown'), +('S003', 'Carlos Perez','Midtown') +ON DUPLICATE KEY UPDATE name = name; + +-- 2) Grab two real car IDs from whatever is in the table +SET @car1 := (SELECT id FROM cars ORDER BY id LIMIT 1); +SET @car2 := (SELECT id FROM cars ORDER BY id LIMIT 1 OFFSET 1); + +-- Safety: if there is only 1 car row, reuse it +SET @car2 := COALESCE(@car2, @car1); + +-- 3) UPSERT the invoices by invoice_num (guarantees they exist with correct FKs) +INSERT INTO invoices (invoice_num, cust_id, staff_id, car_id) +VALUES +('INV-0001','C001','S001',@car1), +('INV-0002','C002','S002',@car2), +('INV-0003','C003','S003',@car1) +ON DUPLICATE KEY UPDATE + cust_id = VALUES(cust_id), + staff_id = VALUES(staff_id), + car_id = VALUES(car_id); + +-- 4) Sanity (should all be zeros) +SELECT + SUM(ca.id IS NULL) AS missing_car_links, + SUM(c.cust_id IS NULL) AS missing_customer_links, + SUM(s.staff_id IS NULL) AS missing_staff_links +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id; + +-- 5) FINAL RESULT (this is your screenshot) +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id; + +USE ironhack_lab; + +SET SQL_SAFE_UPDATES = 0; + +/* 1) Ensure parent rows exist (idempotent; won’t duplicate) */ +INSERT IGNORE INTO cars (vin, manufacturer, model, year, color) VALUES +('VIN-AAA-001','Honda','Civic', 2020,'Blue'), +('VIN-AAA-002','Mercedes','E350', 2018,'Black'); + +INSERT INTO customers +(cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) +VALUES +('C001', 'Alice Smith', '555-1234', 'alice@example.com', '123 Main St', 'New York','NY','USA'), +('C002', 'John Doe', '555-5678', 'john@example.com', '456 Park Ave', 'New York','NY','USA'), +('C003', 'Maria Lopez', '555-8765', 'maria@example.com', '789 Broadway', 'New York','NY','USA') +ON DUPLICATE KEY UPDATE cust_name = cust_name; + +INSERT INTO salespersons (staff_id, name, store) VALUES +('S001', 'Bob Jones', 'Downtown'), +('S002', 'Eva Lee', 'Uptown'), +('S003', 'Carlos Perez', 'Midtown') +ON DUPLICATE KEY UPDATE name = name; + +/* 2) Get concrete car IDs for the two VINs we just ensured */ +SET @car1 := (SELECT id FROM cars WHERE vin='VIN-AAA-001' LIMIT 1); +SET @car2 := (SELECT id FROM cars WHERE vin='VIN-AAA-002' LIMIT 1); + +/* 3) Upsert the 3 invoices so they DEFINITELY exist and link correctly */ +-- If invoice_num is unique, this updates; if not, it inserts new rows. +INSERT INTO invoices (invoice_num, cust_id, staff_id, car_id) VALUES +('INV-0001','C001','S001',@car1), +('INV-0002','C002','S002',@car2), +('INV-0003','C003','S003',@car1) +ON DUPLICATE KEY UPDATE + cust_id = VALUES(cust_id), + staff_id = VALUES(staff_id), + car_id = VALUES(car_id); + +/* 4) Sanity: these MUST all be zero now */ +SELECT + SUM(ca.id IS NULL) AS missing_car_links, + SUM(c.cust_id IS NULL) AS missing_customer_links, + SUM(s.staff_id IS NULL) AS missing_staff_links +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id; + +/* 5) FINAL RESULT — take this screenshot */ +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, ca.model, ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id; +USE ironhack_lab; + +SELECT + (SELECT COUNT(*) FROM invoices) AS invoices, + (SELECT COUNT(*) FROM invoices i JOIN customers c ON i.cust_id = c.cust_id) AS after_customers, + (SELECT COUNT(*) FROM invoices i JOIN customers c ON i.cust_id=c.cust_id + JOIN salespersons s ON i.staff_id=s.staff_id) AS after_salespersons, + (SELECT COUNT(*) FROM invoices i JOIN customers c ON i.cust_id=c.cust_id + JOIN salespersons s ON i.staff_id=s.staff_id + JOIN cars ca ON i.car_id = ca.id) AS final_inner; + SELECT + i.invoice_num, + COALESCE(c.cust_name,'(no customer)') AS cust_name, + COALESCE(s.name,'(no salesperson)') AS salesperson, + COALESCE(ca.manufacturer,'(no car)') AS manufacturer, + COALESCE(ca.model,'') AS model, + ca.year +FROM invoices i +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id +LEFT JOIN cars ca ON i.car_id = ca.id +ORDER BY i.invoice_num; +USE ironhack_lab; + +-- 1) Make sure the parent rows exist (safe if they already do) +INSERT INTO customers(cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) VALUES +('C001','Alice Smith','555-1234','alice@example.com','123 Main St','New York','NY','USA'), +('C002','John Doe','555-5678','john@example.com','456 Park Ave','New York','NY','USA'), +('C003','Maria Lopez','555-8765','maria@example.com','789 Broadway','New York','NY','USA') +ON DUPLICATE KEY UPDATE cust_name = VALUES(cust_name); + +INSERT INTO salespersons(staff_id, name, store) VALUES +('S001','Bob Jones','Downtown'), +('S002','Eva Lee','Uptown'), +('S003','Carlos Perez','Midtown') +ON DUPLICATE KEY UPDATE name = VALUES(name); + +INSERT INTO cars(vin, manufacturer, model, year, color) VALUES +('VIN-AAA-001','Honda','Civic',2020,'Blue'), +('VIN-AAA-002','Mercedes','E350',2018,'Black') +ON DUPLICATE KEY UPDATE manufacturer = VALUES(manufacturer); + +-- 2) Get the car ids we just ensured exist +SET @car1 := (SELECT id FROM cars WHERE vin='VIN-AAA-001' LIMIT 1); +SET @car2 := (SELECT id FROM cars WHERE vin='VIN-AAA-002' LIMIT 1); + +-- 3) Point each invoice to real parents (adjust if your invoice_nums differ) +UPDATE invoices SET cust_id='C001', staff_id='S001', car_id=@car1 WHERE invoice_num='INV-0001'; +UPDATE invoices SET cust_id='C002', staff_id='S002', car_id=@car2 WHERE invoice_num='INV-0002'; +UPDATE invoices SET cust_id='C003', staff_id='S003', car_id=@car1 WHERE invoice_num='INV-0003'; + +-- 4) Quick proof with INNER JOIN (should now return 3 rows) +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, + ca.model, + ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id +ORDER BY i.invoice_num; +ALTER TABLE invoices + ADD INDEX idx_invoices_cust (cust_id), + ADD INDEX idx_invoices_staff (staff_id), + ADD INDEX idx_invoices_car (car_id), + ADD CONSTRAINT fk_invoices_cust FOREIGN KEY (cust_id) REFERENCES customers(cust_id), + ADD CONSTRAINT fk_invoices_staff FOREIGN KEY (staff_id) REFERENCES salespersons(staff_id), + ADD CONSTRAINT fk_invoices_car FOREIGN KEY (car_id) REFERENCES cars(id); + USE ironhack_lab; + +INSERT INTO cars (vin, manufacturer, model, year, color) VALUES +('VIN-AAA-001','Honda','Civic',2020,'Blue'), +('VIN-AAA-002','Mercedes','E350',2018,'Black') +ON DUPLICATE KEY UPDATE manufacturer=VALUES(manufacturer), model=VALUES(model), year=VALUES(year), color=VALUES(color); +SELECT id, vin, manufacturer, model, year, color +FROM cars +ORDER BY id; +-- Map each invoice to a VIN, then set car_id from cars.id +UPDATE invoices i +JOIN ( + SELECT 'INV-0001' AS inv, 'VIN-AAA-001' AS vin UNION ALL + SELECT 'INV-0002', 'VIN-AAA-002' UNION ALL + SELECT 'INV-0003', 'VIN-AAA-001' +) m ON m.inv = i.invoice_num +JOIN cars ca ON ca.vin = m.vin +SET i.car_id = ca.id; +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, + ca.model, + ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id +ORDER BY i.invoice_num; +USE ironhack_lab; + +-- 0) sanity (optional) +SELECT COUNT(*) AS invoices_total FROM invoices; + +-- 1) Make sure the cars exist (VIN is unique). This keeps the same IDs if they already exist. +INSERT INTO cars (vin, manufacturer, model, year, color) +VALUES + ('VIN-AAA-001','Honda','Civic', 2020,'Blue'), + ('VIN-AAA-002','Mercedes','E350',2018,'Black') +AS new +ON DUPLICATE KEY UPDATE + manufacturer = new.manufacturer, + model = new.model, + year = new.year, + color = new.color; + +-- 2) Make sure customers and salespersons exist (idempotent upserts) +INSERT INTO customers (cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) +VALUES + ('C001','Alice Smith','555-1234','alice@example.com','123 Main St','New York','NY','USA'), + ('C002','John Doe', '555-5678','john@example.com', '456 Park Ave','New York','NY','USA'), + ('C003','Maria Lopez','555-8765','maria@example.com','789 Broadway','New York','NY','USA') +AS new +ON DUPLICATE KEY UPDATE cust_name = new.cust_name; + +INSERT INTO salespersons (staff_id, name, store) +VALUES + ('S001','Bob Jones','Downtown'), + ('S002','Eva Lee', 'Uptown'), + ('S003','Carlos Perez','Midtown') +AS new +ON DUPLICATE KEY UPDATE name = new.name; + +-- 3) Ensure the three invoices exist and point to the right customer/staff +INSERT INTO invoices (invoice_num, cust_id, staff_id) +VALUES + ('INV-0001','C001','S001'), + ('INV-0002','C002','S002'), + ('INV-0003','C003','S003') +AS new +ON DUPLICATE KEY UPDATE + cust_id = new.cust_id, + staff_id = new.staff_id; + +-- 4) Map each invoice to a car by VIN, then set car_id from cars.id +UPDATE invoices i +JOIN ( + SELECT 'INV-0001' AS inv, 'VIN-AAA-001' AS vin UNION ALL + SELECT 'INV-0002', 'VIN-AAA-002' UNION ALL + SELECT 'INV-0003', 'VIN-AAA-001' +) m ON m.inv = i.invoice_num +JOIN cars ca ON ca.vin = m.vin +SET i.car_id = ca.id; + +-- 5) Final proof (inner joins): should return 3 rows +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, + ca.model, + ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id +ORDER BY i.invoice_num; +USE ironhack_lab; + +-- 0) sanity (optional) +SELECT COUNT(*) AS invoices_total FROM invoices; + +-- 1) Make sure the cars exist (VIN is unique). This keeps the same IDs if they already exist. +INSERT INTO cars (vin, manufacturer, model, year, color) +VALUES + ('VIN-AAA-001','Honda','Civic', 2020,'Blue'), + ('VIN-AAA-002','Mercedes','E350',2018,'Black') +AS new +ON DUPLICATE KEY UPDATE + manufacturer = new.manufacturer, + model = new.model, + year = new.year, + color = new.color; + +-- 2) Make sure customers and salespersons exist (idempotent upserts) +INSERT INTO customers (cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) +VALUES + ('C001','Alice Smith','555-1234','alice@example.com','123 Main St','New York','NY','USA'), + ('C002','John Doe', '555-5678','john@example.com', '456 Park Ave','New York','NY','USA'), + ('C003','Maria Lopez','555-8765','maria@example.com','789 Broadway','New York','NY','USA') +AS new +ON DUPLICATE KEY UPDATE cust_name = new.cust_name; + +INSERT INTO salespersons (staff_id, name, store) +VALUES + ('S001','Bob Jones','Downtown'), + ('S002','Eva Lee', 'Uptown'), + ('S003','Carlos Perez','Midtown') +AS new +ON DUPLICATE KEY UPDATE name = new.name; + +-- 3) Ensure the three invoices exist and point to the right customer/staff +INSERT INTO invoices (invoice_num, cust_id, staff_id) +VALUES + ('INV-0001','C001','S001'), + ('INV-0002','C002','S002'), + ('INV-0003','C003','S003') +AS new +ON DUPLICATE KEY UPDATE + cust_id = new.cust_id, + staff_id = new.staff_id; + +-- 4) Map each invoice to a car by VIN, then set car_id from cars.id +UPDATE invoices i +JOIN ( + SELECT 'INV-0001' AS inv, 'VIN-AAA-001' AS vin UNION ALL + SELECT 'INV-0002', 'VIN-AAA-002' UNION ALL + SELECT 'INV-0003', 'VIN-AAA-001' +) m ON m.inv = i.invoice_num +JOIN cars ca ON ca.vin = m.vin +SET i.car_id = ca.id; + +-- 5) Final proof (inner joins): should return 3 rows +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, + ca.model, + ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id +ORDER BY i.invoice_num; + +USE ironhack_lab; + +-- 1) Cars (with color). If the VINs already exist, update fields. +INSERT INTO cars (vin, manufacturer, model, year, color) +VALUES + ('VIN-AAA-001','Honda','Civic', 2020,'Blue'), + ('VIN-AAA-002','Mercedes','E350',2018,'Black') +AS new +ON DUPLICATE KEY UPDATE + manufacturer = new.manufacturer, + model = new.model, + year = new.year, + color = new.color; + +-- 2) Customers (idempotent) +INSERT INTO customers (cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) +VALUES + ('C001','Alice Smith','555-1234','alice@example.com','123 Main St','New York','NY','USA'), + ('C002','John Doe', '555-5678','john@example.com', '456 Park Ave','New York','NY','USA'), + ('C003','Maria Lopez','555-8765','maria@example.com','789 Broadway','New York','NY','USA') +AS new +ON DUPLICATE KEY UPDATE cust_name = new.cust_name; + +-- 3) Salespersons (idempotent) +INSERT INTO salespersons (staff_id, name, store) +VALUES + ('S001','Bob Jones','Downtown'), + ('S002','Eva Lee', 'Uptown'), + ('S003','Carlos Perez','Midtown') +AS new +ON DUPLICATE KEY UPDATE name = new.name; + +-- 4) Make sure the three invoices exist and point to the right customer/staff (force set by invoice_num) +INSERT INTO invoices (invoice_num, cust_id, staff_id) +VALUES + ('INV-0001','C001','S001'), + ('INV-0002','C002','S002'), + ('INV-0003','C003','S003') +AS new +ON DUPLICATE KEY UPDATE + cust_id = new.cust_id, + staff_id = new.staff_id; + +-- Just in case invoice_num wasn't unique earlier, HARD-SET the ids explicitly: +UPDATE invoices SET cust_id='C001', staff_id='S001' WHERE invoice_num='INV-0001'; +UPDATE invoices SET cust_id='C002', staff_id='S002' WHERE invoice_num='INV-0002'; +UPDATE invoices SET cust_id='C003', staff_id='S003' WHERE invoice_num='INV-0003'; + +-- 5) Map each invoice to a car by VIN → set car_id +UPDATE invoices i +JOIN ( + SELECT 'INV-0001' AS inv, 'VIN-AAA-001' AS vin UNION ALL + SELECT 'INV-0002', 'VIN-AAA-002' UNION ALL + SELECT 'INV-0003', 'VIN-AAA-001' +) m ON m.inv = i.invoice_num +JOIN cars ca ON ca.vin = m.vin +SET i.car_id = ca.id; + +-- 6) Quick diagnostics (should all be zeros) +SELECT + SUM(ca.id IS NULL) AS missing_car_links, + SUM(c.cust_id IS NULL) AS missing_customer_links, + SUM(s.staff_id IS NULL) AS missing_staff_links +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id= s.staff_id; + +-- 7) Final result (INNER JOIN). Expect 3 rows. +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, + ca.model, + ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id +ORDER BY i.invoice_num; +SELECT + i.invoice_num, + COALESCE(c.cust_name,'(no customer)') AS cust_name, + COALESCE(s.name,'(no salesperson)') AS salesperson, + COALESCE(ca.manufacturer,'(no car)') AS manufacturer, + COALESCE(ca.model,'') AS model, + ca.year +FROM invoices i +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id +LEFT JOIN cars ca ON i.car_id = ca.id +ORDER BY i.invoice_num; +USE ironhack_lab; + +-- Ensure the 2 cars exist (with color) +INSERT INTO cars (vin, manufacturer, model, year, color) +VALUES + ('VIN-AAA-001','Honda','Civic', 2020,'Blue'), + ('VIN-AAA-002','Mercedes','E350',2018,'Black') +AS new +ON DUPLICATE KEY UPDATE + manufacturer = new.manufacturer, + model = new.model, + year = new.year, + color = new.color; + +-- Ensure 3 customers exist +INSERT INTO customers (cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_count) +VALUES + ('C001','Alice Smith','555-1234','alice@example.com','123 Main St','New York','NY','USA'), + ('C002','John Doe', '555-5678','john@example.com', '456 Park Ave','New York','NY','USA'), + ('C003','Maria Lopez','555-8765','maria@example.com','789 Broadway','New York','NY','USA') +AS new +ON DUPLICATE KEY UPDATE cust_name = new.cust_name; + +-- Ensure 3 salespersons exist +INSERT INTO salespersons (staff_id, name, store) +VALUES + ('S001','Bob Jones','Downtown'), + ('S002','Eva Lee', 'Uptown'), + ('S003','Carlos Perez','Midtown') +AS new +ON DUPLICATE KEY UPDATE name = new.name; + +-- Ensure invoices exist for those 3, and FORCE their cust/staff +INSERT INTO invoices (invoice_num, cust_id, staff_id) +VALUES + ('INV-0001','C001','S001'), + ('INV-0002','C002','S002'), + ('INV-0003','C003','S003') +AS new +ON DUPLICATE KEY UPDATE + cust_id = new.cust_id, + staff_id = new.staff_id; + +UPDATE invoices SET cust_id='C001', staff_id='S001' WHERE invoice_num='INV-0001'; +UPDATE invoices SET cust_id='C002', staff_id='S002' WHERE invoice_num='INV-0002'; +UPDATE invoices SET cust_id='C003', staff_id='S003' WHERE invoice_num='INV-0003'; + +-- Map each invoice to a car by VIN → set car_id +UPDATE invoices i +JOIN ( + SELECT 'INV-0001' AS inv, 'VIN-AAA-001' AS vin UNION ALL + SELECT 'INV-0002', 'VIN-AAA-002' UNION ALL + SELECT 'INV-0003', 'VIN-AAA-001' +) m ON m.inv = i.invoice_num +JOIN cars ca ON ca.vin = m.vin +SET i.car_id = ca.id; + +-- Sanity: should be 0,0,0 (no missing links) +SELECT + SUM(ca.id IS NULL) AS missing_car_links, + SUM(c.cust_id IS NULL) AS missing_customer_links, + SUM(s.staff_id IS NULL) AS missing_staff_links +FROM invoices i +LEFT JOIN cars ca ON i.car_id = ca.id +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id= s.staff_id; + +-- FINAL (INNER JOIN) – should show 3 rows +SELECT + i.invoice_num, + c.cust_name, + s.name AS salesperson, + ca.manufacturer, + ca.model, + ca.year +FROM invoices i +JOIN customers c ON i.cust_id = c.cust_id +JOIN salespersons s ON i.staff_id = s.staff_id +JOIN cars ca ON i.car_id = ca.id +ORDER BY i.invoice_num + +USE ironhack_lab; + +SELECT + i.invoice_num, + COALESCE(c.cust_name, '(no customer)') AS cust_name, + COALESCE(s.name, '(no salesperson)') AS salesperson, + COALESCE(ca.manufacturer, '(no car)') AS manufacturer, + COALESCE(ca.model, '(no car)') AS model, + COALESCE(CAST(ca.year AS CHAR), '(no car)') AS year +FROM invoices i +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id +LEFT JOIN cars ca ON i.car_id = ca.id +ORDER BY i.invoice_num; +SELECT + i.invoice_num, + COALESCE(c.cust_name, '(no customer)') AS cust_name, + COALESCE(s.name, '(no salesperson)') AS salesperson, + COALESCE(ca.manufacturer, '(no car)') AS manufacturer, + COALESCE(ca.model, '(no car)') AS model, + COALESCE(CAST(ca.year AS CHAR), '(no car)') AS year +FROM invoices i +LEFT JOIN customers c ON i.cust_id = c.cust_id +LEFT JOIN salespersons s ON i.staff_id = s.staff_id +LEFT JOIN cars ca ON i.car_id = ca.id +ORDER BY i.invoice_num; + From 273987eb0b079ba3f6fa7f2b471cc64826a05583 Mon Sep 17 00:00:00 2001 From: Eduardo Montealvo Date: Wed, 13 Aug 2025 00:13:49 +0200 Subject: [PATCH 2/4] Remove MWB files --- cars.mwb | Bin 8120 -> 0 bytes cars.mwb.bak | Bin 7927 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 cars.mwb delete mode 100644 cars.mwb.bak diff --git a/cars.mwb b/cars.mwb deleted file mode 100644 index 7a23e34dd2679b1d4e12af96ad8e170c81a373de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8120 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 Date: Mon, 1 Sep 2025 10:54:33 +0200 Subject: [PATCH 3/4] Add seeding, update and delete SQL scripts --- delete.sql | 5 +++++ seeding.sql | 34 ++++++++++++++++++++++++++++++++++ update.sql | 15 +++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 delete.sql create mode 100644 seeding.sql create mode 100644 update.sql diff --git a/delete.sql b/delete.sql new file mode 100644 index 0000000..bd07b3a --- /dev/null +++ b/delete.sql @@ -0,0 +1,5 @@ +USE lab_mysql; + +DELETE FROM cars +WHERE id = 4 + AND vin = 'DAM41UDN3CHU2WVF6'; diff --git a/seeding.sql b/seeding.sql new file mode 100644 index 0000000..e4d7635 --- /dev/null +++ b/seeding.sql @@ -0,0 +1,34 @@ +USE lab_mysql; + +-- Insert Cars +INSERT INTO cars (id, vin, manufacturer, model, year, color) VALUES +(1, '3K096I98581DHSNUP', 'Volkswagen', 'Tiguan', 2019, 'Blue'), +(2, 'ZM8G7BEUQZ97IH46V', 'Peugeot', 'Rifter', 2019, 'Red'), +(3, 'RKXVNNIHLVVZOUB4M', 'Ford', 'Fusion', 2018, 'White'), +(4, 'HKNDGS7CU31E9Z7JW', 'Toyota', 'RAV4', 2018, 'Silver'), +(5, 'DAM41UDN3CHU2WVF6', 'Volvo', 'V60', 2019, 'Gray'), +(6, 'DAM41UDN3CHU2WVF6', 'Volvo', 'V60 Cross Country', 2019, 'Gray'); + +-- Insert Customers +INSERT INTO customers (id, cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_country, cust_zipcode) VALUES +(0, 10001, 'Pablo Picasso', '+34 636 17 63 82', NULL, 'Paseo de la Chopera, 14', 'Madrid', 'Madrid', 'Spain', 28045), +(1, 20001, 'Abraham Lincoln', '+1 305 907 7086', NULL, '120 SW 8th St', 'Miami', 'Florida', 'United States', 33130), +(2, 30001, 'Napoléon Bonaparte', '+33 1 79 75 40 00', NULL, '40 Rue du Colisée', 'Paris', 'Île-de-France', 'France', 75008); + +-- Insert Salespersons +INSERT INTO salespersons (id, staff_id, name, store) VALUES +(1, '00001', 'Petey Cruiser', 'Madrid'), +(2, '00002', 'Anna Sthesia', 'Barcelona'), +(3, '00003', 'Paul Molive', 'Berlin'), +(4, '00004', 'Gail Forcewind', 'Paris'), +(5, '00005', 'Paige Turner', 'Mimia'), +(6, '00006', 'Bob Frapples', 'Mexico City'), +(7, '00007', 'Walter Melon', 'Amsterdam'), +(8, '00008', 'Shonda Leer', 'São Paulo'); + +-- Insert Invoices +INSERT INTO invoices (id, invoice_number, date, car, customer, salesperson) VALUES +(1, 852399038, '2018-08-22', 1, 1, 3), +(2, 731166526, '2018-12-31', 3, 3, 5), +(3, 271135104, '2019-01-22', 2, 2, 7); + diff --git a/update.sql b/update.sql new file mode 100644 index 0000000..f179a3b --- /dev/null +++ b/update.sql @@ -0,0 +1,15 @@ +USE lab_mysql; + +SET SQL_SAFE_UPDATES = 0; + +UPDATE customers +SET cust_email = 'ppicasso@gmail.com' +WHERE cust_name = 'Pablo Picasso'; + +UPDATE customers +SET cust_email = 'lincoln@us.gov' +WHERE cust_name = 'Abraham Lincoln'; + +UPDATE customers +SET cust_email = 'hello@napoleon.me' +WHERE cust_name = 'Napoléon Bonaparte'; From 0d03c37c91052291e0210773b26e77f8de6e1f3c Mon Sep 17 00:00:00 2001 From: Eduardo Montealvo Date: Mon, 1 Sep 2025 11:10:51 +0200 Subject: [PATCH 4/4] Add ERD diagram image --- ERD.png | Bin 0 -> 52616 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ERD.png diff --git a/ERD.png b/ERD.png new file mode 100644 index 0000000000000000000000000000000000000000..7462bf94a5df9b4338ff1f18db8f5e202e307620 GIT binary patch literal 52616 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