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 테이블의 화면이다.
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 도 있지만, 보통 쓰지 않는다.
'IT 프로그래밍 관련 > MySQL' 카테고리의 다른 글
MySQL null 을 채워주는 ifnull함수 (0) | 2021.03.17 |
---|---|
MySQL 여러 테이블에서 foreign key 사용법 (1) | 2021.03.17 |
MySQL case end 조건식 (0) | 2021.03.17 |
MySQL에서의 in 과 not in (0) | 2021.03.17 |
MySQL between , not between (0) | 2021.03.17 |
댓글