조인
: 두 개 이상의 테이블을 가로로 연결하여
하나의 테이블처럼 출력할 때 사용하는 방식
참고로 집합 연산자는 SELECT문의 결과값을 세로로 연결한다.
SELECT *
FROM EMP, DEPT
만약 EMP 테이블에 15개의 행,
DEPT 테이블에 4개의 행이 있다면
총 15*4=60개의 행이 조회된다.
하지만 위 출력값에는 문제가 있다.
사원 데이터와 부서 데이터가 정확하게 떨어지지 않는 데이터도
모두 출력되기 때문이다.
조인 할 때, WHERE절이 중요한 역할을 한다.
SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO
조인의 종류
1. 등가 조인(=내부조인, 단순조인)
: 위에서 EMP, DEPT 테이블을 열 기준으로 조인했는데
이 방식이 바로 등가 조인이다.
테이블을 연결한 후, 출력행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식이다.
테이블끼리 겹치치 않는 열 이름이어도
대부분 테이블이나 별칭을 명시한다.
조인 테이블 개수가 몇십개가 되기 때문에.
기본적으로 테카르트 곱 현상이 일어나지 않도록 하기 위해
필요한 조건식의 최소 개수는 조인 테이블 개수에서 하나를 뺀 값이다.
만약 테이블이 A,B,C라면
A와 B를 연결해줄 열 하나,
A와 B가 연결된 상태에서 C를 연결해줄 열 하나!
WHERE절 조건식을 사용해 테이블 조인할 때
반드시 각 테이블을 정확히 연결하는 조건식이
최소한 전체 테이블 수보다 하나 적은 수 만큼은 있어야한다.
+ SQL-99 표준 문법으로 배우는 조인 (WHERE절이 아닌 FROM절에서 외부 조인 선언)
1. NATURAL JOIN
: 두 테이블에 이름과 자료형이 같은 열을 찾은 후 그 열을 기준으로 등가조인을 해준다.
SELECT E.EMPNO, E.ENAME, E.JOB,
DEPTNO, D>DNAME
FROM EMP E NATURAL JOIN DEPT D
이때 조인 기준 열인 DEPTNO를
테이블에 명시할 때 테이블 이름을 붙이면 안된다.
2. JOIN ~ USING
NATURAL JOIN이 자동으로 조인 기준 열을 지정하는 것과 다르게
USING 키워드에 명시해야 한다.
SELECT E.EMPNO, E.ENAME, E.JOB,
DEPTNO, D>DNAME
FROM EMP E JOIN DEPT D USING (DEPTNO)
3. JOIN ~ ON
: 기존 WHERE 절에 있는 조인 조건식을 ON 키워드 옆에 작성함
FROM TABLE1 JOIN TABLE2 ON (조인 조건식)
SELECT E.EMPNO, E.ENAME, E.JOB,
E.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D ON (E.DEPTNO=D.DETPNO)
2. 비등가 조인
: 등가 조인 방식 외의 방식을 의미한다.
EMP 테이블과 급여 등급 데이터를 가지고 있는 SALGRADE 테이블을 조인하고자 한다.
EMP 테이블에서는 SAL
SALGRADE에서는 LOSAL, HISAL만 존재한다. (최소 급여와 최대 급여)
이럴때 BETWEEN A AND B 연산자를 이용하면
EMP 테이블과 SALGRADE 테이블 조인을 쉽게 처리할 수 있다.
SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
단, 이 방식은 등가 조인 방식에 비해
그리 자주 사용하는 방식은 아니다.
3. 자체 조인
: 하나의 테이블을 여러개의 테이블처럼 활용하여 조인하는 방식으로FROM절에 같은 테이블을 여러 번 명시하되테이블의 별칭만 다르게 해서 사용하는 방식이다.
SELECT E1.EMPNO, E1.ENAME, E1.MGR
E2.EMPNO AS M_EMPNO,
E2.ENAME AS M_ENAME
FROM EMPNO E1, EMPNO E2
WHERE E1.MGR=E2.EMPNO
4. 외부 조인
:조인 조건 데이터 중 어느 한쪽이 NULL임에도
결과를 출력할 때 포함시켜야 하는 경우가 있다.
이떄 강제로 출력하는 방식이 외부 조인이다.
아우터 조인을 사용하는 이유는 기준 테이블의 데이터가 모두 조회(누락 없이) 되고,
대상 테이블에 데이터가 있을 경우 해당 컬럼의 값을 가져오기 위해서!
외부 조인은 좌우를 따로 나누어 지정하고
조인 기줄 열 중 한쪽에 (+) 기호를 붙여준다.
왼쪽 외부 조인
WHERE TABLE1.COL1=TABLE2.COL1(+)
-> 왼쪽 열을 기준으로 오른쪽 열의 데이터 존재 여부에 상관없이 출력
즉, 왼쪽 테이블의 한 개의 레코드에 여러 개의 오른쪽 테이블 레코드랑 일치할 경우
해당 왼쪽 레코드를 여러번 표시를 하게 된다.
만약 오른쪽 레코드에 값이 NULL이면 NULL로 표시가 된다
오른쪽 외부 조인
WHERE TABLE1.COL1(+)=TABLE2.COL1(+)
-> 오른쪽 열을 기준으로 왼쪽 열 데이터의 존재와 상관없이 데이터 출력
단, (+) 기호를 붙이는 외부 조인 방식으로는
양쪽 모든 열이 외부 조인되는 전체 외부 조인 사용은 불가능하다.
https://m.post.naver.com/viewer/postView.naver?volumeNo=32800084&memberNo=25379965
왼쪽 외부 조인을 포함한 외부 조인은 여러 테이블의 데이터를 결합하고
지정된 쿼리에 대한 모든 관련 데이터를 검색하는 데 유용합니다.
NULL 값은 무의미해 보일 수 있지만
데이터베이스 관리의 중요한 부분이며
누락되거나 알 수 없는 데이터를 나타낼 수 있습니다.
+ SQL-99 표준 문법으로 배우는 조인 (WHERE절이 아닌 FROM절에서 외부 조인 선언)
1. OUTER JOIN
: 왼쪽 외부 조인
[기존] WHERE TABLE1.COL1=TABLE2.COL1(+)
[SQL-99] FROM TABLE1 LEFT OUTER JOIN TABLE2 ON (조인 조건식)
-> 왼쪽 열을 기준으로 오른쪽 열의 데이터 존재 여부에 상관없이 출력
오른쪽 외부 조인
[기존] WHERE TABLE1.COL1(+)=TABLE2.COL1(+)
[SQL-99] FROM TABLE1 RIGHT OUTER JOIN TABLE2 ON (조인 조건식)
-> 오른쪽 열을 기준으로 왼쪽 열 데이터의 존재와 상관없이 데이터 출력
전체 외부 조인
[기존] x
[SQL-99] FROM TABLE1 FULL OUTER JOIN TABLE2 ON (조인 조건식)
여러 테이블 JOIN
FROM TABLE1 JOIN TABLE2 ON (조건식)
JOIN TABLE3 ON (조건식)
만약 오른쪽 외부 조인을 했는데
오른쪽 테이블의 총 데이터 수보다 조회된 데이터의 수가 큰 경우는?
오른쪽 조인에서 검색된 행 수가 오른쪽 테이블의 총 행 수보다 크면
오른쪽 테이블의 일부 행에 대해 일치하는 행이 왼쪽 테이블에 여러 개 있음을 나타낼 수 있습니다.
특정 조인 조건이 불충분합니다.
이로 인해 결과 집합에 중복 행이 생길 수 있습니다.
내부 조인 - 등가 조인, 자체 조인
외부 조인
참고문헌 : Do it 오라클로 배우는 데이터베이스 입문
'여니의 프로그래밍 study > Oracle' 카테고리의 다른 글
[Oracle] Basic Join : African Cities (0) | 2023.06.02 |
---|---|
[Oracle] 오라클 함수에 대해 알아보자. (0) | 2023.05.06 |
[Oracle] SELECT문 WHERE절 활용 (0) | 2023.05.06 |
[Oracle] 데이터 모델링 기본 개념 (엔티티, PK, 도메인, 다대다 관계) (0) | 2023.03.28 |