코드스테이츠 12주차 / SQL 실습

support·2022년 1월 24일
0
post-thumbnail

필요한 데이터테이블이 여러개일때 JOIN을 어떻게 사용하는지 알아보는 스프린트다

JOIN

둘 이상의 테이블을 연결해서 데이터를 검색하는 방법이다
테이블을 연결하려면 적어도 하나의 칼럼은 서로 공유되고 있어야 하고
Primary key 또는 Foreign key로 두 테이블을 연결한다

1. INNER JOIN(교집합)

기준 테이블과 Join 한 테이블의 중복된 값을 보여준다
A의 테이블과 B테이블이 모두 가지고 있는 데이터만 나온다

SELECT
테이블이름.조회할칼럼,
테이블이름.조회할칼럼
FROM 기준테이블 이름
INNER JOIN 조인테이블 이름 
ON 기준테이블이름.기준키 = 조인테이블이름.기준키

2. LEFT/RIGHT JOIN(부분집합)

SELECT
테이블이름.조회할칼럼,
테이블이름.조회할칼럼
FROM 기준테이블 이름
LEFT JOIN 조인테이블 이름 
ON 기준테이블이름.기준키 = 조인테이블이름.기준키

ex) jiSungPark이 작성한 content의 title을 찾기위한 SQL을 작성

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. 다중테이블

3개 이상의 여러 테이블을 JOIN 해야 할 때도 조건만 잘 맞춰서 쓰면 된다

part4

// 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)`;

part5

schema.sql 작성

/* 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`);

part5.js


// 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
                    `;

0개의 댓글