JOIN 방법 | 의미 |
EQUIJOIN(등가조인) | 두 개의 테이블 간에 칼럼값들이 정확하게 일치하는 경우에 사용 |
NON-EQUIJOIN(비등가조인) | 두 개의 테이블간에 칼럼값들이 서로 정확하게 일치하지 않는 경우에 사용 |
OUTER JOIN | 두 개의 테이블간에 JOIN을 걸었을 경우 JOIN의 조건을 만족하지 않는 경우에도 그 데이터들을 보고자 하는 경우에 (+)연산자를 사용하는 조인 |
SELF JOIN | 두 개의 테이블들간에 JOIN을 거는 것이 아니라 같은 테이블에 있는 행들을 JOIN하는데 사용 |
테이블들간의 JOIN 조건을 생략하거나, 조건을 잘못 설정했을 경우, 첫 번째 테이블의 모든 행들에 대해서 두번째 테이블의 모든 행들이 JOIN되어 조회되는 데이터의 형태를 Cartesian Product라고 한다.
Cartesian Product가 발생하면 조회되는 데이터의 개수가 기하급수적으로 증가하게 되어 원하는 데이터를 얻을 수 없는 것은 물론, 데이터베이스나 네트워크에 부담을 주게 되는 결과를 초래하게 되므로 주의해야 한다.
SELECT 테이블명1.칼럼명 , 테이블2.칼럼명, ...
FROM 테이블명1, 테이블명2
WHERE 테이블명1.칼럼명 = 테이블명2.칼럼명;
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';
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;
두 개의 테이블들 간에 JOIN을 걸었을 경우, 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(+);
테이블간에 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(+);