From 6524242ebd7e543ac7a462c351cc26a2439314ba Mon Sep 17 00:00:00 2001 From: Julia Date: Thu, 18 Sep 2025 11:55:02 +0100 Subject: [PATCH] Solved Lab --- lab-sql-mysql-db-creation/ERM_lab.pdf | Bin 0 -> 66671 bytes lab-sql-mysql-db-creation/README.md | 237 ++++++++++++++++++++++++++ lab-sql-mysql-db-creation/create.sql | 52 ++++++ lab-sql-mysql-db-creation/seeding.sql | 27 +++ lab-sql-mysql-db-creation/update.sql | 18 ++ 5 files changed, 334 insertions(+) create mode 100644 lab-sql-mysql-db-creation/ERM_lab.pdf create mode 100644 lab-sql-mysql-db-creation/README.md create mode 100644 lab-sql-mysql-db-creation/create.sql create mode 100644 lab-sql-mysql-db-creation/seeding.sql create mode 100644 lab-sql-mysql-db-creation/update.sql diff --git a/lab-sql-mysql-db-creation/ERM_lab.pdf b/lab-sql-mysql-db-creation/ERM_lab.pdf new file mode 100644 index 0000000000000000000000000000000000000000..759e6d6da7929c2d30d032bcd5107ab0daccfdef GIT binary patch literal 66671 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 + +

Learning Goals

+
+ + This lab allows you to practice and apply the concepts and techniques taught in class. + + Upon completion of this lab, you will be able to: + +- Design and implement a database schema that accurately represents the relationships between the data sources and allows for efficient querying and analysis. +- Use appropriate SQL commands to load the data into the database, ensuring data integrity and consistency. + +
+
+ + + +
+ +

Prerequisites

+
+ +Before this starting this lab, you should have learnt about: + +- Fundamental concepts of database design, including entities, attributes, primary keys, and foreign keys. +- Basic comprehension of SQL syntax and statements, such as CREATE, INSERT INTO, UPDATE, and DELETE. +- Familiarity with the concept of NOT NULL constraints and data types in SQL. + +
+
+ +
+ + +## Introduction + +Welcome to this lab where you will practice how to design, create and manage a database. In this lab, you will act as a data expert at a car dealership company which sells new cars of various brands and models. You have been assigned the task of designing, creating, and managing a database to keep records about cars, salespersons, customers, and invoices. + +This lab consists of three challenges that will help you to achieve this task. In the first challenge, you will design the database by identifying the entities and their relationships. In the second challenge, you will create the database and tables using MySQL and the `CREATE DATABASE` and `CREATE TABLE` statements. Finally, in the third challenge, you will insert data into the tables using the `INSERT INTO` statement. In the bonus challenge, you will update data using the `UPDATE` statement and delete data using the `DELETE` statement. + +By completing this lab, you will gain valuable experience in designing and creating a database, and managing data in a relational database management system. Let's get started! + +## Challenge 1 - Design the Database + +Design an **Entity-Relationship (E-R) diagram** for your database. + +The database should have at least four tables: `cars`, `customers`, `salespersons` and `invoices`. + +The minimal information to be recorded is described below: + +1. **Cars** - e.g. the vehicle identification number (VIN), manufacturer, model, year, and color of the cars in your company's inventory. + +1. **Customers** - e.g. the customer ID, name, phone number, email, address, city, state/province, country, and zip/postal code of the customers. + +1. **Salespersons** - e.g. staff ID, name, and the store at your company. + +1. **Invoices** - e.g. the invoice number, date, car, customer, and salesperson related to each car sale. + +When designing a database, it's important to consider several aspects to ensure its functionality and efficiency. Here are some things to keep in mind: + +* **Entities and attributes** + * Start by identifying the entities you need to store in your database and the attributes (or properties) that describe each entity. + * For each attribute, decide on the most appropriate data type to use. + * Determine which attributes are mandatory and which are optional. + * For each entity, you should also create an auto-increment numeric ID column using the `AUTO_INCREMENT` feature in MySQL. + * The auto-increment ID should be different from the customer ID or staff ID. + +* **Relations between entities** + * Identify the relationships between the entities in your database. Decide if each relationship is a one-to-one, one-to-many, or many-to-many relationship. One-to-one relationships occur when each entity in one table corresponds to exactly one entity in the other table. One-to-many relationships occur when each entity in one table corresponds to one or more entities in the other table. Many-to-many relationships occur when each entity in one table corresponds to multiple entities in the other table, and vice versa. + +* **Primary keys and foreign keys** + * Use primary keys and foreign keys to establish relationships between the entities in your database. + * Primary keys are unique identifiers for each entity in a table, and are used to link entities in different tables together. + * Foreign keys are used to reference the primary key of another table, creating a relationship between the two tables. + +Your end product of this challenge should look something like the E-R diagram shown below, although it doesn't have to be that complicated: + +![ERD](https://s3-eu-west-1.amazonaws.com/ih-materials/uploads/data-static/images/erd.png) + +Using pen and paper (or computer software if you are skilled at creating digital diagrams), design a database to meet the minimum requirements of the task. + + +## Challenge 2 - Create the Database and Tables + +In this challenge, you will create the database and tables based on the database design you created in Challenge 1. + +1. Open MySQL Workbench. +2. Create a new file named `create.sql`. +3. **Create a MySQL database for this lab** using SQL Query Script in MySQL Workbench. You can execute the following code: + + ```sql + CREATE DATABASE IF NOT EXISTS lab_mysql; + + USE lab_mysql; + ``` + +4. **Write SQL queries to create the tables and columns based on your database design.** + + You will use the `CREATE TABLE` statement for this purpose. You can find the reference for the `CREATE TABLE` statement [here](https://dev.mysql.com/doc/refman/8.0/en/creating-tables.html). + + To test your `CREATE TABLE` statement, you should add a `DROP TABLE` statement above each `CREATE TABLE` statement in your script, like this: + + ```sql + DROP TABLE IF EXISTS cars; + + CREATE TABLE cars ( + ... + ); + ``` + + Make sure to end each statement with a semicolon. + +5. Save the `create.sql` file and execute it to create the database and tables. + +## Challenge 3 - Seeding the Database + +The purpose of *database seeding* is to provide some initial data for an empty database to start software development based on that data. + +Here are some instructions to seed your database: + +1. Open MySQL Workbench and connect the database to where you want to seed the data. +2. Create a new file named `seeding.sql`. +3. Use the `INSERT INTO` statement to insert data into your database. For example: + + ```sql + INSERT INTO users (id, name, email) + VALUES (1, 'John Doe', 'johndoe@example.com'), + (2, 'Jane Smith', 'janesmith@example.com'), + (3, 'Bob Johnson', 'bobjohnson@example.com'); + ``` + + This would insert three records into the `users` table, with the specified `id`, `name`, and `email` values. + + You can find more information on how to use `INSERT INTO` [here](https://dev.mysql.com/doc/refman/8.0/en/insert.html). + +4. Save the `seeding.sql` file and execute it to insert the data into your database. + +5. There is some sample dummy data for your convenience provided below, but please note that they may not be compatible with your specific database design. It is possible that you may need to modify them to fit the appropriate format. + +### Cars + +| id | vin | manufacturer | model | year | color | +| --- | --- | --- | --- | --- | --- | +| 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 | + +### Customers + +| id | cust_id | cust_name | cust_phone | cust_email | cust_address | cust_city | cust_state | cust_country | cust_zipcode | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 0 | 10001 | Pablo Picasso | +34 636 17 63 82 | - | Paseo de la Chopera, 14 | Madrid | Madrid | Spain | 28045 | +| 1 | 20001 | Abraham Lincoln | +1 305 907 7086 | - | 120 SW 8th St | Miami | Florida | United States | 33130 | +| 2 | 30001 | Napoléon Bonaparte | +33 1 79 75 40 00 | - | 40 Rue du Colisée | Paris | Île-de-France | France | 75008 | + +### Salespersons + +| id | staff_id | name | store | +| --- | --- | --- | --- | +| 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 | + +### Invoices + +| id | invoice_number | date | car | customer | salesperson | +| --- | --- | --- | --- | --- | --- | +| 1 | 852399038 | 22-08-2018 | 1 | 1 | 3 | +| 2 | 731166526 | 31-12-2018 | 3 | 3 | 5 | +| 3 | 271135104 | 22-01-2019 | 2 | 2 | 7 | + + + +## Bonus Challenge - Updating and Deleting Database Records + +Congratulations on reaching the bonus challenge! In this challenge, you will update and delete database records. + +To begin, you have been provided with the email addresses of three customers in the form of a table. Your task is to create an `update.sql` file that will update the existing data in your database with the new email addresses. + +| Name | Email | +| --- | ---| +| Pablo Picasso | ppicasso@gmail.com | +| Abraham Lincoln | lincoln@us.gov | +| Napoléon Bonaparte | hello@napoleon.me | + + +Additionally, you have discovered a duplicated car entry with the VIN `DAM41UDN3CHU2WVF6`, and you want to remove the entry with car ID #4 from the database. You will need to create a `delete.sql` file to perform this deletion. + +Hint: if you get an error *You are using safe update mode* while updating, you can fix it by desabling safe mode using `SET SQL_SAFE_UPDATES = 0;` + +## Requirements + +- Fork this repo +- Clone it to your machine + + +## Getting Started + +Complete the challenges in this readme. Follow the instructions and implement: + +- Your database design diagram in the form of image. + +- `create.sql` and `seeding.sql` + +- [OPTIONAL] `update.sql` and `delete.sql` + +## Submission + +- Upon completion, run the following commands: + +```bash +git add . +git commit -m "Solved lab" +git push origin master +``` + +- Create a Pull Request so that your TAs can check your work. + +## References + +- [Database seeding](https://en.wikipedia.org/wiki/Database_seeding) +- [MySQL Reference: Creating a Table](https://dev.mysql.com/doc/refman/8.0/en/creating-tables.html) +- [MySQL Reference: INSERT Syntax](https://dev.mysql.com/doc/refman/8.0/en/insert.html) +- [MySQL Reference: UPDATE Syntax](https://dev.mysql.com/doc/refman/8.0/en/update.html) +- [MySQL Reference: DELETE Syntax](https://dev.mysql.com/doc/refman/8.0/en/delete.html) \ No newline at end of file diff --git a/lab-sql-mysql-db-creation/create.sql b/lab-sql-mysql-db-creation/create.sql new file mode 100644 index 0000000..014f276 --- /dev/null +++ b/lab-sql-mysql-db-creation/create.sql @@ -0,0 +1,52 @@ +CREATE DATABASE IF NOT EXISTS lab_mysql; + +USE lab_mysql; + +DROP TABLE IF EXISTS cars; + +CREATE TABLE cars ( + id INT PRIMARY KEY AUTO_INCREMENT, + VIN VARCHAR(30) UNIQUE NOT NULL, + manufacturer VARCHAR(30) NOT NULL, + model VARCHAR(30) NOT NULL, + year BIGINT, + color VARCHAR(30) +); + +DROP TABLE IF EXISTS customers; + +CREATE TABLE customers ( + id INT PRIMARY KEY AUTO_INCREMENT, + cust_id BIGINT UNIQUE NOT NULL, + cust_name VARCHAR(100) NOT NULL, + cust_phone VARCHAR(30), + cust_email VARCHAR(50) NOT NULL, + cust_address VARCHAR(100), + cust_city VARCHAR(30), + cust_state VARCHAR(30), + cust_country VARCHAR(30), + cust_zipcode VARCHAR(30) +); + +DROP TABLE IF EXISTS salespersons; + +CREATE TABLE salespersons ( + id INT PRIMARY KEY AUTO_INCREMENT, + staff_id BIGINT UNIQUE NOT NULL, + name VARCHAR(100) NOT NULL, + store VARCHAR(30) +); + +DROP TABLE IF EXISTS invoices; + +CREATE TABLE invoices ( + id INT PRIMARY KEY AUTO_INCREMENT, + invoice_number BIGINT UNIQUE NOT NULL, + date DATETIME NOT NULL, + car INT NOT NULL, + customer INT NOT NULL, + salesperson INT NOT NULL, + CONSTRAINT fk_car FOREIGN KEY (car) REFERENCES cars(id), + CONSTRAINT fk_customer FOREIGN KEY (customer) REFERENCES customers(id), + CONSTRAINT fk_salesperson FOREIGN KEY (salesperson) REFERENCES salespersons(id) +); \ No newline at end of file diff --git a/lab-sql-mysql-db-creation/seeding.sql b/lab-sql-mysql-db-creation/seeding.sql new file mode 100644 index 0000000..9017f3d --- /dev/null +++ b/lab-sql-mysql-db-creation/seeding.sql @@ -0,0 +1,27 @@ + +INSERT INTO lab_mysql.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'); + +INSERT INTO lab_mysql.customers (id, cust_id, cust_name, cust_phone, cust_email, cust_address, cust_city, cust_state, cust_country, cust_zipcode) +VALUES (1, '10001', 'Pablo Picasso', '+34 636 17 63 82', '-', 'Paseo de la Chopera, 14', 'Madrid', 'Madrid', 'Spain', '28045'), + (2, '20001', 'Abraham Lincoln', '+1 305 907 7086', '-', '120 SW 8th St', 'Miami', 'Florida', 'United States', '33130'), + (3, '30001', 'Napoléon Bonaparte', '+33 1 79 75 40 00', '-', '40 Rue du Colisée', 'Paris', 'Île-de-France', 'France', '75008'); + +INSERT INTO lab_mysql.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 INTO lab_mysql.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); \ No newline at end of file diff --git a/lab-sql-mysql-db-creation/update.sql b/lab-sql-mysql-db-creation/update.sql new file mode 100644 index 0000000..f0da835 --- /dev/null +++ b/lab-sql-mysql-db-creation/update.sql @@ -0,0 +1,18 @@ +ALTER TABLE lab_mysql.customers +ADD COLUMN email VARCHAR(255); + +SET SQL_SAFE_UPDATES = 0; + +UPDATE lab_mysql.customers +SET email = 'ppicasso@gmail.com' +WHERE cust_name = 'Pablo Picasso'; + +UPDATE lab_mysql.customers +SET email = 'lincoln@us.gov' +WHERE cust_name = 'Abraham Lincoln'; + +UPDATE lab_mysql.customers +SET email = 'hello@napoleon.me' +WHERE cust_name = 'Napoléon Bonaparte'; + +SET SQL_SAFE_UPDATES = 1; \ No newline at end of file