SQLD 3-9 ] JOIN
❏ 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) 발생을 피하기 위해, 테이블을 분할하기 위해 생성하는 것.
댓글
이 글 공유하기
다른 글
-
SQLD 4-2 ] 집합 연산자
SQLD 4-2 ] 집합 연산자
2016.02.26 -
SQLD 4-1 ] 표준 조인
SQLD 4-1 ] 표준 조인
2016.02.25 -
SQLD 3-8 ] ORDER BY
SQLD 3-8 ] ORDER BY
2016.02.25 -
SQLD 3-7 ] GROUP BY, HAVING 절
SQLD 3-7 ] GROUP BY, HAVING 절
2016.02.24