리오집사의 기억저장소

목차

     

 

01. JOIN의 뜻과 종류

  • JOIN을 통해서 2개 이상의 테이블을 연결할 수 있다.
  • JOIN은 기본적으로 기본키나 외부키 값의 연관에 의해 성립되지만,
  • 논리적인 값들의 연관만으로도 성립할 수 있다.
  • JOIN의 조건은 WHERE절에 기술한다.

JOIN의 방법(종류)

 JOIN 방법 의미 
 EQUIJOIN(등가조인) 두 개의 테이블 간에 칼럼값들이
정확하게 일치하는 경우에 사용
 NON-EQUIJOIN(비등가조인) 두 개의 테이블간에 칼럼값들이
서로 정확하게 일치하지 않는 경우에 사용 
 OUTER JOIN 두 개의 테이블간에 JOIN을 걸었을 경우
JOIN의 조건을 만족하지 않는 경우에도
그 데이터들을 보고자 하는 경우에 (+)연산자를 사용하는 조인
 SELF JOIN 두 개의 테이블들간에 JOIN을 거는 것이 아니라
같은 테이블에 있는 행들을 JOIN하는데 사용 

 

02. Cartesian Product

테이블들간의 JOIN 조건을 생략하거나, 조건을 잘못 설정했을 경우, 첫 번째 테이블의 모든 행들에 대해서 두번째 테이블의 모든 행들이 JOIN되어 조회되는 데이터의 형태를 Cartesian Product라고 한다.

Cartesian Product가 발생하면 조회되는 데이터의 개수가 기하급수적으로 증가하게 되어 원하는 데이터를 얻을 수 없는 것은 물론, 데이터베이스나 네트워크에 부담을 주게 되는 결과를 초래하게 되므로 주의해야 한다.

 

03. EQUIJOIN(등가조인) - '=' 연산자 이용

SELECT 테이블명1.칼럼명 , 테이블2.칼럼명, ...
FROM 테이블명1, 테이블명2
WHERE 테이블명1.칼럼명 = 테이블명2.칼럼명;
  • 두 테이블의 일치하는 칼럼을 연결해서 JOIN하는 것을 등가조인이라고 한다.
  • 두 테이블간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용한다.(즉, 두 테이블이 연결되어 있을 경우 사용 가능하다.)
  • 대부분 PRIMARY KEY, FOREIGN KEY의 관계를 기반으로 한다.
  • 테이블명을 입력하지 않는 경우, JOIN을 하는데 사용되는 두 개의 테이블에 같은 칼럼명이 존재한다면 에러가 발생한다.
  • 그렇기 때문에 칼럼앞에 테이블명을 밝히는게 좋고, 이렇게 하면 데이터베이스에서 조회해오는 액세스 효율이 향상된다.
  • JOIN을 하는 대상 테이블이 N개인 경우, 반드시 최소 N-1 개의 JOIN 조건을 WHERE절이 명시해야 한다.

 

예제

ex1 ) K-리그 선수들을 팀명, 선수이름, 포지션, 등번호 순으로 조회

SELECT TEAM.TEAM_NAME, PLAYER.PLAYER_NAME, PLAYER.POSITION, PLAYER.BACK_NO
FROM PLAYER, TEAM
WHERE PLAYER.TEAM_ID=TEAM.TEAM_ID;

 

위 예제에서 반복되는 테이블명을 일일이 타이핑한다는 건 굉장히 귀찮기 때문에, ALIAS를 사용하여 조금 더 쉽게 SQL을 작성할 수 있다.위 예제를 ALIAS를 이용하여 다시 작성하면 다음과 같다.

SELECT T.TEAM_NAME, P.PLAYER_NAME, P.POSITION, P.BACK_NO
FROM PLAYER P, TEAM T
WHERE P.TEAM_ID=T.TEAM_ID;

 

ex2 ) 난이도 UP. 3개 이상의 테이블 연결하기

서울팀의 정보를 팀명, 홈 스타디움명, 선수명, 등번호 순으로 조회하라.

SELECT T.TEAM_NAME, S.STADIUM_NAME, P.PLAYER_NAME, P.BACK_NO
FROM PLAYER P, TEAM T, STADIUM S
WHERE P.TEAM_ID = T.TEAM_ID
AND T.STADIUM_ID=S.STADIUM_ID
AND T.TEAM_ID='K02';

 

04. NON-EQUIJOIN(비등가조인)

  • 두 개의 테이블들간에 칼럼값들이 서로 정확하게 일치하지 않는 경우에 사용하는 조인.
  • EQUEL("=")이 아닌 다른 연산자들을 사용하여 JOIN한다.

대략적인 NON-EQUIJOIN의 형태

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

 

예제

ex1 ) 다음과 같은 테이블이 주어졌을 때, 어떤 사원이 받고 있는 급여가 어느 등급에 속하는 급여인지 알고 싶다면?

사원(EMP)테이블    급여등급(SAL GRADE) 테이블 
 ENAME SAL   GRADE  LOSAL  HISAL 
 SMITH 800    1 700  1200
 ALLEN 1600    2  1201 1400
 WARO 1250     3  1401 2000
 JONES 2975    4  2001 3000
 MARTIN 1250    5  3001 9999
 BLAKE 2850        

​EMP 테이블에서 사원들의 급여가 SAL GRADE 테이블의 등급으로 표시되야 하는데, 두 개의 테이블들의 카럼값들이 일치하지 않으므로 "=" 연산자로 JOIN을 사용할 수 없다. 그래서 비등가조인을 사용하며, ex에 대한 비등가조인 SQL문은 다음과 같이 작성할 수 있다.

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

 

05. OUTER JOIN / "(+)" 연산자 사용

두 개의 테이블들 간에 JOIN을 걸었을 경우, JOIN의 조건을 만족하지 않는 경우에도 그 데이터들을 보고자 하는 경우에 사용한다.

  • EQUIJOIN은 JOIN이 되는 테이블에 동시에 없는 것은 조회할 수 없지만,
  • OUTER JOIN을 이용하면 JOIN되지 않은 데이터도 볼 수 있다.
  • OUTER JOIN은 (+)연산자를 이용한다.

형태

 SELECT 테이블명1.칼럼명, 테이블명2.칼럼명, ..
 FROM 테이블명1, 테이블명2
 WHERE 테이블명1.칼러명1(+) = 테이블명2.칼럼명2;

 

(+) 연산자 역할

(+)연산자 역할  JOIN시 두 개의 테이블을 JOIN 조건으로 비교할 때,
ⓐ테이블에 행이 존재하지 않거나
ⓑ부족한 테이블에 위치
시켜서 사용한다.
 부족한 행 대신에 한 개 이상의 NULL행을 생성하며,정보가 불충분한 테이블의 행을 JOIN하는데 사용된다.
 WHERE 절에서 비교연산자를 기준으로, 왼쪽 또는 오른쪽의 어느 한쪽에만 사용가능하다.
 IN(SQL연산자), OR(논리연산자)와 함께 사용할 수 없다.

 

예제

ex1 ) 스타디움 정보를 스타디움명, 홈 팀명으로 조회하라. 단, 홈 스타디움으로 사용되지 않는 스타디움도 조회하라. (15개 팀, 21개 스타디움 있다고 가정)

SELECT S.STADIUM_NAME, T.TEAM_NAME
FROM STADIUM S, TEAM T
WHERE S.STADIUM_ID = T.STADIUM_ID(+);

 

 

06. SELF JOIN

테이블간에 JOIN 조건을 적용하는 것이 아니라, 같은 테이블에 있는 행들을 가지고 마치 다른 두 개의 테이블인 것처럼 사용하여 JOIN하는 JOIN.

형태

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

 

FROM절에서 같은 테이블의 이름이 두 번 명시되었으며, 같은 테이블에 대한 각각 다른 ALIAS명을 지정해서 사용하는데, 이렇게 하면 칼럼이 어떤 테이블의 ALIAS명에서 조회된 칼럼인지를 구별할 수 있게 된다.

 

ex1 )(각각의 사원들에 대해서 그 사원의 관리자가 어느 사원인지를 확인하는 문제) 사원에 대한 정보와 그 사원을 담당하고 있는 관리자의 정보를 사원코드,사원명,직책,관리자명 순으로 조회하라.

SELECT WORKER.EMPNO, WORKER.ENAME, WORKER.JOB, MANAGER.ENAME
FROM EMP WORKER, EMP MANAGER
WHERE WORKER.MGR = MANAGER.EMPNO;

 

예제에서의 위와 같은 SQL문은 NULL 값은 자동으로 제외된다. 예를 들어서 사장 같은 경우에는 관리자코드가 NULL일 수 있으므로, 사장에 대한 정보는 나오지 않을 것이다. 이 경우 SELF JOIN에 OUTER JOIN을 활용하여 해결할 수 있다.

SELECT WORKER.EMPNO, WORKER.ENAME, WORKER.JOB, MANAGER.ENMAE
FROM EMP WORKER, EMP MANAGER
WHERE WORKER.MGR = MANAGER.EMPNO(+);

 

[오라클/SQL] 07. JOIN, 테이블의 연결

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band