From bfbf796a10d9c466fe8552c442be7c1e3068ff48 Mon Sep 17 00:00:00 2001 From: Pedro Ricciardi Date: Thu, 23 May 2024 10:55:41 +0100 Subject: [PATCH 1/2] all queries done --- E-Commerce/cyf_ecommerce.sql | 876 ++++++++++++++++------------------- E-Commerce/readme.md | 132 +++++- 2 files changed, 528 insertions(+), 480 deletions(-) diff --git a/E-Commerce/cyf_ecommerce.sql b/E-Commerce/cyf_ecommerce.sql index eff65118..28530bf2 100644 --- a/E-Commerce/cyf_ecommerce.sql +++ b/E-Commerce/cyf_ecommerce.sql @@ -1,479 +1,421 @@ DROP TABLE IF EXISTS order_items; - DROP TABLE IF EXISTS orders cascade; - DROP TABLE IF EXISTS product_availability cascade; - DROP TABLE IF EXISTS customers cascade; - DROP TABLE IF EXISTS products cascade; - DROP TABLE IF EXISTS suppliers cascade; - -CREATE TABLE customers (id SERIAL PRIMARY KEY, - name VARCHAR(50) NOT NULL, - address VARCHAR(120), - city VARCHAR(30), - country VARCHAR(20)); - - -CREATE TABLE suppliers (id SERIAL PRIMARY KEY, - supplier_name VARCHAR(100) NOT NULL, - country VARCHAR(20) NOT NULL); - - -CREATE TABLE products (id SERIAL PRIMARY KEY, - product_name VARCHAR(100) NOT NULL); - - -create table product_availability (prod_id integer references products(id), supp_id integer references suppliers(id), unit_price integer not null, primary key (prod_id, supp_id)); - - -CREATE TABLE orders (id SERIAL PRIMARY KEY, - order_date DATE NOT NULL, - order_reference VARCHAR(10) NOT NULL, - customer_id INT REFERENCES customers(id)); - - -CREATE TABLE order_items (id SERIAL PRIMARY KEY, - order_id INT NOT NULL REFERENCES orders(id), - product_id INT NOT NULL, - supplier_id INT NOT NULL, - quantity INT NOT NULL, - FOREIGN KEY (product_id, - supplier_id) REFERENCES product_availability (prod_id, supp_id)); - - -INSERT INTO customers (name, address, city, country) -VALUES ('Guy Crawford', - '770-2839 Ligula Road', - 'Paris', - 'France'); - - -INSERT INTO customers (name, address, city, country) -VALUES ('Hope Crosby', - 'P.O. Box 276, 4976 Sit Rd.', - 'Steyr', - 'United Kingdom'); - - -INSERT INTO customers (name, address, city, country) -VALUES ('Britanney Kirkland', - 'P.O. Box 577, 5601 Sem, St.', - 'Little Rock', - 'United Kingdom'); - - -INSERT INTO customers (name, address, city, country) -VALUES ('Amber Tran', - '6967 Ac Road', - 'Villafranca Asti', - 'United States'); - - -INSERT INTO customers (name, address, city, country) -VALUES ('Edan Higgins', - 'Ap #840-3255 Tincidunt St.', - 'Arles', - 'United States'); - - -INSERT INTO customers (name, address, city, country) -VALUES ('Quintessa Austin', - '597-2737 Nunc Rd.', - 'Saint-Marc', - 'United Kingdom'); - - -INSERT INTO suppliers (supplier_name, country) -VALUES ('Amazon', - 'United States'); - - -INSERT INTO suppliers (supplier_name, country) -VALUES ('Taobao', - 'China'); - - -INSERT INTO suppliers (supplier_name, country) -VALUES ('Argos', - 'United Kingdom'); - - -INSERT INTO suppliers (supplier_name, country) -VALUES ('Sainsburys', - 'United Kingdom'); - - -INSERT INTO products (product_name) -VALUES ('Mobile Phone X'); - - -INSERT INTO products (product_name) -VALUES ('Javascript Book'); - - -INSERT INTO products (product_name) -VALUES ('Le Petit Prince'); - - -INSERT INTO products (product_name) -VALUES ('Super warm socks'); - - -INSERT INTO products (product_name) -VALUES ('Coffee Cup'); - - -INSERT INTO products (product_name) -VALUES ('Ball'); - - -INSERT INTO products (product_name) -VALUES ('Tee Shirt Olympic Games'); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (1, - 4, - 249); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (1, - 1, - 299); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (2, - 2, - 41); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (2, - 3, - 39); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (2, - 1, - 40); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (3, - 4, - 10); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (3, - 1, - 10); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (4, - 4, - 10); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (4, - 3, - 8); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (4, - 2, - 5); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (4, - 1, - 10); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (5, - 4, - 5); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (5, - 3, - 4); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (5, - 2, - 4); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (5, - 1, - 3); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (6, - 2, - 20); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (6, - 4, - 15); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (6, - 1, - 14); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (7, - 3, - 21); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (7, - 2, - 18); - - -INSERT INTO product_availability (prod_id, supp_id, unit_price) -VALUES (7, - 1, - 20); - - -INSERT INTO orders (order_date, order_reference, customer_id) -VALUES ('2019-06-01', - 'ORD001', - 1); - - -INSERT INTO orders (order_date, order_reference, customer_id) -VALUES ('2019-07-15', - 'ORD002', - 1); - - -INSERT INTO orders (order_date, order_reference, customer_id) -VALUES ('2019-07-11', - 'ORD003', - 1); - - -INSERT INTO orders (order_date, order_reference, customer_id) -VALUES ('2019-05-24', - 'ORD004', - 2); - - -INSERT INTO orders (order_date, order_reference, customer_id) -VALUES ('2019-05-30', - 'ORD005', - 3); - - -INSERT INTO orders (order_date, order_reference, customer_id) -VALUES ('2019-07-05', - 'ORD006', - 4); - - -INSERT INTO orders (order_date, order_reference, customer_id) -VALUES ('2019-04-05', - 'ORD007', - 4); - - -INSERT INTO orders (order_date, order_reference, customer_id) -VALUES ('2019-07-23', - 'ORD008', - 5); - - -INSERT INTO orders (order_date, order_reference, customer_id) -VALUES ('2019-07-24', - 'ORD009', - 5); - - -INSERT INTO orders (order_date, order_reference, customer_id) -VALUES ('2019-05-10', - 'ORD010', - 5); - - -INSERT INTO order_items -VALUES (1, - 1, - 7, - 2, - 1); - - -INSERT INTO order_items -VALUES (2, - 1, - 4, - 2, - 5); - - -INSERT INTO order_items -VALUES (3, - 2, - 4, - 3, - 4); - - -INSERT INTO order_items -VALUES (4, - 2, - 3, - 4, - 1); - - -INSERT INTO order_items -VALUES (5, - 3, - 5, - 3, - 10); - - -INSERT INTO order_items -VALUES (6, - 3, - 6, - 2, - 2); - - -INSERT INTO order_items -VALUES (7, - 4, - 1, - 1, - 1); - - -INSERT INTO order_items -VALUES (8, - 5, - 2, - 3, - 2); - - -INSERT INTO order_items -VALUES (9, - 5, - 3, - 1, - 1); - - -INSERT INTO order_items -VALUES (10, - 6, - 5, - 2, - 3); - - -INSERT INTO order_items -VALUES (11, - 6, - 2, - 2, - 1); - - -INSERT INTO order_items -VALUES (12, - 6, - 3, - 4, - 1); - - -INSERT INTO order_items -VALUES (13, - 6, - 4, - 4, - 3); - - -INSERT INTO order_items -VALUES (14, - 7, - 4, - 3, - 15); - - -INSERT INTO order_items -VALUES (15, - 8, - 7, - 1, - 1); - - -INSERT INTO order_items -VALUES (16, - 8, - 1, - 4, - 1); - - -INSERT INTO order_items -VALUES (17, - 9, - 6, - 4, - 2); - - -INSERT INTO order_items -VALUES (18, - 10, - 6, - 2, - 1); - - -INSERT INTO order_items -VALUES (19, - 10, - 4, - 1, - 5); - +CREATE TABLE customers ( + id SERIAL PRIMARY KEY, + name VARCHAR(50) NOT NULL, + address VARCHAR(120), + city VARCHAR(30), + country VARCHAR(20) +); + +CREATE TABLE suppliers ( + id SERIAL PRIMARY KEY, + supplier_name VARCHAR(100) NOT NULL, + country VARCHAR(20) NOT NULL +); + +CREATE TABLE products ( + id SERIAL PRIMARY KEY, + product_name VARCHAR(100) NOT NULL +); + +create table product_availability ( + prod_id integer references products(id), + supp_id integer references suppliers(id), + unit_price integer not null, + primary key (prod_id, supp_id) +); + +CREATE TABLE orders ( + id SERIAL PRIMARY KEY, + order_date DATE NOT NULL, + order_reference VARCHAR(10) NOT NULL, + customer_id INT REFERENCES customers(id) +); + +CREATE TABLE order_items ( + id SERIAL PRIMARY KEY, + order_id INT NOT NULL REFERENCES orders(id), + product_id INT NOT NULL, + supplier_id INT NOT NULL, + quantity INT NOT NULL, + FOREIGN KEY ( + product_id, + supplier_id + ) REFERENCES product_availability (prod_id, supp_id) +); + +INSERT INTO + customers (name, address, city, country) +VALUES + ( + 'Guy Crawford', + '770-2839 Ligula Road', + 'Paris', + 'France' + ); + +INSERT INTO + customers (name, address, city, country) +VALUES + ( + 'Hope Crosby', + 'P.O. Box 276, 4976 Sit Rd.', + 'Steyr', + 'United Kingdom' + ); + +INSERT INTO + customers (name, address, city, country) +VALUES + ( + 'Britanney Kirkland', + 'P.O. Box 577, 5601 Sem, St.', + 'Little Rock', + 'United Kingdom' + ); + +INSERT INTO + customers (name, address, city, country) +VALUES + ( + 'Amber Tran', + '6967 Ac Road', + 'Villafranca Asti', + 'United States' + ); + +INSERT INTO + customers (name, address, city, country) +VALUES + ( + 'Edan Higgins', + 'Ap #840-3255 Tincidunt St.', + 'Arles', + 'United States' + ); + +INSERT INTO + customers (name, address, city, country) +VALUES + ( + 'Quintessa Austin', + '597-2737 Nunc Rd.', + 'Saint-Marc', + 'United Kingdom' + ); + +INSERT INTO + suppliers (supplier_name, country) +VALUES + ('Amazon', 'United States'); + +INSERT INTO + suppliers (supplier_name, country) +VALUES + ('Taobao', 'China'); + +INSERT INTO + suppliers (supplier_name, country) +VALUES + ('Argos', 'United Kingdom'); + +INSERT INTO + suppliers (supplier_name, country) +VALUES + ('Sainsburys', 'United Kingdom'); + +INSERT INTO + products (product_name) +VALUES + ('Mobile Phone X'); + +INSERT INTO + products (product_name) +VALUES + ('Javascript Book'); + +INSERT INTO + products (product_name) +VALUES + ('Le Petit Prince'); + +INSERT INTO + products (product_name) +VALUES + ('Super warm socks'); + +INSERT INTO + products (product_name) +VALUES + ('Coffee Cup'); + +INSERT INTO + products (product_name) +VALUES + ('Ball'); + +INSERT INTO + products (product_name) +VALUES + ('Tee Shirt Olympic Games'); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (1, 4, 249); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (1, 1, 299); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (2, 2, 41); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (2, 3, 39); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (2, 1, 40); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (3, 4, 10); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (3, 1, 10); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (4, 4, 10); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (4, 3, 8); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (4, 2, 5); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (4, 1, 10); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (5, 4, 5); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (5, 3, 4); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (5, 2, 4); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (5, 1, 3); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (6, 2, 20); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (6, 4, 15); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (6, 1, 14); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (7, 3, 21); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (7, 2, 18); + +INSERT INTO + product_availability (prod_id, supp_id, unit_price) +VALUES + (7, 1, 20); + +INSERT INTO + orders (order_date, order_reference, customer_id) +VALUES + ('2019-06-01', 'ORD001', 1); + +INSERT INTO + orders (order_date, order_reference, customer_id) +VALUES + ('2019-07-15', 'ORD002', 1); + +INSERT INTO + orders (order_date, order_reference, customer_id) +VALUES + ('2019-07-11', 'ORD003', 1); + +INSERT INTO + orders (order_date, order_reference, customer_id) +VALUES + ('2019-05-24', 'ORD004', 2); + +INSERT INTO + orders (order_date, order_reference, customer_id) +VALUES + ('2019-05-30', 'ORD005', 3); + +INSERT INTO + orders (order_date, order_reference, customer_id) +VALUES + ('2019-07-05', 'ORD006', 4); + +INSERT INTO + orders (order_date, order_reference, customer_id) +VALUES + ('2019-04-05', 'ORD007', 4); + +INSERT INTO + orders (order_date, order_reference, customer_id) +VALUES + ('2019-07-23', 'ORD008', 5); + +INSERT INTO + orders (order_date, order_reference, customer_id) +VALUES + ('2019-07-24', 'ORD009', 5); + +INSERT INTO + orders (order_date, order_reference, customer_id) +VALUES + ('2019-05-10', 'ORD010', 5); + +INSERT INTO + order_items +VALUES + (1, 1, 7, 2, 1); + +INSERT INTO + order_items +VALUES + (2, 1, 4, 2, 5); + +INSERT INTO + order_items +VALUES + (3, 2, 4, 3, 4); + +INSERT INTO + order_items +VALUES + (4, 2, 3, 4, 1); + +INSERT INTO + order_items +VALUES + (5, 3, 5, 3, 10); + +INSERT INTO + order_items +VALUES + (6, 3, 6, 2, 2); + +INSERT INTO + order_items +VALUES + (7, 4, 1, 1, 1); + +INSERT INTO + order_items +VALUES + (8, 5, 2, 3, 2); + +INSERT INTO + order_items +VALUES + (9, 5, 3, 1, 1); + +INSERT INTO + order_items +VALUES + (10, 6, 5, 2, 3); + +INSERT INTO + order_items +VALUES + (11, 6, 2, 2, 1); + +INSERT INTO + order_items +VALUES + (12, 6, 3, 4, 1); + +INSERT INTO + order_items +VALUES + (13, 6, 4, 4, 3); + +INSERT INTO + order_items +VALUES + (14, 7, 4, 3, 15); + +INSERT INTO + order_items +VALUES + (15, 8, 7, 1, 1); + +INSERT INTO + order_items +VALUES + (16, 8, 1, 4, 1); + +INSERT INTO + order_items +VALUES + (17, 9, 6, 4, 2); + +INSERT INTO + order_items +VALUES + (18, 10, 6, 2, 1); + +INSERT INTO + order_items +VALUES + (19, 10, 4, 1, 5); \ No newline at end of file diff --git a/E-Commerce/readme.md b/E-Commerce/readme.md index 37580cce..fe3c608a 100644 --- a/E-Commerce/readme.md +++ b/E-Commerce/readme.md @@ -35,27 +35,133 @@ You can even [draw relationship diagrams](https://mermaid.js.org/syntax/entityRe ```mermaid erDiagram customers { - id INT PK - name VARCHAR(50) NOT NULL + id SERIAL PK + name VARCHAR(50) "NOT NULL" + address VARCHAR(120) + city VARCHAR(30) + country VARCHAR(20) } + + suppliers { + id SERIAL PK + supplier_name VARCHAR(100) "NOT NULL" + country VARCHAR(20) "NOT NULL" + } + + products { + id SERIAL PK + product_name VARCHAR(100) "NOT NULL" + } + + product_availability { + prod_id INT PK,FK "ref: products.id" + supp_id INT PK,FK "ref: suppliers.id" + unit_price INT "NOT NULL" + } + + orders { + id SERIAL PK + order_date DATE "NOT NULL" + order_reference VARCHAR(10) "NOT NULL" + customer_id INT FK "ref: customers.id" + } + + order_items { + id SERIAL PK + order_id INT FK "ref: orders.id | NOT NULL" + product_id INT "NOT NULL" + supplier_id INT "NOT NULL" + quantity INT "NOT NULL" + } + customers ||--o{ orders : places + orders ||--|{ order_items : contains + order_items ||--|{ product_availability : references + product_availability ||--o{ suppliers : supplied_by + product_availability ||--|| products : contains + ``` ### Query Practice Write SQL queries to complete the following tasks: -- [ ] List all the products whose name contains the word "socks" -- [ ] List all the products which cost more than 100 showing product id, name, unit price, and supplier id -- [ ] List the 5 most expensive products -- [ ] List all the products sold by suppliers based in the United Kingdom. The result should only contain the columns product_name and supplier_name -- [ ] List all orders, including order items, from customer named Hope Crosby -- [ ] List all the products in the order ORD006. The result should only contain the columns product_name, unit_price, and quantity -- [ ] List all the products with their supplier for all orders of all customers. The result should only contain the columns name (from customer), order_reference, order_date, product_name, supplier_name, and quantity +- [x] List all the products whose name contains the word "socks" + +```sql +select * from products where lower(product_name) like lower('%socks%'); +``` + +- [x] List all the products which cost more than 100 showing product id, name, unit price, and supplier id + +```sql +select p.id, p.product_name, pa.unit_price, s.supplier_name +from products p +join product_availability pa ON p.id = pa.prod_id +join suppliers s ON s.id = pa.supp_id +where pa.unit_price > 100; +``` + +- [x] List the 5 most expensive products + +```sql +select p.product_name, pa.unit_price +from products p +join product_availability pa on p.id = pa.prod_id +order by pa.unit_price desc +limit 5; +``` + +- [x] List all the products sold by suppliers based in the United Kingdom. The result should only contain the columns product_name and supplier_name + +```sql +select p.product_name, s.supplier_name +from products p +join product_availability pa on p.id = pa.prod_id +join suppliers s on s.id = pa.supp_id +where LOWER(s.country) like '%united kingdom%'; +``` + +- [x] List all orders, including order items, from customer named Hope Crosby + +```sql +select o.id, + o.order_date, + o.order_reference, + p.product_name, + oi.quantity +from orders o +join order_items oi on o.id = oi.order_id +join products p on oi.product_id = p.id +join customers c on o.customer_id = c.id +where lower(c.name) like lower('Hope Crosby'); +``` + +- [x] List all the products in the order ORD006. The result should only contain the columns product_name, unit_price, and quantity +```sql +select p.product_name, pa.unit_price, oi.quantity +from orders o +join order_items oi on o.id = oi.order_id +join products p on oi.product_id = p.id +join product_availability pa on oi.product_id = pa.prod_id and oi.supplier_id = pa.supp_id +where lower(o.order_reference) like lower('ORD006'); + +``` +- [x] List all the products with their supplier for all orders of all customers. The result should only contain the columns name (from customer), order_reference, order_date, product_name, supplier_name, and quantity + +```sql +select c.name, o.order_reference, o.order_date, p.product_name, s.supplier_name, oi.quantity +from orders o +join order_items oi on o.id = oi.order_id +join products p on oi.product_id = p.id +join product_availability pa on oi.product_id = pa.prod_id and oi.supplier_id = pa.supp_id +join suppliers s on pa.supp_id = s.id +join customers c on o.customer_id = c.id; +``` ## Acceptance Criteria -- [ ] The `cyf_ecommerce` database is imported and set up correctly -- [ ] The database schema is drawn correctly to visualize relationships between tables -- [ ] The SQL queries retrieve the correct data according to the tasks listed above -- [ ] The pull request with the answers to the tasks is opened on the `main` branch of the `E-Commerce` repository +- [x] The `cyf_ecommerce` database is imported and set up correctly +- [x] The database schema is drawn correctly to visualize relationships between tables +- [x] The SQL queries retrieve the correct data according to the tasks listed above +- [x] The pull request with the answers to the tasks is opened on the `main` branch of the `E-Commerce` repository From 302de9b73067ea9a182203bc7cf1008e25820b55 Mon Sep 17 00:00:00 2001 From: Pedro Ricciardi Date: Thu, 23 May 2024 11:05:59 +0100 Subject: [PATCH 2/2] added more order paramaters on the last query --- E-Commerce/readme.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/E-Commerce/readme.md b/E-Commerce/readme.md index fe3c608a..a41e0732 100644 --- a/E-Commerce/readme.md +++ b/E-Commerce/readme.md @@ -138,6 +138,7 @@ where lower(c.name) like lower('Hope Crosby'); ``` - [x] List all the products in the order ORD006. The result should only contain the columns product_name, unit_price, and quantity + ```sql select p.product_name, pa.unit_price, oi.quantity from orders o @@ -147,16 +148,18 @@ join product_availability pa on oi.product_id = pa.prod_id and oi.supplier_id = where lower(o.order_reference) like lower('ORD006'); ``` + - [x] List all the products with their supplier for all orders of all customers. The result should only contain the columns name (from customer), order_reference, order_date, product_name, supplier_name, and quantity ```sql select c.name, o.order_reference, o.order_date, p.product_name, s.supplier_name, oi.quantity from orders o +join customers c on o.customer_id = c.id join order_items oi on o.id = oi.order_id join products p on oi.product_id = p.id join product_availability pa on oi.product_id = pa.prod_id and oi.supplier_id = pa.supp_id -join suppliers s on pa.supp_id = s.id -join customers c on o.customer_id = c.id; +join suppliers s on oi.supplier_id = s.id +order by c.name, o.order_reference, p.product_name; ``` ## Acceptance Criteria