오늘은 지난주에 이어서 조건에 맞게 테이블을 생성하고 원하는 데이터를 리턴하도록 명령문을 작성하는 스프린트를 수행하였다. SELECT에 필요한 테이블이 여러개일 때 JOIN을 사용해서 데이터를 추출하는 법을 익힐 수 있어 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`) );
CREATE TABLE `category` ( `id` int PRIMARY KEY AUTO_INCREMENT, `name` varchar(255) not NULL );
CREATE TABLE `content_category` ( `id` int PRIMARY KEY AUTO_INCREMENT, `contentId` int not NULL, `categoryId` int not NULL, FOREIGN KEY (`contentId`) REFERENCES `content` (`id`), FOREIGN KEY (`categoryId`) REFERENCES `category` (`id`) );
CREATE TABLE `role` ( `id` int PRIMARY KEY AUTO_INCREMENT, `name` varchar(255) not NULL );
ALTER TABLE `user` ADD roleId int; ALTER TABLE `user` ADD FOREIGN KEY (`roleId`) REFERENCES `role` (`id`);
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을 작성해주세요. - 원하는 name, email을 사용하시면 됩니다. */ const PART4_3 = `INSERT INTO user (name, email) VALUES ('kimcoding', 'kimcoding@codestates.com');`; /* ---------------------------------------------------------------------------------------------- TODO: Q 4-4. user 테이블에서 특정 조건을 가진 데이터를 찾기위한 SQL을 작성해주세요. - 조건 : name이 duhyunkim이여야 합니다. */ const PART4_4 = `SELECT * FROM user WHERE name='duhyunkim';`; /* ---------------------------------------------------------------------------------------------- TODO: Q 4-5. user 테이블에서 특정 조건을 가진 데이터를 찾기위한 SQL을 작성해주세요. - 조건 : name이 duhyunkim이 아니여야 합니다. */ const PART4_5 = `SELECT * FROM user WHERE 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 content LEFT JOIN user ON content.userID=user.id;`; /* ---------------------------------------------------------------------------------------------- TODO: Q 4-8. content의 title과 그 컨텐츠를 작성한 user의 name을 찾기 위한 SQL을 작성해주세요. - 저자가 있는 컨텐츠의 title만 찾아야합니다. */ const PART4_8 = `SELECT content.title, user.name FROM content INNER JOIN user ON content.userID=user.id;`; /* ---------------------------------------------------------------------------------------------- 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 ('codestates', 'I love coding', '1')`; ---------------------------------------------------------------------------------------------- TODO: Q 5-1-1. category 테이블의 구조를 보기위한 SQL을 작성해주세요. - 요구사항에 맞는 category 테이블을 작성해야만, 테스트를 통과합니다. */ const PART5_1_1 = `DESC category`; /* ---------------------------------------------------------------------------------------------- TODO: Q 5-1-2. content_category 테이블의 구조를 보기위한 SQL을 작성해주세요. - 요구사항에 맞는 content_category 테이블을 작성해야만, 테스트를 통과합니다. */ const PART5_1_2 = `DESC content_category`; /* ---------------------------------------------------------------------------------------------- TODO: Q 5-1-3. role 테이블의 구조를 보기위한 SQL을 작성해주세요. - 요구사항에 맞는 role 테이블을 작성해야만, 테스트를 통과합니다. */ const PART5_1_3 = `DESC role`; /* ---------------------------------------------------------------------------------------------- TODO: Q 5-1-4. user 테이블의 구조를 보기위한 SQL을 작성해주세요. - 요구사항에 맞는 user 테이블을 작성해야만, 테스트를 통과합니다. */ const PART5_1_4 = `DESC 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: content_category 테이블의 의미를 테이블 관계로서 이해하고 있는지 점검해주세요. 질문자체가 이해가 안된다면, Help-Desk에 질문해주세요. ---------------------------------------------------------------------------------------------- */다 /* ---------------------------------------------------------------------------------------------- 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 FROM content INNER JOIN user ON content.userId=user.id WHERE user.name='JiSungPark'`; /* ---------------------------------------------------------------------------------------------- TODO: Q 5-2-6. JiSungPark이 작성한 content의 category name을 찾기위한 SQL을 작성해주세요. */ const PART5_2_6 = `SELECT category.name FROM category INNER JOIN content_category ON category.id=content_category.categoryId INNER JOIN content ON content_category.contentId=content.id INNER JOIN user ON user.id=content.userId 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 INNER JOIN content_category ON content.id=content_category.contentId INNER JOIN category ON content_category.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 INNER JOIN content ON user.id=content.userId INNER JOIN content_category ON content.id=content_category.contentId INNER JOIN category ON content_category.categoryId=category.id WHERE category.name='soccer'`; /* ---------------------------------------------------------------------------------------------- TODO: Q 5-2-9. duRiCha가 작성한 글의 개수 (컬럼명: ContentCount)를 출력하기 위한 SQL을 작성해주세요. */ const PART5_2_9 = `SELECT COUNT(*) AS ContentCount FROM content INNER JOIN user ON content.userId=user.id WHERE user.name='duRiCha'`; /* ---------------------------------------------------------------------------------------------- TODO: Q 5-2-10. 각 user(컬럼명: name)가 작성한 글의 개수 (컬럼명: ContentCount)를 출력하기 위한 SQL을 작성해주세요. */ const PART5_2_10 = `SELECT user.name AS name, COUNT(content.id) AS ContentCount FROM user LEFT JOIN content ON user.id=content.userId GROUP BY user.name`;
처음에 JOIN에 대해 학습할때 어떤 식으로 사용해야 하는지 감이 안잡혔는데, 다이어그램을 참고해서 JOIN을 중첩해서 사용하는 명령문을 작성하는 과정이 도움이 되었고, mysql에 직접 출력되는 데이터를 보면서 INNER JOIN과 LEFT JOIN, RIGHT JOIN의 차이점을 확실하게 알 수 있었다.
좋은글이네요.