조인

두 개 이상의 테이블을 서로 묶어서 하나의 결과 집합을 만들어 내는 것을 말함.

Inner Join

대개의 업무에서 조인은 Inner Join을 말한다.

두 테이블간 조인 조건을 만족하는, ROW를 리턴한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
select * from buytbl	
inner join usertbl on buytbl.userid = usertbl.userID -- 조인조건
where buytbl.userid = 'JYP'; -- 출력조건


select userid, name, prodName, addr, mobile1 + mobile2 as '연락처'
from buytbl
inner join usertbl on buytbl.userID = usertbl.userID; -- 해당쿼리의 UserID가 둘다 같이 있어서 모호한 상황이 발생했다.


select buytbl.userid, name, prodName, addr, mobile1 + mobile2 as '연락처'
from buytbl
inner join usertbl on buytbl.userID = usertbl.userID; -- 위 쿼리를 해결한 버전

select U.userid, u.name, B.prodName, U.addr, U.mobile1 + U.mobile2 as '연락처' from usertbl U
inner join buytbl B on U.userID = B.userID; -- 전체가 출력된다.

-- 쇼핑몰에서 한번이라도 구매가 있다면 출력한다.
select DISTINCT U.userid, u.name, U.addr from usertbl U
inner join buytbl B on U.userID = B.userID;

-- 위 쿼리는 다음 쿼리와 같은 내용이다
select U.userid, u.name, U.addr from userTbl U where exists (select * from buytbl B where U.userid = B.userid)
-- 서브쿼리 select * from buytbl B where U.userid = B.userid에서 나온 칼럼과 값이
-- userTbl에 있는 것들만 출력

다중 테이블 조인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create table stdtbl
(
name varchar(5) primary key not null,
area varchar(5) not null
);

create table clubtbl
(
clubname varchar(5) primary key not null,
roomno int not null
);
create table stdclubtbl
(
num int primary key AUTO_INCREMENT,
name varchar(5) not null,
clubname varchar(5) not null,
FOREIGN KEY(name) REFERENCES stdtbl(name),
FOREIGN KEY(clubname) REFERENCES clubtbl(clubname)
);

Outer Join

조인의 조건에 만족되지 않은 행까지 포함시킨다.

1
2
3
4
5
6
7
8
9
select <열 목록>
from <첫번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL> outer join <두번째 테이블(right 테이블)>
ON <조인 조건>
where 검색조건

-- LEFT : 조인문 왼쪽에 있는 모든 결과를 가져온뒤 오른쪽 테이블의 데이터를 매칭(조인조건)하며, 매칭되지 않은 데이터는 NULL
-- RIGHT : 조인문에 오른쪽에 있는 모든 결과를 가져온뒤 왼쪽 테이블의 데이터를 매칭(조인조건)하며, 매칭되지 않은 데이터는 NULL
-- FULL : LEFT Outer Join + Right Outer Join이다. 즉 모든 결과가 합쳐서 나온다.