mysql : JOIN의 여러가지 간단 예제

2018. 1. 25. 23:54DB

먼저 JOIN을 사용한 쿼리를 보기전에,


SQL ( Structured Query Language : 구조화 질의어 ) 의 종류에 대해서 알아보겠습니다.


* ANSI ( ANSI 표준 위원회 : 표준 SQL )


* PL ( Oracle : Procedural Language )


* T ( MicroSoft : Transact )



보통 처음 데이터베이스를 학습할 때 ANSI 기준으로 배웁니다. 저도 마찬가지구요


간단한 예제를 통해 세 가지의 SQL 을 확인해보겠습니다.


먼저 테이블 구조입니다.



  

T, PL

select *
from test1, test2 
where test1.number=test2.number;

// 결과 : 3

ANSI

select * from test1 
join test2 
on test1.number = test2.number;

// 결과 : 3


뭔가 달라짐을 느끼십니까?


제가 조사한 바로는 보통 프로젝트에서는 ANSI를 사용하며


그 이유로는,


1. 표준 SQL 이므로 다양한 DBMS에서 인식할 수 있습니다. 


2. 테이블간 join 관계가 from 절에서 모두 기술되고 where 절에선 체크 조건만 나오므로 가독성이 좋습니다.


3. 다른 업체와 협업시 DB의 호환성 ( 쿼리 구문이 동일합니다 ) 때문입니다.



ANSI 형태의 sql 문으로 JOIN 쿼리를 살펴보겠습니다.


첫 번째로, INNER JOIN : 교집합

select test1.number 
from test1 
join test2 
on test1.number = test2.number;

- 결과 : 3

- test1 과 test2 의 number 컬럼을 서로 비교하여 중첩되는 값이 존재하면 test1.number 컬럼의 중첩 값만 출력한다.



두 번째로, LEFT JOIN : 왼쪽 기준

select test1.number from test1 left join test2 on test1.number = test2.number;

- 결과 : 3 2 1

- test1(왼) 과 test2(오) 의 number 컬럼을 서로 비교하여 중첩되는 값이 존재하면 왼쪽 테이블(test1)의 number 컬럼의 값을 출력한다.



세 번째로, RIGHT JOIN : 오른쪽 기준

① test1.number 컬럼을 출력하는 경우 select test1.number from test1 right join test2 on test1.number = test2.number; ② test2.number 컬럼을 출력하는 경우 select test2.number from test1 right join test2 on test1.number = test2.number;

- 결과1 : 3 null null

- 결과2 : 3 4 5

- left join 과 마찬가지로 중첩되는 값을 기준으로 오른쪽 테이블의 number 컬럼 값을 출력한다.


네 번째로, OUTER JOIN : 매칭되는 값이 없어도 출력

select test1.*, test2.number 
from test1 
left outer join test2 
on test1.number = test2.number;

- 결과 : 3 c 3 / 2 b null / 1 a null ( 3line )

- 조건에 부합하지 않는 test2.number (test1.number 가 1, 2 일때 해당 테이블의 값은 null 이지만 null로 출력되게끔 join됨 )


* OUTER JOIN 에도 LEFT, RIGHT, FULL 가 있는데 이는 INNER JOIN과 마찬가지로 왼쪽, 오른쪽 기준 매칭되는 값이 없어도 모두 출력함