IT 프로그래밍 관련/MySQL

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

지나는행인 2021. 3. 17. 22:40
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 도 있지만, 보통 쓰지 않는다.