걸음마부터 달리기
DB- 조인 본문
두 개 이상의 테이블 들을 연결 또는 결합하여 데이터를 출력하는 것을 JOIN
일반적인 경우 행들은 PRIMARY KEY(PK)나 FOREIGN KEY(FK) 값의 연관에 의해 JOIN이 성립된다. 하지만 어떤 경우에는 이러한 PK, FK의 관계가 없어도 논리적인 값들의 연관만으로 JOIN이 성립 가능하다.
주의할 점은 FROM 절에 여러 테이블이 나열되더라도 SQL에서 데이터를 처리할 때는 단 두 개의 집합 간에만 조인 이 일어난다는 것이다. FROM 절에 A, B, C 테이블이 나열되었더라도 특정 2개의 테이블만 먼저 조인 처리되고, 2개의 테이블이 조인되어서 처리된 새로운 데 이터 집합과 남은 한 개의 테이블이 다음 차례로 조인되는 것이다
EQUI JOIN
두개의 테이블 간 칼럼값들이 서로 정확하게 일치하는 경우에 사용되는 방법
SELECT 테이블1.칼럼명, 테이블2.칼럼명, ...
FROM 테이블1
INNER JOIN 테이블2
ON 테이블1.칼럼명1 = 테이블2.칼럼명2;
SELECT 테이블1.칼럼명, 테이블2.칼럼명, ...
FROM 테이블1, 테이블2
WHERE 테이블1.칼럼명1 = 테이블2.칼럼명2;
INNER JOIN - ON , FROM과 WHERE 이 2가지 방법으로 EQUI JOIN을 쓸 수 있다.
테이블.칼럼명으로 SQL문이 작성됨을 기억하라.
옵티마이저는 어떤 테이블의 칼럼인지 명확히 알아야 하기 때문이다. 개발자들의 가독성 문제도 있다.
SELECT 뿐만 아니라 FROM절에도 ALIAS를 지원하는데 이는 조인같은 경우에 테이블명.칼럼명 으로 명시해야되기에 테이블명이 길어지면 가독성에 문제가 생기고 실수확률이 올라가서 그렇다.
조인조건을 FROM에 테이블 한개만 올 경우 INNER JOIN - ON 쌍에서 ON으로 , FROM에 테이블이 2개가 올 경우 WHERE절로 JOIN 조건을 맞춰줬는데 이 JOIN안에서 다시 필터링 하고 싶으면 WHERE절을 또 주면 된다.
SELECT P.PLAYER_NAME 선수명, P.BACK_NO 백넘버, T.REGION_NAME 연고지, T.TEAM_NAME 팀명
FROM PLAYER P, TEAM T WHERE P.TEAM_ID = T.TEAM_ID AND P.POSITION = 'GK'
ORDER BY P.BACK_NO; 또는 INNER JOIN을 명시하여 사용할 수도 있다.
SELECT P.PLAYER_NAME 선수명, P.BACK_NO 백 넘버, T.REGION_NAME 연고지, T.TEAM_NAME 팀명
FROM PLAYER P INNER JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID
WHERE P.POSITION = 'GK'
ORDER B Y P.BACK_NO;
테이블에서 (FROM절에서) ALIAS로 정의했으면 다른 절에서도 테이블명을 기입할때 ALIAS대로 기입해야 된다.
NON EQUI JOIN
비등가 조인은 두개의 테이블 간에 칼럼값이 서로 정확하게 일치하지 않는 경우에 사용한다."="연산자가 아닌 다른 연산자(< , > , <= , BETWEEN 등등)를 사용하여 JOIN을 수행한다.
SELECT E.ENAME, E.JOB, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
사원명 급여 급여등급
------ ---- ------
SMITH 800 1
JAMES 950 1
ADAMS 1100 1
WARD 1250 2
MARTIN 1250 2
MILLER 1300 2
TURNER 1500 3
ALL EN 1600 3
CLARK 2450 4
BLAKE 2850 4
JONES 2975 4
SCOTT 3000 4
FORD 3000 4
KING 5000 5