필요한 데이터테이블이 여러개일때 JOIN을 어떻게 사용하는지 알아보는 스프린트다
둘 이상의 테이블을 연결해서 데이터를 검색하는 방법이다
테이블을 연결하려면 적어도 하나의 칼럼은 서로 공유되고 있어야 하고
Primary key 또는 Foreign key로 두 테이블을 연결한다
기준 테이블과 Join 한 테이블의 중복된 값을 보여준다
A의 테이블과 B테이블이 모두 가지고 있는 데이터만 나온다
SELECT
테이블이름.조회할칼럼,
테이블이름.조회할칼럼
FROM 기준테이블 이름
INNER JOIN 조인테이블 이름
ON 기준테이블이름.기준키 = 조인테이블이름.기준키
SELECT
테이블이름.조회할칼럼,
테이블이름.조회할칼럼
FROM 기준테이블 이름
LEFT JOIN 조인테이블 이름
ON 기준테이블이름.기준키 = 조인테이블이름.기준키
jiSungPark(user.name)이 작성한 content의 title(content.title)을 찾고싶을 때 두 테이블을 합쳐서 검색 할 수 있어야 한다
1 찾고자 하는 정보 content.title을 SELECT 한 뒤
2 기준이 되는 테이블을 FROM 뒤에 써준다
3 그리고 JOIN할 테이블을 써주고
4 두 테이블을 연결되어있는 키 값으로 연결(ON) 해준다
5 그 안에서 WHERE를 사용해 특정 조건을 가진 데이터를 조회한다
SELECT content.title FROM content
LEFT JOIN user
ON user.id = content.userId
WHERE user.name = 'jiSungPark';
✅ FROM 뒤가 기준이라는걸 잊지 말자
3개 이상의 여러 테이블을 JOIN 해야 할 때도 조건만 잘 맞춰서 쓰면 된다
// 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 ('jiwon','jiwon@naver.com')`;
// TODO: Q 4-4. user 테이블에서 특정 조건을 가진 데이터를 찾기위한 SQL을 작성해주세요.
// 조건 : name이 duhyunkim이여야 합니다.
const PART4_4 = `SELECT name FROM user WHERE name = 'duhyunkim'`;
--> 전체 선택이 아닌 name만 선택하게 되면 더 빨리 찾을 수 있다
// 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.id = user.id`;
// TODO: Q 4-8. content의 title과 그 컨텐츠를 작성한 user의 name을 찾기 위한 SQL을 작성해주세요.
// 저자가 있는 컨텐츠의 title만 찾아야합니다.
const PART4_8 = `SELECT content.title, user.name FROM content
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 ('a', 'a', 1)`;
/* DO NOT TOUCH OR CHANGE BELOW SQL STATEMENT */
USE learnmysql;
/* DESIGN SCHEMA FOR REQUIREMENT */
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 5-1-1. category 테이블의 구조를 보기위한 SQL을 작성해주세요.
const PART5_1_1 = `DESC category`;
// TODO: Q 5-1-2. content_category 테이블의 구조를 보기위한 SQL을 작성해주세요.
const PART5_1_2 = `DESC content_category`;
// TODO: Q 5-1-3. role 테이블의 구조를 보기위한 SQL을 작성해주세요.
const PART5_1_3 = `DESC role`;
// TODO: Q 5-1-4. user 테이블의 구조를 보기위한 SQL을 작성해주세요.
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: 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
LEFT JOIN user
ON user.id = content.userId
WHERE user.name = 'jiSungPark'`;
// TODO: Q 5-2-6. JiSungPark이 작성한 content의 category name을 찾기위한 SQL을 작성해주세요.
const PART5_2_6 = `SELECT category.name FROM category
LEFT JOIN content_category
ON category.id = content_category.categoryId
LEFT JOIN content
ON content_category.contentId = content.id
LEFT JOIN user
ON content.userId = user.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
LEFT JOIN content_category
ON content.id = content_category.contentId
LEFT 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
LEFT JOIN content
ON user.id = content.userId
LEFT JOIN content_category
ON content.id = content_category.contentId
LEFT 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
LEFT JOIN user 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.id) AS ContentCount FROM user
LEFT JOIN content ON user.id = content.userId
GROUP BY user.name
`;