From cc9d02b813da036b40f111e9286593fb58ee4cd9 Mon Sep 17 00:00:00 2001 From: "nhan.nguyen" Date: Mon, 2 Oct 2023 13:39:08 +0700 Subject: [PATCH] Assignment 1 - DB --- .vscode/settings.json | 7 ++ capital-gain-loss.sql | 9 ++ count-salary-categories.sql | 21 +++++ mysql-docker/db/create-db.sql | 141 ++++++++++++++++++++++++++++++++ mysql-docker/docker-compose.yml | 18 ++++ query.sql | 127 ++++++++++++++++++++++++++++ 6 files changed, 323 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 capital-gain-loss.sql create mode 100644 count-salary-categories.sql create mode 100644 mysql-docker/db/create-db.sql create mode 100644 mysql-docker/docker-compose.yml create mode 100644 query.sql diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a0a338b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "workbench.colorCustomizations": { + "activityBar.background": "#223213", + "titleBar.activeBackground": "#30461B", + "titleBar.activeForeground": "#F7FBF4" + } +} diff --git a/capital-gain-loss.sql b/capital-gain-loss.sql new file mode 100644 index 0000000..e97f3d4 --- /dev/null +++ b/capital-gain-loss.sql @@ -0,0 +1,9 @@ +SELECT stock_name, +SUM( + CASE + WHEN operation = 'Sell' THEN price + WHEN operation = 'Buy' THEN -price + END +) AS capital_gain_loss +FROM stocks +GROUP BY stock_name \ No newline at end of file diff --git a/count-salary-categories.sql b/count-salary-categories.sql new file mode 100644 index 0000000..dd2653b --- /dev/null +++ b/count-salary-categories.sql @@ -0,0 +1,21 @@ +SELECT +'High Salary' AS category, +SUM(CASE WHEN income>50000 THEN 1 ELSE 0 END) AS accounts_count +FROM +accounts + +UNION + +SELECT +'Low Salary' AS category, +SUM(CASE WHEN income<20000 THEN 1 ELSE 0 END) AS accounts_count +FROM +accounts + +UNION + +SELECT +'Average Salary' AS category, +SUM(CASE WHEN (income>=20000 AND income<=50000) THEN 1 ELSE 0 END) AS accounts_count +FROM +accounts diff --git a/mysql-docker/db/create-db.sql b/mysql-docker/db/create-db.sql new file mode 100644 index 0000000..6dbc3b1 --- /dev/null +++ b/mysql-docker/db/create-db.sql @@ -0,0 +1,141 @@ + +CREATE TABLE IF NOT EXISTS Professor ( + prof_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, + prof_lname VARCHAR(50), + prof_fname VARCHAR(50) +); +CREATE TABLE IF NOT EXISTS Student ( + stud_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, + stud_fname VARCHAR(50) NOT NULL, + stud_lname VARCHAR(50) NOT NULL, + stud_street VARCHAR(255), + stud_city VARCHAR(50), + stud_zip VARCHAR(10) +); +CREATE TABLE IF NOT EXISTS Course ( + course_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, + course_name VARCHAR(255) NOT NULL +); +CREATE TABLE IF NOT EXISTS Room( + room_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, + room_loc VARCHAR(50) NOT NULL, + room_cap VARCHAR(50) NOT NULL, + class_id INT NULL +); +CREATE TABLE IF NOT EXISTS Class ( + class_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, + class_name VARCHAR(255) NOT NULL, + prof_id INT NOT NULL, + course_id INT NOT NULL, + room_id INT NOT NULL-- add constraint later +); +CREATE TABLE IF NOT EXISTS Enroll( + stud_id INT NOT NULL, + class_id INT NOT NULL, + grade VARCHAR(3) NOT NULL, + PRIMARY KEY (stud_id, class_id) +); +-- Add constraint to Class table +ALTER TABLE Class ADD CONSTRAINT fk_class_professor_prof_id +FOREIGN KEY (prof_id) REFERENCES Professor (prof_id); + +ALTER TABLE Class ADD CONSTRAINT fk_class_course_course_id +FOREIGN KEY (course_id) REFERENCES Course (course_id); + +ALTER TABLE Class ADD CONSTRAINT fk_class_room_room_id +FOREIGN KEY (room_id) REFERENCES Room (room_id); +-- end + + +-- add constraint to Enroll table +ALTER TABLE Enroll ADD CONSTRAINT fk_enroll_student_stud_id +FOREIGN KEY (stud_id) REFERENCES Student (stud_id); + +ALTER TABLE Enroll ADD CONSTRAINT fk_enroll_class_class_id +FOREIGN KEY (class_id) REFERENCES Class (class_id); +-- end + +-- add constraint to Room table +ALTER TABLE Room ADD CONSTRAINT fk_room_class_class_id +FOREIGN KEY (class_id) REFERENCES Class (class_id); +-- end + +-- INSERT +INSERT INTO Professor (prof_lname, prof_fname) +VALUES + ('Smith', 'John'), + ('Johnson', 'Emily'), + ('Brown', 'Michael'), + ('Davis', 'Sarah'), + ('Miller', 'David'), + ('Wilson', 'Jennifer'), + ('Anderson', 'Christopher'), + ('Thomas', 'Jessica'), + ('Taylor', 'Matthew'), + ('Moore', 'Amanda'); + +INSERT INTO Student (stud_fname, stud_lname, stud_street, stud_city, stud_zip) +VALUES + ('Emma', 'Johnson', '123 Main St', 'New York', '10001'), + ('Oliver', 'Williams', '456 Elm St', 'Los Angeles', '90001'), + ('Sophia', 'Jones', '789 Oak St', 'Chicago', '60601'), + ('Liam', 'Brown', '234 Maple St', 'Houston', '77001'), + ('Ava', 'Davis', '567 Pine St', 'Philadelphia', '19101'), + ('Noah', 'Wilson', '890 Cedar St', 'Phoenix', '85001'), + ('Isabella', 'Lee', '321 Birch St', 'San Antonio', '78201'), + ('Mason', 'Taylor', '654 Willow St', 'San Diego', '92101'), + ('Charlotte', 'Clark', '987 Spruce St', 'Dallas', '75201'), + ('Elijah', 'Moore', '654 Rose St', 'Austin', '78701'); + +INSERT INTO Course (course_name) +VALUES + ('Mathematics'), + ('English'), + ('History'), + ('Science'), + ('Art'), + ('Computer Science'), + ('Physics'), + ('Biology'), + ('Chemistry'), + ('Music'); + +-- set class id null than update later on +INSERT INTO Room (room_loc, room_cap, class_id) +VALUE + ('Building A, Room 101', '30',NULL), + ('Building A, Room 102', '25',NULL), + ('Building B, Room 201', '40',NULL), + ('Building B, Room 202', '35',NULL), + ('Building C, Room 301', '20',NULL), + ('Building C, Room 302', '15',NULL), + ('Building D, Room 401', '30',NULL), + ('Building D, Room 402', '25',NULL), + ('Building E, Room 501', '40',NULL), + ('Building E, Room 502', '35',NULL); + +INSERT INTO Class (class_name, prof_id, course_id, room_id) +VALUES + ('Class 1', 1, 1, 1), + ('Class 2', 2, 2, 2), + ('Class 3', 3, 3, 3), + ('Class 4', 4, 4, 4), + ('Class 5', 5, 5, 5), + ('Class 6', 6, 6, 6), + ('Class 7', 7, 7, 7), + ('Class 8', 8, 8, 8), + ('Class 9', 9, 9, 9), + ('Class 10',10,10,10); + +INSERT INTO Enroll (stud_id, class_id, grade) +VALUES + (1, 1, 'A'), + (2, 2, 'B'), + (3, 3, 'C'), + (4, 4, 'A'), + (5, 5, 'B'), + (6, 6, 'C'), + (7, 7, 'A'), + (8, 8, 'B'), + (9, 9, 'C'), + (10, 10, 'A'); \ No newline at end of file diff --git a/mysql-docker/docker-compose.yml b/mysql-docker/docker-compose.yml new file mode 100644 index 0000000..50d1754 --- /dev/null +++ b/mysql-docker/docker-compose.yml @@ -0,0 +1,18 @@ +version: "3.8" +services: + db: + image: mysql:8.0 + cap_add: + - SYS_NICE + restart: always + environment: + - MYSQL_DATABASE=root + - MYSQL_ROOT_PASSWORD=root + ports: + - "3306:3306" + volumes: + - db:/var/lib/mysql + - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql +volumes: + db: + driver: local diff --git a/query.sql b/query.sql new file mode 100644 index 0000000..5115e22 --- /dev/null +++ b/query.sql @@ -0,0 +1,127 @@ +-- student, professor, class with class in common +SELECT + CONCAT(pr.prof_fname, '', pr.prof_lname) AS professor, + CONCAT(st.stud_fname, '', st.stud_lname) AS student, + cl.class_name +FROM + Professor pr + JOIN Class cl ON pr.prof_id = cl.prof_id + JOIN Enroll en ON cl.class_id = en.class_id + JOIN Student st ON st.stud_id = en.stud_id; + +-- courses that 1 professor is teaching +SELECT DISTINCT + c.course_name, + CONCAT(pr.prof_fname, '', pr.prof_lname) AS professor +FROM + Professor pr + JOIN Class cl USING (prof_id) + JOIN Course c USING (course_id) + +-- courses that 1 student is enrolling +SELECT DISTINCT + c.course_name, + CONCAT(st.stud_fname, '', st.stud_lname) AS student +FROM + Student st + JOIN Enroll e USING (stud_id) + JOIN Class cl USING (class_id) + JOIN Course c USING (course_id); + + +-- match grade in number with CHARACTER +DROP VIEW IF EXISTS grade_in_number; +CREATE VIEW grade_in_number AS +SELECT + ( + CASE WHEN grade = 'A' THEN + 10 + WHEN grade = 'B' THEN + 8 + WHEN grade = 'C' THEN + 6 + WHEN grade = 'D' THEN + 4 + WHEN grade = 'E' THEN + 2 + WHEN grade = 'F' THEN + 0 + END) AS grade_number, stud_id, class_id, grade +FROM + Enroll; + +SELECT * +FROM grade_in_number + +SELECT st.stud_fname, gd.grade_number, e.class_id +FROM + Student st + JOIN Enroll e USING (stud_id) + JOIN grade_in_number gd USING (stud_id) + +-- avg grade in CHARACTER of 1 student +SELECT + CONCAT(stud_fname, " ", stud_lname) as stud_name, + ROUND(AVG( + CASE + WHEN grade = 'A' THEN 10 + WHEN grade = 'B' THEN 8 + WHEN grade = 'C' THEN 6 + WHEN grade = 'D' THEN 4 + WHEN grade = 'E' THEN 2 + WHEN grade = 'F' THEN 0 + END + ), 2) as academic_ability +FROM Enroll en +JOIN Student st + ON st.stud_id = en.stud_id +GROUP BY CONCAT(stud_fname, " ", stud_lname); + +-- avg grade of a class +SELECT + class_name, + ROUND(AVG( + CASE WHEN grade = 'A' THEN + 10 + WHEN grade = 'B' THEN + 8 + WHEN grade = 'C' THEN + 6 + WHEN grade = 'D' THEN + 4 + WHEN grade = 'E' THEN + 2 + WHEN grade = 'F' THEN + 0 + END), 2) AS grade +FROM + Enroll en + JOIN Class cl USING (class_id) +GROUP BY + class_name; + +-- avg grade of course +SELECT + cr.course_name, + ROUND(AVG( + CASE WHEN grade = 'A' THEN + 10 + WHEN grade = 'B' THEN + 8 + WHEN grade = 'C' THEN + 6 + WHEN grade = 'D' THEN + 4 + WHEN grade = 'E' THEN + 2 + WHEN grade = 'F' THEN + 0 + END), 2) AS grade +FROM + Enroll en + JOIN Class cl USING (class_id) + JOIN Course cr USING (course_id) +GROUP BY + course_name; + +