From 68e936dc2722a533239f3e6ee57da674bca1d491 Mon Sep 17 00:00:00 2001 From: danh Date: Wed, 24 May 2023 14:01:11 +0700 Subject: [PATCH 1/4] test pr --- excercise1.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 excercise1.sql diff --git a/excercise1.sql b/excercise1.sql new file mode 100644 index 0000000..028e2d8 --- /dev/null +++ b/excercise1.sql @@ -0,0 +1 @@ +test pull request \ No newline at end of file From ba26167c04f76f77b223de2c20666036332ffc40 Mon Sep 17 00:00:00 2001 From: danh Date: Thu, 25 May 2023 21:49:27 +0700 Subject: [PATCH 2/4] solve leetcode --- excercise1.sql | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/excercise1.sql b/excercise1.sql index 028e2d8..829388e 100644 --- a/excercise1.sql +++ b/excercise1.sql @@ -1 +1,45 @@ -test pull request \ No newline at end of file +Database + +Mỗi bài tập sẽ lưu trên file sol-{number}.sql + +1. Giải bài tập trên leetcode: + +https://leetcode.com/problems/capital-gainloss/description/ (gợi ý: sử dụng CASE) +-------------------------------------------------------------------------------------- +select new.stock_name, sum(newprice) as capital_gain_loss from ( + select old.stock_name, + CASE + WHEN operation = 'Buy' THEN -price + ELSE price + END AS newprice + from Stocks as old +) as new group by stock_name; +-------------------------------------------------------------------------------------- +https://leetcode.com/problems/count-salary-categories/ (ngoài các cách trên leetcode, hãy nghĩ cách để giúp câu query này nhanh hơn, kể cả thay đổi cấu trúc bản) +-------------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------------- +2. Bạn hãy viết một script để tạo các bản cho hệ thống với cấu trúc ở dưới + +![img.png](img.png) + +hệ thống bao gồm: + +- class +- professor: quan hệ one-many với class +- student: quan hệ many-many với class +- course: quan hệ one-many với class +- room: quan hệ one-one với class +-------------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------------- +3. Hãy viết câu query để tìm: +- những cặp student-professor có dạy học nhau và số lớp mà họ có liên quan +- những course (distinct) mà 1 professor cụ thể đang dạy +- những course (distinct) mà 1 student cụ thể đang học +- điểm số là A, B, C, D, E, F tương đương với 10, 8, 6, 4, 2, 0 +- điểm số trung bình của 1 học sinh cụ thể (quy ra lại theo chữ cái, và xếp loại học lực (weak nếu avg < 5, average nếu >=5 < 8, good nếu >=8 ) +- điểm số trung bình của các class (quy ra lại theo chữ cái) +- điểm số trung bình của các course (quy ra lại theo chữ cái) +-------------------------------------------------------------------------------------- + \ No newline at end of file From 7e74590449909603f1a2b7fce646a8856adc6918 Mon Sep 17 00:00:00 2001 From: danh Date: Thu, 25 May 2023 23:33:56 +0700 Subject: [PATCH 3/4] create schema --- excercise1.sql | 127 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 118 insertions(+), 9 deletions(-) diff --git a/excercise1.sql b/excercise1.sql index 829388e..dd54c09 100644 --- a/excercise1.sql +++ b/excercise1.sql @@ -17,7 +17,23 @@ select new.stock_name, sum(newprice) as capital_gain_loss from ( -------------------------------------------------------------------------------------- https://leetcode.com/problems/count-salary-categories/ (ngoài các cách trên leetcode, hãy nghĩ cách để giúp câu query này nhanh hơn, kể cả thay đổi cấu trúc bản) -------------------------------------------------------------------------------------- - +select +new.category, count(new.category)-1 as accounts_count +from ( + select + CASE + WHEN old.income > 50000 THEN 'High Salary' + WHEN old.income < 20000 THEN 'Low Salary' + ELSE 'Average Salary' + END AS category + from Accounts as old + UNION ALL + SELECT 'High Salary' as category + UNION ALL + SELECT 'Low Salary' as category + UNION ALL + SELECT 'Average Salary' as category +) as new group by new.category; -------------------------------------------------------------------------------------- 2. Bạn hãy viết một script để tạo các bản cho hệ thống với cấu trúc ở dưới @@ -31,15 +47,108 @@ hệ thống bao gồm: - course: quan hệ one-many với class - room: quan hệ one-one với class -------------------------------------------------------------------------------------- +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; +-- +DROP DATABASE IF EXISTS `SCHOOLDB`; +CREATE DATABASE IF NOT EXISTS `SCHOOLDB`; +USE `SCHOOLDB`; +DROP SCHEMA IF EXISTS `COLLEGE`; +CREATE SCHEMA `COLLEGE` DEFAULT CHARACTER SET utf8; +USE `COLLEGE`; +-- +DROP TABLE IF EXISTS `COLLEGE`.`COURSE`; + +CREATE TABLE IF NOT EXISTS `COLLEGE`.`COURSE` ( + `COURSE_ID` INT NOT NULL AUTO_INCREMENT, + `COURSE_NAME` VARCHAR(255) NOT NULL, + PRIMARY KEY (`COURSE_ID`)); +-- +DROP TABLE IF EXISTS `COLLEGE`.`PROFESSOR`; + +CREATE TABLE IF NOT EXISTS `COLLEGE`.`PROFESSOR` ( + `PROF_ID` INT NOT NULL AUTO_INCREMENT, + `PROF_LNAME` VARCHAR(50) NOT NULL, + `PROF_FNAME` VARCHAR(50) NOT NULL, + PRIMARY KEY (`PROF_ID`)); +-- +DROP TABLE IF EXISTS `COLLEGE`.`STUDENT`; + +CREATE TABLE IF NOT EXISTS `COLLEGE`.`STUDENT` ( + `STUD_ID` INT NOT NULL AUTO_INCREMENT, + `STUD_FNAME` VARCHAR(50) NOT NULL, + `STUD_LNAME` VARCHAR(50) NOT NULL, + `STUD_STREET` VARCHAR(255) NOT NULL, + `STUD_CITY` VARCHAR(50) NOT NULL, + `STUD_ZIP` VARCHAR(10) NOT NULL, + PRIMARY KEY (`STUD_ID`)); +-- +DROP TABLE IF EXISTS `COLLEGE`.`CLASS`; + +CREATE TABLE IF NOT EXISTS `COLLEGE`.`CLASS` ( + `CLASS_ID` INT 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, + PRIMARY KEY (`CLASS_ID`), + INDEX `PROF_ID_IDX` (`PROF_ID` ASC), + INDEX `COURSE_ID_IDX` (`COURSE_ID` ASC), + INDEX `ROOM_ID_IDX` (`ROOM_ID` ASC), + CONSTRAINT `PROF_CLASS_FK` FOREIGN KEY (`PROF_ID`) REFERENCES `COLLEGE`.`PROFESSOR` (`PROF_ID`) + ON DELETE RESTRICT + ON UPDATE RESTRICT, + CONSTRAINT `COURSE_CLASS_FK` FOREIGN KEY (`COURSE_ID`) REFERENCES `COLLEGE`.`COURSE` (`COURSE_ID`) + ON DELETE RESTRICT + ON UPDATE RESTRICT, + CONSTRAINT `ROOM_CLASS_FK` FOREIGN KEY (`ROOM_ID`) REFERENCES `COLLEGE`.`ROOM` (`ROOM_ID`) + ON DELETE RESTRICT + ON UPDATE RESTRICT); +-- + DROP TABLE IF EXISTS `COLLEGE`.`ENROLL`; + +CREATE TABLE IF NOT EXISTS `COLLEGE`.`ENROLL` ( + `STUD_ID` INT NOT NULL, + `CLASS_ID` INT NOT NULL, + `GRADE` VARCHAR(3) NOT NULL, + CONSTRAINT ENROLL_PK PRIMARY KEY (`STUD_ID`, `CLASS_ID`), + CONSTRAINT `STUD_ENROLL_FK` FOREIGN KEY (`STUD_ID`) REFERENCES `COLLEGE`.`STUDENT` (`STUD_ID`) + ON DELETE RESTRICT + ON UPDATE RESTRICT, + CONSTRAINT `CLASS_ENROLL_FK` FOREIGN KEY (`CLASS_ID`) REFERENCES `COLLEGE`.`CLASS` (`CLASS_ID`) + ON DELETE RESTRICT + ON UPDATE RESTRICT); + -- +DROP TABLE IF EXISTS `COLLEGE`.`ROOM`; +CREATE TABLE IF NOT EXISTS `COLLEGE`.`ROOM` ( + `ROOM_ID` INT NOT NULL AUTO_INCREMENT, + `ROOM_LOC` VARCHAR(50) NOT NULL, + `ROOM_CAP` VARCHAR(50) NOT NULL, + `CLASS_ID` INT NOT NULL, + PRIMARY KEY (`ROOM_ID`), + CONSTRAINT `CLASS_ROOM_FK` FOREIGN KEY (`CLASS_ID`) REFERENCES `COLLEGE`.`CLASS` (`CLASS_ID`) + ON DELETE RESTRICT + ON UPDATE RESTRICT); +-- +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; -------------------------------------------------------------------------------------- 3. Hãy viết câu query để tìm: -- những cặp student-professor có dạy học nhau và số lớp mà họ có liên quan -- những course (distinct) mà 1 professor cụ thể đang dạy -- những course (distinct) mà 1 student cụ thể đang học -- điểm số là A, B, C, D, E, F tương đương với 10, 8, 6, 4, 2, 0 -- điểm số trung bình của 1 học sinh cụ thể (quy ra lại theo chữ cái, và xếp loại học lực (weak nếu avg < 5, average nếu >=5 < 8, good nếu >=8 ) -- điểm số trung bình của các class (quy ra lại theo chữ cái) -- điểm số trung bình của các course (quy ra lại theo chữ cái) +a những cặp student-professor có dạy học nhau và số lớp mà họ có liên quan +b những course (distinct) mà 1 professor cụ thể đang dạy +c những course (distinct) mà 1 student cụ thể đang học +d điểm số là A, B, C, D, E, F tương đương với 10, 8, 6, 4, 2, 0 +e điểm số trung bình của 1 học sinh cụ thể (quy ra lại theo chữ cái, và xếp loại học lực (weak nếu avg < 5, average nếu >=5 < 8, good nếu >=8 ) +f điểm số trung bình của các class (quy ra lại theo chữ cái) +g điểm số trung bình của các course (quy ra lại theo chữ cái) -------------------------------------------------------------------------------------- - \ No newline at end of file +a +b +c +d +e +f +g \ No newline at end of file From 9ad67fb017ece5f7d546b2e3b1457960c8d755de Mon Sep 17 00:00:00 2001 From: danh Date: Fri, 26 May 2023 14:51:52 +0700 Subject: [PATCH 4/4] finish query --- excercise1.sql | 120 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 101 insertions(+), 19 deletions(-) diff --git a/excercise1.sql b/excercise1.sql index dd54c09..8123c06 100644 --- a/excercise1.sql +++ b/excercise1.sql @@ -1,10 +1,10 @@ -Database +/*Database Mỗi bài tập sẽ lưu trên file sol-{number}.sql 1. Giải bài tập trên leetcode: -https://leetcode.com/problems/capital-gainloss/description/ (gợi ý: sử dụng CASE) +https://leetcode.com/problems/capital-gainloss/description/ (gợi ý: sử dụng CASE)*/ -------------------------------------------------------------------------------------- select new.stock_name, sum(newprice) as capital_gain_loss from ( select old.stock_name, @@ -15,7 +15,7 @@ select new.stock_name, sum(newprice) as capital_gain_loss from ( from Stocks as old ) as new group by stock_name; -------------------------------------------------------------------------------------- -https://leetcode.com/problems/count-salary-categories/ (ngoài các cách trên leetcode, hãy nghĩ cách để giúp câu query này nhanh hơn, kể cả thay đổi cấu trúc bản) +/*https://leetcode.com/problems/count-salary-categories/ (ngoài các cách trên leetcode, hãy nghĩ cách để giúp câu query này nhanh hơn, kể cả thay đổi cấu trúc bản)*/ -------------------------------------------------------------------------------------- select new.category, count(new.category)-1 as accounts_count @@ -35,7 +35,7 @@ from ( SELECT 'Average Salary' as category ) as new group by new.category; -------------------------------------------------------------------------------------- -2. Bạn hãy viết một script để tạo các bản cho hệ thống với cấu trúc ở dưới +/*2. Bạn hãy viết một script để tạo các bản cho hệ thống với cấu trúc ở dưới ![img.png](img.png) @@ -45,7 +45,7 @@ hệ thống bao gồm: - professor: quan hệ one-many với class - student: quan hệ many-many với class - course: quan hệ one-many với class -- room: quan hệ one-one với class +- room: quan hệ one-one với class*/ -------------------------------------------------------------------------------------- SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; @@ -61,14 +61,14 @@ USE `COLLEGE`; DROP TABLE IF EXISTS `COLLEGE`.`COURSE`; CREATE TABLE IF NOT EXISTS `COLLEGE`.`COURSE` ( - `COURSE_ID` INT NOT NULL AUTO_INCREMENT, + `COURSE_ID` INT NOT NULL UNIQUE AUTO_INCREMENT, `COURSE_NAME` VARCHAR(255) NOT NULL, PRIMARY KEY (`COURSE_ID`)); -- DROP TABLE IF EXISTS `COLLEGE`.`PROFESSOR`; CREATE TABLE IF NOT EXISTS `COLLEGE`.`PROFESSOR` ( - `PROF_ID` INT NOT NULL AUTO_INCREMENT, + `PROF_ID` INT NOT NULL UNIQUE AUTO_INCREMENT, `PROF_LNAME` VARCHAR(50) NOT NULL, `PROF_FNAME` VARCHAR(50) NOT NULL, PRIMARY KEY (`PROF_ID`)); @@ -76,7 +76,7 @@ CREATE TABLE IF NOT EXISTS `COLLEGE`.`PROFESSOR` ( DROP TABLE IF EXISTS `COLLEGE`.`STUDENT`; CREATE TABLE IF NOT EXISTS `COLLEGE`.`STUDENT` ( - `STUD_ID` INT NOT NULL AUTO_INCREMENT, + `STUD_ID` INT NOT NULL UNIQUE AUTO_INCREMENT, `STUD_FNAME` VARCHAR(50) NOT NULL, `STUD_LNAME` VARCHAR(50) NOT NULL, `STUD_STREET` VARCHAR(255) NOT NULL, @@ -87,7 +87,7 @@ CREATE TABLE IF NOT EXISTS `COLLEGE`.`STUDENT` ( DROP TABLE IF EXISTS `COLLEGE`.`CLASS`; CREATE TABLE IF NOT EXISTS `COLLEGE`.`CLASS` ( - `CLASS_ID` INT NOT NULL AUTO_INCREMENT, + `CLASS_ID` INT NOT NULL UNIQUE AUTO_INCREMENT, `CLASS_NAME` VARCHAR(255) NOT NULL, `PROF_ID` INT NOT NULL, `COURSE_ID` INT NOT NULL, @@ -123,7 +123,7 @@ CREATE TABLE IF NOT EXISTS `COLLEGE`.`ENROLL` ( DROP TABLE IF EXISTS `COLLEGE`.`ROOM`; CREATE TABLE IF NOT EXISTS `COLLEGE`.`ROOM` ( - `ROOM_ID` INT NOT NULL AUTO_INCREMENT, + `ROOM_ID` INT NOT NULL UNIQUE AUTO_INCREMENT, `ROOM_LOC` VARCHAR(50) NOT NULL, `ROOM_CAP` VARCHAR(50) NOT NULL, `CLASS_ID` INT NOT NULL, @@ -136,19 +136,101 @@ SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; -------------------------------------------------------------------------------------- -3. Hãy viết câu query để tìm: +/*3. Hãy viết câu query để tìm: a những cặp student-professor có dạy học nhau và số lớp mà họ có liên quan b những course (distinct) mà 1 professor cụ thể đang dạy c những course (distinct) mà 1 student cụ thể đang học d điểm số là A, B, C, D, E, F tương đương với 10, 8, 6, 4, 2, 0 e điểm số trung bình của 1 học sinh cụ thể (quy ra lại theo chữ cái, và xếp loại học lực (weak nếu avg < 5, average nếu >=5 < 8, good nếu >=8 ) f điểm số trung bình của các class (quy ra lại theo chữ cái) -g điểm số trung bình của các course (quy ra lại theo chữ cái) +g điểm số trung bình của các course (quy ra lại theo chữ cái)*/ -------------------------------------------------------------------------------------- -a -b -c -d -e -f -g \ No newline at end of file +a- +select p.PROF_ID, p.PROF_FNAME, s.STUD_ID, s.STUD_FNAME, c.CLASS_ID, c.CLASS_NAME from PROFESSOR as p + left join CLASS as c on p.PROF_ID = c.PROF_ID + left join ENROLL as e on c.CLASS_ID = e.CLASS_ID + left join STUDENT as s on e.STUD_ID = s.STUD_ID; +------------------------------------ +b- +select distinct p.PROF_ID, p.PROF_FNAME, co.COURSE_ID, co.COURSE_NAME from PROFESSOR as p + left join CLASS as c on p.PROF_ID = c.PROF_ID + left join COURSE as co on c.COURSE_ID = co.COURSE_ID; +------------------------------------ +c- +select distinct s.STUD_ID, p.STUD_FNAME, co.COURSE_ID, co.COURSE_NAME from STUDENT as s + left join ENROLL as e on s.STUD_ID = e.STUD_ID + left join CLASS as c on e.CLASS_ID = c.CLASS_ID + left join COURSE as co on c.COURSE_ID = co.COURSE_ID; +------------------------------------ +d-/*ENROLL as e*/ +CASE + WHEN e.GRADE = 'A' THEN 10 + WHEN e.GRADE = 'B' THEN 8 + WHEN e.GRADE = 'C' THEN 6 + WHEN e.GRADE = 'D' THEN 4 + WHEN e.GRADE = 'E' THEN 2 + ELSE 0 +END +------------------------------------ +e- +select new.STUD_ID, new.STUD_FNAME, ( + CASE + WHEN average(new.number_grade) >= 8 THEN "Good" + WHEN average(new.number_grade) >= 5 AND average(new.number_grade) <8 THEN "Average" + ELSE "Weak" + END as average_rank +) from ( + select s.STUD_ID, s.STUD_FNAME + CASE + WHEN e.GRADE = 'A' THEN 10 + WHEN e.GRADE = 'B' THEN 8 + WHEN e.GRADE = 'C' THEN 6 + WHEN e.GRADE = 'D' THEN 4 + WHEN e.GRADE = 'E' THEN 2 + ELSE 0 + END as number_grade + FROM STUDENT as s left join ENROLL as e on s.STUD_ID = e.STUD_ID + where s.STUD_ID = xxx +) as new group by new.STUD_ID; +------------------------------------ +f- +select new.CLASS_ID, new.CLASS_NAME, ( + CASE + WHEN average(new.number_grade) >= 8 THEN "Good" + WHEN average(new.number_grade) >= 5 AND average(new.number_grade) <8 THEN "Average" + ELSE "Weak" + END as average_rank +) from ( + select c.CLASS_ID, c.CLASS_NAME + CASE + WHEN e.GRADE = 'A' THEN 10 + WHEN e.GRADE = 'B' THEN 8 + WHEN e.GRADE = 'C' THEN 6 + WHEN e.GRADE = 'D' THEN 4 + WHEN e.GRADE = 'E' THEN 2 + ELSE 0 + END as number_grade + FROM CLASS as c left join ENROLL as e on c.CLASS_ID = e.CLASS_ID +) as new group by new.CLASS_ID; +------------------------------------ +g- +select new.COURSE_ID, new.COURSE_NAME, ( + CASE + WHEN average(new.number_grade) >= 8 THEN "Good" + WHEN average(new.number_grade) >= 5 AND average(new.number_grade) <8 THEN "Average" + ELSE "Weak" + END as average_rank +) from ( + select co.COURSE_ID, co.COURSE_NAME + CASE + WHEN e.GRADE = 'A' THEN 10 + WHEN e.GRADE = 'B' THEN 8 + WHEN e.GRADE = 'C' THEN 6 + WHEN e.GRADE = 'D' THEN 4 + WHEN e.GRADE = 'E' THEN 2 + ELSE 0 + END as number_grade + FROM COURSE as co + left join CLASS as c on co.COURSE_ID = c.COURSE__ID + left join ENROLL as e on c.CLASS_ID = e.CLASS_ID +) as new group by new.COURSE_ID; \ No newline at end of file