관계형데이터베이스의 꽃
JOIN
이전 예제를 통해 두개의 테이블을 만들었는데 이 둘의 결합고리가 무엇인가?
결합고리는
topic 테이블에서는 author_id의 값이고, author 테이블에서는 id의 값이다.
이제 우리가 MySQL에게 "topic 테이블에 있는 모든 데이터를 출력할 것인데 그 때에 author_id의 값과 같은 값을 가지고 있는 author 테이블에 있는 행을 가지고 와서 topic 테이블에 붙여!" 라고 명령할 것이다.
그냥 불러오는 것은
SELECT * FROM topic;
SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id;
명령어와 같이 topic 테이블의 author_id 값과 author 테이블의 id 값이 같은 것 끼리 같은 행에 붙어서 정렬된 것을 볼 수 있다.
여기서 author_id 와 id 값을 보고 싶지 않을 때,
SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id;
에서 * 는 모든 컬럼을 불러온다는 것이니까, * 를 지우고 불러올 컬럼 값을 입력.
SELECT id,title,description,created,name,profile FROM topic LEFT JOIN author ON topic.author_id = author.id;
라고 하니
ERROR 1052 (23000): Column 'id' in field list is ambiguous
라는 에러를 뱉어 버린다. 여기서 ambiguous는 애매하다. 라는 뜻.
알고 보니 author 테이블과 topic 테이블의 첫번째 컬럼 모두 id값을 가지고 있기 때문.
그래서 어느 테이블의 id 값에서 가지고 올 것인지를 명확하게 명령해야 한다. ( topic.id )
SELECT topic.id,title,description,created,name,profile FROM topic LEFT JOIN author ON topic.author_id = author.id;
여기서 사람이 보기에 id값이 어느 테이블에서 가지고 왔는지 가시적으로 구분 할 수 없기 때문에 id 값의 이름을 topic 테이블에서 가지고 온 것임을 알 수 있도록 변경해보자.
(기존의 명령어 topic.id 뒤에 AS topic_id 붙일 것.)
SELECT topic.id AS topic_id,title,description,created,name,profile FROM topic LEFT JOIN author ON topic.author_id = author.id;
예를 들어 설명을 더 들어보자.
위의 topic 테이블과 comment 두개의 테이블은 기존의 것들이다. 이 둘을 밑의 세개의 테이블로 쪼개봤다고 치자.
topic 테이블은 글쓰기와 관련된 테이블이고 comment는 댓글을 다는 테이블이라고 해보자.
여기서 댓글의 테이블에 또 각각의 author와 profile (컬럼)이 들어있다.
만약 duru 라는 사람의 직업명을 수정해야 한다면 topic 테이블의 profile 값과 comment 테이블의 profile 값을 모두 수정해야 한다.
그런데 아래의 세개의 테이블로 쪼개진 상태, 즉 comment 테이블에 author_id 값을 따로 빼놓면 author 테이블에서 duru의 profile 값인 직업명을 바꿀 경우 이것이 topic 테이블과 comment 테이블에도 적용이 된다.
즉 테이블을 분리한다는 것은 모든 테이블이 author의 식별자인 id와 일치하는 식별자가 값을 그 행에 포함하고 있다면 JOIN을 통해 얼마든지 관계를 맺을 수 있다는 것이다.
이 관계성을 한번 실습해보자.
기존 예제에서 'duru'의 직업을 'database administrator' 인데 'data daministrator'로 오타가 났다.
UPDATE author SET profile='database administrator' WHERE id =2;
그리고 이전에 있었던 JOIN 코드를 입력해보면 바뀐 것을 알 수 있다.
JOIN은 관계형데이터베이스를 관계형데이터베이스 답게 하는 아주 중요한 기능이다.
(그리고 깊게 들어가면 끝도 없는 녀석이다.)
'youtube.com|user|egoing2 > DATABASE2 MySQL' 카테고리의 다른 글
DB2 MySQL - 16. 테이블 분리 (2) | 2021.12.30 |
---|---|
DB2 MySQL - 관계형데이터베이스의 필요성 (14-15.) (2) | 2021.12.30 |
DB2 MySQL - 9. CRUD (10-13. INSERT/SELECT/UPDATE/DELETE) (0) | 2021.11.27 |
DATABASE2 MySQL - 8. 테이블의 생성 (2) | 2021.11.26 |
DATABASE2 MySQL - 7. SQL과 테이블의 구조 (2) | 2021.11.24 |