INNER JOIN
OUTER JOIN
1.연관 관계의 종류
1.1. 일대일 관계 (One-to-One)
정의: 한 테이블의 각 행이 다른 테이블의 단 하나의 행과만 연결되는 관계입니다.
예시: 사용자 테이블과 사용자 상세 정보 테이블이 있을 때, 각 사용자에게 하나의 상세 정보만 있을 경우.
1.2. 일대다 관계 (One-to-Many)
정의: 한 테이블의 각 행이 다른 테이블의 여러 행과 연결되는 관계입니다. 가장 일반적으로 사용되는 관계입니다.
예시: 한 고객이 여러 주문을 할 수 있는 경우. 고객 테이블과 주문 테이블 간의 관계가 일대다입니다.
1.3. 다대다 관계 (Many-to-Many)
정의: 한 테이블의 여러 행이 다른 테이블의 여러 행과 연결되는 관계입니다. 이 관계는 중간 테이블(조인 테이블)을 통해 해결됩니다.
예시: 학생과 수업의 관계에서, 한 학생이 여러 수업을 듣고, 한 수업에 여러 학생이 있을 수 있는 경우.
- 조인
CREATE TABLE user_tb(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
email varchar(100)
);
CREATE TABLE feed_tb(
id int primary key auto_increment,
title varchar(1000),
photo_url varchar(100),
user_id int
);
CREATE TABLE reply_tb(
id int primary key auto_increment,
content varchar(100),
user_id int,
feed_id int
);
insert into user_tb(username, password, email) values('ssar', '1234', 'ssar@nate.com');
insert into user_tb(username, password, email) values('cos', '1234', 'cos@nate.com');
insert into user_tb(username, password, email) values('love', '1234', 'love@nate.com');
insert into feed_tb(title, photo_url, user_id) values('계곡왔어요', 'http://xn--989a5b.com', 1);
insert into feed_tb(title, photo_url, user_id) values('바다왔어요', 'http://xn--2j1b67o.com', 2);
insert into reply_tb(content, user_id, feed_id) values('굿', 2, 1);
insert into reply_tb(content, user_id, feed_id) values('별로', 3, 1);
-- 1. 이너조인
select *
from feed_tb ft inner join user_tb ut
on ft.user_id = ut.id;
select * from feed_tb;
select * from user_tb;
select * from emp;
select * from dept;
select *
from emp e inner join dept d
on e.deptno = d.deptno;
-- 2. 이너조인 실패 사례
select * from reply_tb;
select *
from feed_tb ft inner join user_tb ut on ft.user_id = ut.id
inner join reply_tb rt on ft.id = rt.feed_id;
-- 3. 아우터 조인 (내가 원하는 테이블에 모든 데이터를 다 뽑으면서 조인하기 위해)
select *
from feed_tb ft inner join user_tb ut on ft.user_id = ut.id
left outer join reply_tb rt on ft.id = rt.feed_id;
-- 4. 화면 데이터 완성하기 (인라인뷰)
select post.feed_title, post.feed_picture, post.feed_writer, post.reply_content, rut.username reply_writer
from
(
select ft.title feed_title, ft.photo_url feed_picture, ut.username feed_writer, rt.content reply_content, rt.user_id reply_writer_id
from feed_tb ft inner join user_tb ut on ft.user_id = ut.id
left outer join reply_tb rt on ft.id = rt.feed_id
) post left outer join user_tb rut on post.reply_writer_id = rut.id;
-- 5. 화면 진짜 완성
select ft.title feed_title, ft.photo_url feed_picture, ut.username feed_writer, rt.content reply_content, rut.username reply_writer
from feed_tb ft inner join user_tb ut on ft.user_id = ut.id
left outer join reply_tb rt on ft.id = rt.feed_id
left outer join user_tb rut on rt.user_id = rut.id;
3self join
계층을 찾을 때 주로 사용한다. (같은 테이블끼리 조인한다)
select e1.empno, e1.ename '사원명', e2.ename '상사명'
from emp e1 left outer join emp e2
on e1.mgr = e2.empno;

Share article