반응형

❏ JOIN

 

 - 두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력

 - 관계형 데이터베이스의 가장 큰 장점이면서 대표적인 핵심 기능!

 

 

 

 

❏ EQUI JOIN

 

 - 두 개의 테이블 간에 칼럼 값들이 서로 정확히 일치하는 경우. PK <-> FK 의 관계.  = 연산자를 사용해서 표현한다

 

방법 1. where 에 join 조건 쓰기

select 테이블1.칼럼명, 테이블2.칼럼명 ..
 from 테이블1, 테이블2
 where 테이블1.칼럼명 = 테이블2.칼럼명;

 

방법 2. from 에 inner join 과 where 대신 on 절 쓰기

select 테이블1.칼럼명, 테이블2.칼럼명 ..
 from 테이블1 INNER JOIN 테이블2
 on 테이블1.칼럼명 = 테이블2.칼럼명;

 

두개 다 같은 말이다. 사용법이 다르다.

 

 

 

두개의 테이블을 JOIN 했다. SQL 문장으로 보자

select PLAYER.PLAYER_NAME, PLAYER.BACK_NO, PLAYER.TEAM_ID,
       TEAM.TEAM_NAME, TEAM.REGION_NAME
from PLAYER, TEAM
where PLAYER.TEAM_ID = TEAM.TEAM_ID;

또는

select PLAYER.PLAYER_NAME, PLAYER.BACK_NO, PLAYER.TEAM_ID,
       TEAM.TEAM_NAME, TEAM.REGION_NAME
from PLAYER INNER JOIN TEAM
on PLAYER.TEAM_ID = TEAM.TEAM_ID;

 

으로 사용할 수 있다.

 

그런데 불편한게.. 테이블 명을 저렇게 일일히 수기로 다 써주면 만약 엄청 긴 테이블명이면 오타 날수도 있고. 가독성도 안좋다

 

그래서 칼럼과 테이블에 ALIAS 를 적용해서 작성하면 좀더 깔끔하고 실수 없게 사용할 수 있다.

 

select P.PLAYER_NAME 선수명, P.BACK_NO 백넘버, P.TEAM_ID 팀코드,
       T.TEAM_NAME 팀명, T.REGION_NAME 연고지
from PLAYER P, TEAM T
where P.TEAM_ID = T.TEAM_ID;

또는.. inner join 과 where 대신 on 을 사용해도 똑같다.

 

좀 더 간결해진게 보인다..

 

 

추가로, where 절에서 join 조건 이외의 검색 조건을 추가로 덧붙여보자.

select P.PLAYER_NAME 선수명, P.BACK_NO 백넘버,
       T.TEAM_NAME 팀명, T.REGION_NAME 연고지
from PLAYER P, TEAM T
where P.TEAM_ID = T.TEAM_ID
and P.POSITION = 'GK'
order by P.BACK_NO;
 

where 에서 조건이 하나 더 생겼다. 그리고, P 테이블의 포지션이 GK 인..

 

 

 

 

❏ NON EQUI JOIN

 

 - 비등가 JOIN 은 두 개의 테이블 간에 칼럼 값들이 서로 일치하지 않는 경우에 사용한다. 

 - 어떤 사원이 받고 있는 급여가 어느 등급에 속하는지 알고 싶다.

 

select E.ENAME, E.JOG, E.SAL, S.GRADE
from EMP E, SALGRADE S
where E.SAL between S.LOSAL and S.HISAL;

 

 

 

 

출력에서 GRADE  는 where 절 보면 SAL 이 between local 과 hisal 사이로 맞춘다는 조건이 있다.

예를들어 맨 위 SMITH 를 보면 800 이 between losal hisal 을 대칭하게 되면. between 조건을 보면 GRADE 1 이 따라오게 된다

 

where 에서 between 은 한 사례일 뿐이다. 연산자는 > < >= <= 등 .. 쓸수 있다. = 빼고 (NON 이니까)

 

 

 

❏ 3개 이상 TABLE JOIN

 

 - 3개 이상의 테이블들을 조인시켜보자

 

 

선수들 별로 홈 그라운드 경기장이 어디인지를 출력하고싶다.

선수 테이블과 운동장 테이블이 서로 관계가 없어서 중간에 팀 테이블을 껴서 찾아보자.

 

select P.PLAYER_NAME 선수명, P.POSITION 포지션,
       T.REGION_NAME 연고지, T.TEAM_NAME 팀명,
       S.STADIUM_NAME 구장명
from PLAYER P, TEAM T, STADIUM S
where P.TEAM_ID = T.TEAM_ID
and T.STADIUM_ID = S.STADIUM_ID
order by 선수명;

 

또는.

select P.PLAYER_NAME 선수명, P.POSITION 포지션,
       T.REGION_NAME 연고지, T.TEAM_NAME 팀명,
       S.STADIUM_NAME 구장명
from PLAYER P INNER JOIN TEAM T
on P.TEAM_ID = T.TEAM_ID
   INNER JOIN STADIUM S
on T.STADIUM_ID = S.STADIUM_ID
orddr by 선수명;

 

 

이렇게 표현할 수 있다.

 

3개 이상의 테이블 표현은 inner join 과 on 이 뭔가 다른데.

하나 하나 씩 하는건가

 

PLAYER P inner join TEAM T
on P.TEAM_ID = T.TEAM ID

 

까지는 2개의 EQUI 테이블 할때 표현 인데

 

밑에 바로 또 inner join STADIUM S ?

 

괄호로 치자면 이런느낌인가

 

from ( ( PLAYER P inner join TEAM T on P.TEAM_ID = T.TEAM_ID ) inner join STADIUM S on T.STADIUM_ID = S.STADIUM_ID )

 

이런건가!!?

 

 

JOIN 이 필요한 이유는 정규화 에서부터 출발한다.

정규화 : 불필요한 데이터의 정합성을 확보하고 이상현상 (Anomaly) 발생을 피하기 위해, 테이블을 분할하기 위해 생성하는 것.

반응형
글이 도움이 되셨다면 공감과 광고 클릭 한번 부탁드려요! :)
감사합니다 ✨