Dev JS Blog

[SQL] JOIN 에 대해서 본문

옛날 창고/SQL

[SQL] JOIN 에 대해서

Dev JS 2018. 12. 23. 19:56
728x90

JOIN 에 대해서




오늘은 쿼리의 기초라고 할수있는 조인(JOIN) 2가지를 알아보겠습니다.


조인이란..?

사전적의미로 연결하다,잇다,합쳐지다 .. 등등 의 뜻이 있습니다.


즉 조인은 테이블 두개를 합쳐주는 역할을 합니다.


제일 기초적인 두가지 조인 방식만 소개해드리겠습니다.

두 조인은 INNER JOIN 과 OUTER JOIN 이 있습니다.

어떤 역할을 하는지 알아보겠습니다.



1. 직원 정보 테이블인 ex_emp 테이블 입니다.

   name(이름), dept_no(부서번호)를 가지고 있는 테이블 입니다.


SELECT

name,

dept_no,

FROM ex_emp



직원정보 테이블에는 name 과 dept_no(부서번호) 를 갖고있는 테이블 입니다.


2. 부서정보 테이블 ex_dept

dept_no(부서번호), dept_name(부서명) 을 가지고 있는 테이블 입니다.


SELECT

dept_no,

dept_name

FROM ex_dept


여기서 직원들의 부서를 알고싶다면 부서정보를 갖고있는 부서 테이블과 조인을 해봐야겠죠?

일단 INNER JOIN 해보겠습니다.


SELECT 

  name,

    dept_no,

    dept_nm

FROM ex_emp a

inner join ex_dept b on a.dept_no = b.dept_no


기준이 되는 테이블을 먼저 쓰고 그 다음 조인을 할 테이블을 쓰는게 일반적입니다.

조인 쿼리 사용방법은 

inner join (조인할 테이블) ON 어떤 조건들에 엮이게 할것인지 를 씁니다.


저는 부서명이 궁금했으니 각각 테이블에 dept_no 가 맞는 조건으로 조인이 되도록 하였습니다.




dept_no를 기준으로 잘 합쳐졌습니다.

여기서 한가지 inner join 과 outer join 의 차이는 null 값을 허용하느냐 마느냐의 차이입니다.

그게 무슨 말이냐 하면 부서 테이블을 기준으로 다시 조인해보겠습니다.


SELECT 

    a.dept_no,

    a.dept_name,

    b.name

FROM ex_dept a

inner join ex_emp b on a.dept_no = b.dept_no



머가 바꼈을까요?

각각 부서에 있는 사람들이 엮여서 데이터가 나왔습니다.

여기서 주목할건 dept_no 7번인 영업팀에는 엮이는 직원이 없으니 데이터 가 나오지 않았습니다.

그렇다면 기준이 되는 테이블에 엮이는게 없더라도 다 나오게 하고싶을때

OUTER JOIN 을 사용합니다.


outer join 조인도 두가지 방법으로 사용됩니다. 

LEFT OUTER JOINRIGHT OUTER JOIN 으로 사용이 됩니다.


이말이 무슨 말이냐면 LEFT 왼쪽 테이블을 기준으로 NULL값을 허용한 조인을 한다.

RIGHT 는 그 반대이죠

무슨 말이냐면


SELECT 

    a.dept_no,

    a.dept_name,

    b.name

FROM ex_dept a LEFT OUTER JOIN ex_emp b on a.dept_no = b.dept_no


제가 부서 테이블을 기준으로 두고 LEFT OUTER JOIN 을 하였습니다.


부서테이블이 엮이는게 없더라도 부서테이블 데이터는 다 나오게 해달라는 거죠




어때요? 

아까 inner join 때는 없던 부서가 다시 나오게 되었죠?

영업팀에는 직원이 없어서 엮일게 없지만 null 값으로 부서 테이블의 정보는 다 나오게 되었습니다.


반대로 right outer join 도 사용이 가능은 하지만

보통은 left outer join 을 주로 사용하시기 바랍니다.


그래야 

SELECT 

*

FROM 기준테이블

LEFT OUTER JOIN 조인테이블1 ON 조건

LEFT OUTER JOIN 조인테이블2 ON 조건

이런식으로 기준 테이블을 기준으로 쿼리를 짜는 습관이 좋기 때문이죠

LEFT RIGHT 를 남용하다간 어지러워지기 때문에

LEFT 만 쓰도록 합시다.


처음 조인할때는 헷갈리기도 하지만 자주 사용하다보면 

하나도 안헷갈리게 됩니다.




728x90

'옛날 창고 > SQL' 카테고리의 다른 글

[Oracle] ORA - 01861 에러  (0) 2019.01.05
[Oracle] lead(), lag()는 뭐지?  (0) 2018.12.26
[Oracle] row_number() over() 활용  (0) 2018.12.21
[Oracle] order by 기초  (0) 2018.12.20
[MySQL] with rollup 기능  (0) 2018.06.27
Comments