최보름달

[SQL] JOIN, EQUI JOIN, Non EQUI JOIN, 3개 이상 테이블 조인 본문

문송한 회사생활/SQL 공부

[SQL] JOIN, EQUI JOIN, Non EQUI JOIN, 3개 이상 테이블 조인

PieMoon 2020. 8. 15. 12:34

JOIN 

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

예를들어 선수 테이블과 팀 테이블을 연결해서 데이터를 볼 수 있다.

PRIMARY KEY(PK)나 FOREIGN KEY(FK)값의 연관에 의해 JOIN이 성립된다. 

FROM 절에 A, B, C 테이블이 나열되었더라도 2개 테이블만 먼저 조인 처리되고,2개 테이블이 조인되어 처리된 새로운 데이터 집합과 남은 한 개의 테이블이 다음 차례로 조인 처리된다. 

 

EQUI JOIN

EQUI(등가) JOIN은 두 테이블 간에 컬럼 ㄱ밧이 서로 정확하게 일치하는 경우 사용되는 방법이다. 

WHERE절에 = 연산자를 사용해서 표현한다. 

SELECT   테이블1.컬럼명, 테이블2.컬럼명
FROM     테이블1, 테이블2
WHERE    테이블1.컬럼명1 = 테이블2.컬럼명2 ; 

-- ANSI/ISO SQL표준 방식으로 표현하면 이렇게도 할 수 있다. 
SELECT   테이블1.컬럼명, 테이블2.컬럼명
FROM     테이블1 INNER JOIN  테이블2   -- JOIN 이라고 명시했다. 
ON       테이블1.컬럼명1 = 테이블2.컬럼명2 ;  -- on을 사용했다. 

 

예시

SELECT  PLAYER.PLAYER_NAME 선수명, TEAM.TEAM_NAME 소속팀명
FROM    PLAYER, TEAM
WHERE   PLAYER.TEAM_ID = TEAM.TEAM_ID ;

-- 이렇게 할 수도 있다. 
SELECT  PLAYER.PLAYER_NAME 선수명, TEAM.TEAM_NAME 소속팀명
FROM    PLAYER INNER JOIN TEAM
ON      PLAYER.TEAM_ID = TEAM.TEAM_ID ;

 

SELECT 구문에 단순히 컬럼명이 오지 않고, "테이블.컬럼명" 처럼 테이블명과 컬럼명을 같이 기재해준다. 

어느 테이블에 존재하는 컬럼인지 명시해야 하는 이유는

모든 테이블에 컬럼들이 유일한 이름이면 상관없지만, JOIN에 사용되는 두 개 테이블에 같은 컬럼이 존재하는 경우 DBMS의 옵티마이저는 어떤 컬럼을 사용해야 할지 모르기 때문에 파싱 단계에서 에러가 발생하기 때문이다.

또, 개발자나 사용자가 조회할 데이터가 테이블에 있는 컬럼을 말하는 것인지 쉽게 알 수 있게되므로 가독성 & 유지보수에 효과적이다. 

 

FROM 절에서 ALIAS를 사용해서 가독성을 더 높일 수도 있다.

SELECT  P.PLAYER_NAME 선수명, T.TEAM_NAME 소속팀명
FROM    PLAYER P, TEAM T
WHERE   P.TEAM_ID = T.TEAM_ID ;

-- 이렇게 할 수도 있다. 
SELECT  P.PLAYER_NAME 선수명, T.TEAM_NAME 소속팀명
FROM    PLAYER P INNER JOIN TEAM T
ON      P.TEAM_ID = T.TEAM_ID ;

 테이블에 ALIAS를 적용해서 SQL문장을 작성한 경우, WHERE절과 SELECT 절에도 똑같이 ALIAS를 적어줘야 한다. 

 

 

 

NON EQUI JOIN

NON EQUI (비 등가) JOIN은 두 테이블 간에 컬럼 값이 정확하게 일치하지 않는 경우 사용된다. 

= 연산자가 아닌 BETWEEN, > <, >=, <= 연산자를 이용하여 JOIN을 수행하는 것이다. 

SELECT   테이블1.컬럼명, 테이블2.컬럼명
FROM     테이블1, 테이블2
WHERE    테이블1.컬럼명1 BETWEEN 테이블2.컬럼명1 AND 테이블2.컬럼명2 ; 

 

사원 이 받고 있는 급여 등급을 조회하는 예시

SELECT  E.ENAME, E.JOB, E.SAL, S.GRADE
FORM    EMP P, SALGRADE S
WHERE   E.SAL BETWEEN S.LOSAL AND S.HISAL ;

 

 데이터 모델에 따라서 Non EQUI JOIN이 불가한 경우도 있다.

 

 

 

3개 이상 테이블 조인

예시

SELECT   P.PLAYER_NAME 선수명, T.TEAM_ID 팀명, S.STATIUM_NAME 구장명
FROM     PLAYER P, TEAM T, STADIUM S
WHERE    P.TEAM_ID = T.TEAM_ID
AND      T.STADIUM_ID = S.STADIUM_ID
ORDER BY 선수명 ; 

세 개 테이블에 대한 JOIN이므로 WHERE  절에 2개 이상의 JOIN 조건이 필요하다. 

이렇게도 작성할 수 있다.

 

SELECT   P.PLAYER_NAME 선수명, T.TEAM_ID 팀명, S.STATIUM_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
ORDER BY 선수명 ; 

JOIN을 잘못 기술하게 되면 시스템 자원 부족이나 과다한 응답시간 지연을 발생시키는 중요 원인이 되므로 JOIN 조건은 신중하게 작성해야 한다.

 

 

 

 

kdata 한국데이터진흥원에서 출간한 SQL 전문가 가이드 2013 Edition을 요약했습니다. 

 

'문송한 회사생활 > SQL 공부' 카테고리의 다른 글

[SQL] FROM절의 JOIN  (0) 2020.08.15
[SQL] STANDARD SQL, 집합 연산자  (0) 2020.08.15
[SQL] ROWNUM, TOP()  (0) 2020.08.14
[SQL] SELECT 문장 실행 순서  (0) 2020.08.14
[SQL] ORDER BY  (0) 2020.08.14