벌써 금요일이다.
어제 공부를 열심히한 덕인가?
내용이 머릿속에서 정리가 된 상태로 일어났다.














정신이 맑으니 오늘은 퐈이팅해서 공부열심히하고
주말에 천천히 복습하면서 쉬어야겠다.


오늘도 ERD관련해서 공부를 진행한다.
어제와 다른점은 ERD Cloud를 이용해서 그렸다면
이번엔 SQL 문법으로 테이블을 만들고
레코드값 넣고 타입정하고 이런 것들을 쿼리를 날려
최종적으로 어제 했던 것과 같이 ERD를 완성시키는 날이다.

우선 MySQL WorkBench를 이용해
문법을 이용해 만들어 보는 연습을 해보았다.


MYSQL WorkBench 연습

테이블 생성

기본적인 문법으로 Database를 만들고
Table과 동시에 컬럼을 만들 었다.
그냥 아무런 의미없는 테이블이다.

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,
  userId int not null,
  created_at timestamp not null DEFAULT (current_timestamp),
);

그러면 두 개의 테이블이 만들어졌을 것이고
conten의 userId를 FK(외래키)로 지정하여
user의 id를 참조하도록 만들었다.

ALTER TABLE을 이용해 컬럼을 삭제하거나 추가할 수가 있는데
FOREIGN KEY라는 키워드와 REFERENCES를 이용하면
외래키를 사용할 수 있게된다.

ALTER TABLE `content` ADD FOREIGN KEY (`userId`) REFERENCES `user` (`id`);

위에 구문은 content 테이블의 userId 외래키에게
user의 id를 참조하도록 추가해주는 구문이다.
영어 그대로 읽으면 좀 더 쉬운 느낌이든다.

여기서 한가지 문제점이었던 것은
실수로 레코드에 데이터를 넣고 외래키 지정하려고 위의 명령어를
사용했을때는 오류가 발생해서 레코드값을 클리어하고

다시 설정해주었다.


레코드값 추가

그리고 그냥 아무런 데이터 들을 INSERT하여
레코드의 값을 채워 주었다.

INSERT INTO content (title,body,userId) VALUES ('쿠크','세이튼?',5);
INSERT INTO user (name,email) VALUES ('KIM BOM JIN','bomgin892@gmail.com');

값을 넣고 제대로 만들어졌는지 
user랑 content Table 조회.


























조회가 잘 되는 것 같다.
여기서 배운 것은, 데이터를 삭제하면 자동증가인 id값은
지운번호 부터 시작하지 않는 다는 것과.

timestamp라는 타입을 이용해 레코드가 생성되는 시점에
시간을 남겨주는 방법도 배웠다.


LEFT JOIN

가장 헷갈리는 JOIN 관련된 문법을 주로 연습했다.

SELECT * FROM content
LEFT JOIN user ON content.id = user.id;

우선 테이블 두개를 JOIN 해보았다.

LEFT                 RIGHT

content                user

이렇게 지정해 놓고 LEFT JOIN을 이용하였다.











그렇게 되면 LEFT의 전체 요소들과
RIGHT중 공통된 부분만 가져오는 방법이다.

그림만 봐서는 왼쪽 TABLE만 값을 가져오는 것 아닌가?
라는 생각을 할 수 있지만, 전혀 다르다.

왼쪽의 내용 + 포함된 오른쪽의 내용 까지이다.
한번 아래에서 테스트해보자.

왼쪽만 조회시











LEFT의 있는 데이터만 조회된다.

LEFT JOIN하여 조회하기











왼쪽만 조회하는 것과는 다른 내용이 추가되었다.
2,3번 Id에 해당하는 데이터가 추가되었고
나머지 행은 NULL이 되어있는 모습이다.

여기서 알수 있는점은 SELECT *를 하여 전체 열을 조회하게하였고
JOIN을 통해 두개의 열이 합쳐져서 전체 열이 표현된 모습이다.

그런데 위에 조건에 ON content.id = user.id; 라는 조건이 붙었다.
이말과 같이 content.id와 같은 user.id만 표시하게 되는 것이다.
그래서 user에 1,2,3,4,5 id가 있지만 2,3만 추출되고
나머지는 값이 없기 때문에 null이 표시되어지는 것이다.

여기서 만약 조건을
content.userId = user.id; 로 바꿧을때는 어떻게될까?











위에서 보는 것과 같이 content의 userId에는
user의 모든 내용을 담고 있기 때문에
모든 데이터가 표시되는 모습이다.

여기서 우리는 원하는 데이터만 SELECT를 변경해 추출할 수있다.











SELECT *를 내가 원하는 데이터만 받도록 변경하였다.
깔끔하게 데이터가 보이는 모습이다.

여기서 알 수 있는 얘기는 어제 배웠던 1:N 상황에서
하나의 테이블만 참조해도 모든 자원을 확인할 수 있다는 점이다.
userId라는 FK 하나를 통해서 content 테이블은
user 테이블을 참조해 데이터를 들여다보게 될 수 있는 것이다.


INNER JOIN

이번엔 처음으로 돌아가서
INNER JOIN을 해보자

SELECT * FROM content
INNER JOIN user ON content.id = user.id;

LEFT 에서 INNER만 바꾼 코드다
전체를 조회하며
조회하는 범위는 LEFT -> INNER로 변경된 것이다.

LEFT                 RIGHT

content                user











즉 위와 같이 포함하게 되는 것이고

content와 user의 데이터 중 공통으로 참조된 값만 표현한다.











직접 실행하게되면 2,3번만 해당하는 데이터들만 표현되었다.
LEFT로 실행했을때는 LEFT의 레코드들이 쭉 표현되었고
RIGHT 테이블의 레코드는 조건에 부합하는 값만 가져오고
나머지는 다 Null로 표현되었었다.

INNER JOIN으로 표현하니 LEFT의 값들과 RIGHT와
동일한 데이터만 표시하게 되는 모습이다.

여기까지 JOIN에 대해서 여러가지 시도해보면서
데이터에 접근하다보니까 얼추 어떻게 사용하는지 이해가 되었다.
RIGHT JOIN은 LEFT JOIN과 같은 방식이고
주로 LEFT를 사용한다고하여 다른 JOIN들을 포함해
추후에 학습해보자


DBdaigram 연습

DBdiagram이라는 홈페이지에서
SQL를 입력해 ERD처럼 만들 수 가 있다.

물론 Workbench로도 작업이 가능하지만
오늘 실습에 의의는 DB GUI를 이용하지 않고
위에 홈페이지에서 진행해보는 것이니
작업을 해보자.

user, category, content, content_category, role 이라는
테이블을 만들어 id와 각각의 레코드를 생성한 후에
Foreign Key를 사용할 수 있도록 해주는 문제다.

  1. user 테이블의 Foreign Key = role.id
  2. content 테이블의 Foreign Key = user.id
  3. content_category 테이블의 Foreign Key = content.id
  4. content_category 테이블의 Foreign Key = category.id

위의 조건을 토대로 작업을 진행하였다.

1번은 1:N
2번은 1:N
3,4번은 N:N
의 형태로 참조가 진행되어진다.

CREATE TABLE `user` (
  `id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `roledId` INT
);

CREATE TABLE `category` (
  `id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL
);

CREATE TABLE `content` (
  `id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `body` varchar(255) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT (current_timestamp),
  `userId` varchar(255) NOT NULL
);

CREATE TABLE `content_category` (
  `id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  `contentId` INT NOT NULL,
  `categoryId` INT NOT NULL
);

CREATE TABLE `role` (
  `id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL
);

ALTER TABLE `content` ADD FOREIGN KEY (`userId`) REFERENCES `user` (`id`);

ALTER TABLE `user` ADD FOREIGN KEY (`roledId`) REFERENCES `role` (`id`);

ALTER TABLE `content_category` ADD FOREIGN KEY (`contentId`) REFERENCES `content` (`id`);

ALTER TABLE `content_category` ADD FOREIGN KEY (`categoryId`) REFERENCES `category` (`id`);

위와 같이 작성하게된다면
아래와 같이 표현되게 되어진다!!













처음에 SQL을 접했을때 문법을 사용하는 것에는
무리가 없었지만 왜 사용해야하고
어떻게 활용을하며,, 관계를 정하는데 있어
너무 많은 어려움이 있었다.

RDBMS 3일차 공부를 시작하면서
공부하던게 쌓여서 그런지
어느순간 이해가 딱되서 머리가 트인 느낌이들었다.
오늘하루 공부가 잘되서 너무 기뻣고
재밋게 실습했던 것 같다.
오늘 공부는 여기서 끝!


오늘의 커피량: ☕️ ☕️
오늘의 점심: 엽기 떡볶이, 주먹밥