๋ฐ์ดํฐ ๋ฒ ์ด์ค์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ธ SQL์ ๊ณต๋ถํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ด CRUD๋ฅผ ํ ์์๋ ์ธ์ด์ธ SQL ๋ฌธ๋ฒ์ ์คํ๋ฆฐํธ ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํด๋ณด์.
์คํ๋ฆฐํธ๋ part 5๊น์ง ์๊ณ ,
part1,2๋ mysql ํด์ฆ์ ์ค์น๋ก ์ด๋ฃจ์ด์ ธ์์ด ์ด๋ ต์ง ์์ผ๋ฏ๋ก part3๋ถํฐ ๋ค๋ฃจ๊ธฐ๋ก ํ๋ค.
Part 3์ ๋ชฉํ
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ๊ณ , ์ฃผ์ด์ง ์คํค๋ง๋ฅผ ๊ตฌํํ ์ ์๋๋ก SQL ๋ฌธ ์์ฑ.
/migrations/schema.sql
์ด๋ฒ ์คํ๋ฆฐํธ์ ํต์ฌ์ด๊ณ , ๋ฐ๋์ ์์ฑํด์ผ ํ๋ ๋ถ๋ถ. ํ ์ด๋ธ๊ณผ ์ปฌ๋ผ์ ์์ฑํด์ผ ๊ณผ์ ๋ฅผ ์งํํ ์์๋ค.
๋ง๋ค์ด์ผํ๋ ํ ์ด๋ธ ์คํค๋ง๋ฅผ ๋ณด๊ณ ํ์ํ๋ถ๋ถ์ ์ฑ์ด๋ค
USE learnmysql;
/* DESIGN SCHEMA FOR REQUIREMENT */
-- PART 3:
-- ์ฌ๊ธฐ user ํ
์ด๋ธ ์์ฑ SQL ๊ตฌ๋ฌธ์ด ์์ต๋๋ค.
-- user ํ
์ด๋ธ์ ์ฐธ๊ณ ํด์, content ํ
์ด๋ธ ์์ฑ SQL ๊ตฌ๋ฌธ์ ์์ฑํ์ธ์.
CREATE TABLE `user` (
`id` int PRIMARY KEY AUTO_INCREMENT,
`name` varchar(255) not NULL,
`email` varchar(255) not NULL
);
CREATE TABLE `content` (
`id` int PRIMARY KEY AUTO_INCREMENT,
`title` varchar(255) not NULL,
`body` varchar(255) not Null,
`created_at` timestamp not NULL DEFAULT CURRENT_TIMESTAMP,
`userId` int,
FOREIGN KEY (`userId`) REFERENCES `user` (`id`)
);โ
schema.sql์ ์ด๋ ๊ฒ ์์ฑํ๋ค part3.js๋ก ๋์ด๊ฐ์.
TODO: Q 3-1. ํ์ฌ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ ๋ชจ๋ ํ
์ด๋ธ ์ ๋ณด๋ฅผ ๋ณด๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART3_1 = `SHOW TABLES`;
TODO: Q 3-2. user ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
- ์๊ตฌ์ฌํญ์ ๋ง๋ user ํ
์ด๋ธ์ ์์ฑํด์ผ๋ง, ํ
์คํธ๋ฅผ ํต๊ณผํฉ๋๋ค.
const PART3_2 = `describe user`;
TODO: Q 3-3. content ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
- ์๊ตฌ์ฌํญ์ ๋ง๋ content ํ
์ด๋ธ์ ์์ฑํด์ผ๋ง, ํ
์คํธ๋ฅผ ํต๊ณผํฉ๋๋ค.
const PART3_3 = `describe content`;
Part 4๋ Part 3์์ ๊ตฌ์ฑํ ์คํค๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ๋ถ๋ฌ์ฌ ์ ์๋๋ก SQL ๋ฌธ์ ์์ฑํ๋ ๊ฒ์ด ๋ชฉํ
TODO: Q 4-1. user ํ
์ด๋ธ์ ์กด์ฌํ๋ ๋ชจ๋ ์ปฌ๋ผ์ ํฌํจํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ธฐ ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART4_1 = `select * from user`;
TODO: Q 4-2. user ํ
์ด๋ธ์ ์กด์ฌํ๋ ๋ชจ๋ ๋ฐ์ดํฐ์์ name ์ปฌ๋ผ๋ง์ ํ์ธํ๊ธฐ ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART4_2 = `select name from user`;
TODO: Q 4-3. user ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART4_3 = `INSERT INTO user (name, email) VALUES ('WOODY', 'woody@naver.com')`;
TODO: Q 4-4. user ํ
์ด๋ธ์์ ํน์ ์กฐ๊ฑด์ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
- ์กฐ๊ฑด : name์ด duhyunkim์ด์ฌ์ผ ํฉ๋๋ค.
const PART4_4 = `SELECT name FROM user WHERE user.name ='duhyunkim'`;
TODO: Q 4-5. user ํ
์ด๋ธ์์ ํน์ ์กฐ๊ฑด์ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
- ์กฐ๊ฑด : name์ด duhyunkim์ด ์๋์ฌ์ผ ํฉ๋๋ค.
const PART4_5 = `SELECT name FROM user WHERE NOT user.name = 'duhyunkim'`;
TODO: Q 4-6. content ํ
์ด๋ธ์ ์กด์ฌํ๋ ๋ชจ๋ ๋ฐ์ดํฐ์์ title ์ปฌ๋ผ๋ง์ ์ฐพ๊ธฐ ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART4_6 = `SELECT title FROM content`;
TODO: Q 4-7. content์ title๊ณผ ๊ทธ ์ปจํ
์ธ ๋ฅผ ์์ฑํ user์ name์ ์ฐพ๊ธฐ ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
- ์ ์๊ฐ ์๋๋ผ๋, ์ผํด์ธ ์ title์ ๋ชจ๋ ์ฐพ์์ผํฉ๋๋ค.
const PART4_7 = `SELECT content.title, user.name FROM user INNER JOIN content ON user.id = content.id`;
TODO: Q 4-8. content์ title๊ณผ ๊ทธ ์ปจํ
์ธ ๋ฅผ ์์ฑํ user์ name์ ์ฐพ๊ธฐ ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
- ์ ์๊ฐ ์๋ ์ปจํ
์ธ ์ title๋ง ์ฐพ์์ผํฉ๋๋ค.
const PART4_8 = `
SELECT content.title, user.name
FROM user
INNER JOIN content ON user.id = content.id
WHERE content.userId `;
TODO: Q 4-9. content์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ธฐ ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
- title์ด database sprint์ธ content ๋ฐ์ดํฐ์์ body๋ฅผ database is very easy๋ก ์์ ํด์ผํฉ๋๋ค.
const PART4_9 = `UPDATE content
SET body = 'database is very easy'
WHERE title = 'database sprint'`;
TODO: Q 4-10. content์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
- duhyunkim์ด ์์ฑํ ์ปจํ
์ธ ๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์. ์ ๋ชฉ๊ณผ ๋ณธ๋ฌธ์ ์์ ์
๋๋ค. (์ฐธ๊ณ : duhyunkim์ ์์ด๋๋ 1์
๋๋ค.)
const PART4_10 = `
INSERT INTO content(title, body, userId)
VALUES ('ํ๋ด์', 'ํต๊ณผ' , '1')
`;
Part 5๋ ์๊ตฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ์คํค๋ง๋ฅผ ์ถ๊ฐ/๋ณ๊ฒฝํ๊ณ , ์ถ๊ฐ/๋ณ๊ฒฝ๋ ์คํค๋ง๋ฅผ ํ์ธํ๋ ๊ณผ์ .
1:N(์ผ๋๋ค), N:N(๋ค๋๋ค) ๊ด๊ณ์ ๋๋ถ์ด JOIN ํ ์ด๋ธ์ ๋ํด ์ดํดํ๊ธฐ
๋จผ์ ,
/migrations/schema.sql์ ํ ์ด๋ธ์ ์ถ๊ฐ ๋ฐ ์์ ํด์ค๋ค.
TODO: Q 5-1-1. category ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_1_1 = `describe category`;
TODO: Q 5-1-2. content_category ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_1_2 = `DESCRIBE content_category`;
TODO: Q 5-1-3. role ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_1_3 = `DESCRIBE role`;
TODO: Q 5-1-4. user ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_1_4 = `DESCRIBE user`;
TODO: Q 5-2-1. category ํ
์ด๋ธ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ์์ id, name์ ์ฐพ๋ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_2_1 = `select id, name from category`;
TODO: Q 5-2-2. user์ name๊ณผ email ๊ทธ๋ฆฌ๊ณ ๊ทธ user๊ฐ ์ํ role name(์ปฌ๋ผ๋ช
: roleName)์ ์ฐพ๊ธฐ ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
- ์ํ role์ด ์๋๋ผ๋, user์ name๊ณผ email,role name์ ๋ชจ๋ ์ฐพ์์ผํฉ๋๋ค.
const PART5_2_2 =
`SELECT user.name, user.email, role.name AS roleName
FROM user
LEFT JOIN role ON user.roleId = role.id`;
TODO: Q 5-2-3. ์ด๋ role์๋ ์ํ์ง ์๋ user์ ๋ชจ๋ ์ปฌ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_2_3 = `SELECT * FROM user WHERE roleId IS NULL`;
TODO: Q 5-2-4. content_category ํ
์ด๋ธ์ ์กด์ฌํ๋ ๋ชจ๋ ์นผ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_2_4 = `SELECT * FROM content_category`;
TODO: Q 5-2-5. jiSungPark์ด ์์ฑํ content์ title์ ์ฐพ๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_2_5 = `
SELECT content.title, user.name
FROM user
INNER JOIN content ON user.id = content.id
WHERE user.name = 'jiSungPark'`;
TODO: Q 5-2-6. JiSungPark์ด ์์ฑํ content์ category name์ ์ฐพ๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_2_6 = `
SELECT user.name, category.name
FROM user
INNER JOIN content ON user.id = content.userId
INNER JOIN content_category ON content_category.contentId = content.id
INNER JOIN category ON content_category.categoryId = category.id
WHERE user.name = 'jiSungPark'`;
TODO: Q 5-2-7. category์ name์ด soccer์ธ content์ title, body, created_at์ ์ฐพ๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_2_7 = `
SELECT content.title, content.body, content.created_at
FROM content
JOIN content_category ON content.Id = content_category.contentID
JOIN category ON categoryId = category.id
WHERE category.name = 'soccer'`;
TODO: Q 5-2-8. category์ name์ด soccer์ธ content์ title, body, created_at, user์ name์ ์ฐพ๊ธฐ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_2_8 = `
SELECT content.title, content.body, content.created_at, user.name
FROM user
JOIN content ON user.id = content.userId
JOIN content_category ON content.Id = content_category.contentID
JOIN category ON categoryId = category.id
WHERE category.name = 'soccer'`;
TODO: Q 5-2-9. duRiCha๊ฐ ์์ฑํ ๊ธ์ ๊ฐ์ (์ปฌ๋ผ๋ช
: ContentCount)๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_2_9 = `
SELECT COUNT(content.title) AS ContentCount
FROM user
JOIN content ON user.id = content.userId
WHERE user.name = 'duRiCha';`;
TODO: Q 5-2-10. ๊ฐ user(์ปฌ๋ผ๋ช
: name)๊ฐ ์์ฑํ ๊ธ์ ๊ฐ์ (์ปฌ๋ผ๋ช
: ContentCount)๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ SQL์ ์์ฑํด์ฃผ์ธ์.
const PART5_2_10 = `
SELECT user.name as name,
COUNT(content.userId) AS ContentCount
FROM user
LEFT JOIN content ON user.id = content.userId
GROUP BY user.name`;
SQL๋ฌธ๋ฒ์ ์ด๋ ต๊ฒ ์๊ฐํ๋๋ฐ ๋ง์ ์ฌ์ฉํ๋ค๋ณด๋ ๊ด๊ณ๋ฅผ ์ ์ดํดํ ์ ์๋ค๋ฉด ๋ฌธ๋ฒ์ ํฌ๊ฒ ์ด๋ ต์ง ์๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
'TIL -์ผ๊ฐํ์ต๊ธฐ๋ก > ๋ฐ์ดํฐ ๋ฒ ์ด์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
NOSQL - Mongo DB (0) | 2022.03.15 |
---|
๋๊ธ