본문 바로가기
IT 프로그래밍 관련/MySQL

MySQL 정규화, 테이블의 연결 join

by 지나는행인 2021. 3. 17.
728x90

MySQL 에서는 테이블을 설계할때 모든 필요한 데이터를 한꺼번에 테이블로 설계하지 않고, 

 

관련되어 있는 데이터끼리 중복되지 않게 따로 테이블을 여러개로 나눈다.

 

그리고 각 테이블의 유니크한 primary key를 가져와서 서로 연결하는 형식을 띈다.

 

이렇게 테이블을 설계하는 것을 정규화라고 한다.. 

 

테이블을 만들어보겠다.

1
2
3
4
create table students( id int auto_increment primary key, first_name varchar(100) );
 
create table papers ( title varchar(100), grade int, student_id int
                      foreign key(student_id) references students(id) on delete cascade );
cs

위와 같이 두개의 테이블을 만들었다.

 

students 테이블에 id를 primary key 로 지정 하고 first_name 컬럼을 만들었다.

 

papers 테이블에 title , grade 컬럼을 만들고 , 앞의 students테이블의 id컬럼을 받아올수 있는 , students_id 컬럼을 만들

 

었다.  여기서 foreign key (외래키라 하겠다.) 가 나오는데 이 외래키는 다른 테이블의 데이터를 받아 오는 역할을 한다.

 

아까 만든 students_id  컬럼을 외래키로 설정을 하고, references students(id)는 외래키로 설정한 컬럼은 students테이블

 

의 id 컬럼을 참조한다는 뜻이다. 

 

그 뒤의 on delete cascade는 부모가 되는 students테이블에서 데이터를 지웠을때 외래키를 가진 papers컬럼도 같이 지

 

운다는 뜻이다.

 

일단 데이터를 넣고, 실행화면을 보겠다.

*데이터를 넣은 students table

students 테이블의 화면이다.   

 

*데이터를 넣은 papers table

 

papers 테이블의 student_id 컬럼의 데이터는 students 테이블의 id컬럼을 가르킨다는 것이다.

 

student_id 컬럼의 1은 , students 테이블의 id 1을 가지고 있는 Caleb이다.   

 

60점을 받은 My First Book Report 는 Caleb 이 썼다는 것이 된다.

 

그럼 이러한 외래키를 가지고 테이블을 연결하는 join 에 대해 한번 보자.

 

join 은 말그대로 테이블을 연결 하는 것이다.

 

join에는  join(innerjoin) , left join, right join이 있다.

 

join은 데이터를 가지고 있는 것들끼리 연결한다.   데이터가 없는 것은 빼고 나타낸다.

1
2
3
4
select *
from students as s
join papers as p          
    on s.id = p.student_id ;
cs

from 에 씌인 테이블이 기준이 된다.   students 테이블에 

papers 테이블을 붙여라.   (students as s , papers as p)

   그리고 on 이 붙는다.

on s.id = p.student_id   이것은  students테이블의 id컬럼 = papers테이블의 student_id 란 뜻으로 

papers테이블의 student_id는 students테이블의 id컬럼을 참조한 외래키라는 정도..?..가 된다.

 

실행을 하면,

이렇게 s.id 컬럼과 p.student_id 컬럼이 같은 것 끼리 묶이면서 두개의 테이블이 묶이는 것을 볼 수 있다.

 

두개의 테이블 중 한군데에만 있는 데이터는 이 화면에서 나타나지 않는다.   

 

이번엔 left join 으로 해보겠다. 

 left join 으로 하면 students 테이블의 null 데이터도 함께 나타난다.

 

이것은 논문 데이터가 없어서 데이터가 나오지 않았던 join 과는 다른것을 알 수 있다.

 

right join 도 있지만, 보통 쓰지 않는다.

 

 

댓글