INNER JOIN과 OUTER 조인

INNER JOIN : 두 개의 테이블 A, B가 있을 때 이들의 교집합을 찾는 JOIN입니다.

OUTER JOIN : 두 개의 테이블 A, B가 있을 때 이들의 합집합을 찾는 JOIN입니다.

 

예를 들어, A와 B 테이블에 다음과 같이 자료가 들어가 있을 때 어떻게 사용하는지 봅시다.

 

A B
1 3
2 4
3 5
4 6

 

A와 B 테이블의 INNER JOIN 수행

INNER JOIN을 수행하면 두 테이블에 공통 데이터가 있는 열이 출력됩니다.

 

SELECT * FROM A
INNER JOIN B ON A.a = B.b

 

위의 쿼리를 수행 시 아래와 같이 데이터가 출력됩니다.

 

A B
3 3
4 4

출력 결과에서 알 수 있듯 두 테이블에 공통으로 들어간 열만 출력되는 것을 볼 수 있습니다.

 

A와 B 테이블의 LEFT OUTER JOIN 수행

LEFT OUTER JOIN을 수행하면 기준이 되는 테이블의 모든 열에 B와 공통되는 부분을 추가로 얻을 수 있습니다.

 

SELECT * FROM A
LEFT OUTER JOIN B ON A.a = B.b

 

위의 쿼리를 수행 시 아래와 같이 데이터가 출력됩니다.

 

A B
1 null
2 null
3 3
4 4

출력 결과에서 알 수 있듯 두 테이블 중 기준이 되는 A 테이블의 열은 모두 출력하고 B에서는 A와 곂치는 부분만 출력하는 것을 알 수가 있습니다.

 

JOIN을 할 때 조건으로 어떤 컬럼과 일치시켜 줄 것인가에 대해 ON이나 USING을 사용하는데 두 키워드의 차이점을 설명드리겠습니다.

 

EMPLOYEE 테이블과 SALARY 테이블이 있고 이 두 테이블에 모두 DEPT_ID라는 컬럼이 있어서 이 컬럼을 기준으로 조인을 해주게 되면 아래와 같이 작성하면 됩니다.

 

SELECT *
FROM EMPLOYEE e
JOIN SARALY s
ON e.DEPT_NO = s.DEPT_NO

 

그런데 이처럼 조인할 두 컬럼의 이름이 같은 경우에는 ON 대신에 USING을 사용할 수 있고 USING 사용 시 다음과 같이 작성하시면 됩니다.

 

SELECT *
FROM EMPLOYEE e
JOIN SALARY s
USING(DEPT_NO)

 

* 주의할 점은 두 컬럼의 이름이 같을 때만 동작한다는 것입니다.

 

MySQL, MariaDB 이너 조인

실습을 위한 부서(dept)와 사원(emp) 테이블을 생성한다.

create table dept(
	id int(20) unsigned primary key auto_increment,
	regDate datetime not null default now(),
	deptName char(30) unique
);


create table emp(
	id int(20) unsigned primary key auto_increment,
	regDate datetime not null default now(),
	name char(30) not null,
    deptId int(20) not null
);

키워드 설명

1) unsinged : 표현할 숫자의 범위에서 음수를 제외하고 음수를 제외한 만큼 양수에서 더 표현

2) primary key(개체 무결성 제약조건) : 기본키

3) auto_increment : 자동 증가

4) defalut : 해당 컬럼 기본값 설정

5) now() : 현재 시스템 시간을 가져오는 함수

 

좌 : 부서(dept) 테이블 / 우 : 사원(emp) 테이블

 

다음으로 실습을 위해 각 테이블에 데이터를 추가한다.

-- dept 테이블에 '홍보부서'와 '기획부서' 추가

insert into dept(deptName) values('홍보');
insert into dept(deptName) values('기획');


-- emp 테이블에 사원 추가

insert into emp(name, deptId) value('루니', 1);
insert into emp(name, deptId) value('램파드', 2);

 

좌 : 부서(dept) 테이블 / 우 : 사원(emp) 테이블

 

Inner Join을 통한 사원의 소속 부서 출력

사원 테이블에는 사원이 속한 부서의 이름이 아닌 부서의 번호가 입력되어 있다.

우선 부서 테이블과 사원 테이블에 있는 모든 데이터를 가져오는 다음 쿼리문을 실행하여 본다.

select * from dept, emp;

 

select * from dept, emp를 실행 결과

실행하면 사원의 이름도 중복되고 사원의 부서도 알 수 없게 출력된다.

따라서 Inner Join을 이용하여 사원의 소속 부서를 알아내야 한다.

select * from [테이블명] inner join [조인할 테이블명] on [조인 조건]

select * from emp inner join dept on emp.deptId = dept.id;

 

select * from emp inner join dept on emp.deptId = dept.id의 실행 결과

해당 쿼리문은 사원 테이블과 부서 테이블을 Innter Join한 결과이고 조건은 사원 테이블의 부서 번호와 부서 테이블의 부서 번호가 일치하는 데이터만 출력하였다.

 

select emp.id, emp.regDate, emp.name, dept.deptName from emp inner join dept on emp.deptId = dept.id;

필요한 컬럼만 조회

필요한 데이터는 사원 정보와 사원의 소속 부서이기 때문에 나머지 필요하지 않은 정보를 제외하였다.

+ Recent posts