-
SQL - 조인DataBase/Oracle 2023. 8. 30. 17:27
1. 조인
- 집합연산자와 차이점: 집합 연산자는 SELECT의 결과를 세로로 연결한 것, 조인은 두 개 이상의 테이블을 가로로 연결
- 여러 테이블을 사용할 때 from절: - FROM절에는 여러 테이블을 지정하는 것이 가능하다 .(,로구분) (크로스조인, 카테시안곱)
- 정확히는 열과 행으로 구성된 데이터 집합이면, 모두 FROM절에 지정가능(뷰,시퀀스)
- 조인 조건이 없는 경우 문제점: - 결과로 나올 수 있는 모든 행을 조합함 ( A: 1,2 행 B: 1,2 행 > (11,12,21,22) )
- 따라서 정확한 데이터 함께 출력됨
- 조인할 테이블이 많아질 수록 정확한 데이터 뽑아내기 위해 고민을 많이 하자
(WHERE가 많은 역할을 해준다!)
--크로스 조인 where 조건절 SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO ORDER BY EMPNO;
- 테이블 별칭 설정 : SELECT처럼 FROM에도 테이블별로 별칭 설정이 가능하다.
2. 조인의 종류
2.1 등가조인 (내부조인, 단순내부조인)
- 일반적으로 가장 많이 사용됨, default 조인방식
- 특정 열값이 일치한 출력 결과를 사용하는 방식
SELECT E.EMPNO, E.ENAME, E.SAL, D.DEPTNO, D.DNAME, D.LOC FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO AND SAL >= 3000;
- 위와 같이 AND를 사용하여 여러 조건을 추가로 달아서 출력범위를 설정할 수 있다.
- 필수 필요 조건식의 수는 데이블 개수에서 하나 뺀 값이다. (A,B,C가 있다면 , (A=B)=C가 가능하도록 2개 필요)
*여러 테이블에서 열이름이 같으면, 테이블명 혹은 테이블 별칭을 적어주자
2.1.1 비등가조인
- 등가조인 외의 방법을 의미
- EMP 테이블과 SALGRADE 테이블을 조합한다고 했을 때 두 테이블에 일치하는 열 x(등가조인x)
- EMP테이블의 SAL열은 SALGRADE테이블의 LOSAL과 HISAL 사이에 위치 이때 BETWEEN연산자로 처리가능
SELECT * FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
*등가조인에 비해 자주 사용되는 방식은 아니다.
(WHERE 사용하지 않고, FROM으로 불러오면 데카르트곱 -> 각 사원별 5개 등급이 모두 나옴)
2.1.2 자체조인
- 한 테이블을 연속으로 붙여둔다고 보자
- EMP 테이블에 MGR열(직속 상관 사원번호)이 열과 나머지 사원 정보가 나란히 출력해야하는 경우
- MGR열과 EMPNO열 값을 연결 (특정 MRG열과 일치한 EMPNO열 일치시켜야함)
SELECT * FROM MEP E, COPY_EMP C WHERE E.MGR = C.EMPNO;
- EMP테이블과 일치한 COPY가 있다면 위와 같이 해결할 수 있는데, 이는 비효율적(데이터 아깝고, 갱신 어려움)
- 이를 해결하기 위한 방법이 self join임
SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MRG_EMPNO, E2.ENAME AS MGR_NAME FROM EMP E1, EMP E2 WHERE E1.MGR = E2.EMPNO;
- 같은 테이블이지만, 다른 별칭을 사용하여 논리적으로 다른 테이블처럼 사용
*MGR열이 NULL인 KING은 제외 -> 이는 일치한 열을 기준으로 데이터가 조인되고 추출되기 때문이다.
(내부조인, 등가조인과 비슷하다)
2.2 외부조인
- 내부조인의 문제점은 일치한 열을 기준으로 결과가 나오므로, 일치하지 않거나, 해당 열이 NULL인 경우에
결과가 출력되지 않는 점이 있다.
- 일치하지 않는 경우에도 결과에 포함하고 싶을 때는 외부조인을 사용하자
Left Outer Join WHERE TABLE1.COL1 = TABLE2.COL1(+) Right Outer Join WHERE TABLE1.COL1(+) = TABLE2.COL1 --1 SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MRG_EMPNO, E2.ENAME AS MGR_ENAME FROM EMP E1, EMP E2 WHERE E1.MGR = E2.EMPNO(+) ORDER BY E1.EMPNO; --2 SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MRG_EMPNO, E2.ENAME AS MGR_ENAME FROM EMP E1, EMP E2 WHERE E1.MGR(+) = E2.EMPNO ORDER BY E1.EMPNO;
- 1은 LEFT OUTER JOIN임 왼쪽열을 기준(최소 모든 데이터 출력) 조인되는 테이블 열은 일치하는 값만 출력
- 2는 RIGHT OUTHER JOIN 오른쪽열 데이터는 모두 출력 조인되는 테이블열은 일치하는 값만 출력
-> 일치하는 값이 없다면 그냥 null처리
* 원하는 결과로 join하기 위해 +를 바꿔가며 연습해봅시다.
* FULL OUTER JOIN은 각 OUTER조인 SELECT한 결과 UNION합시다.
3. SQL-99 표준 문법 조인
3.1 NATURAL JOIN
- 등가조인 (내부조인)
> NATUAL JOIN
SELECT E.EMPNO, DEPTNO, D.DNAME -- FROM EMP E NATIAL JOIN DEPT D;
- EMP와 DEPT에 공통열을 기준으로 알아서 내부조인 해줌 (FROM에 조인 묘사)
- 이때 기준이 되는 열은 테이블명을 붙이면 안됨!!
> JOIN ~ USING
FROM TABLE JOIN TABLE2 USING('조인에 사용할 기준열')
- 이와 같이 작성가능 WHERE절에 또 다른 조건식 추가하여 함께 사용가능 (JOIN 후에 WHERE 작동)
- NATUAL과 마찬가지로 기준이 되는 열에 테이블명 사용 금지
> JOIN ~ ON
FROM TABLE1 JOIN TABLE2 ON(조인조건)
- 가장 범용성 있는 JOIN ~ ON 조인조건을 ON에 명시 그 밖에 추가기준 WHERE에 명시
- OUTHER JOIN도 JOIN ~ ON과 비슷한 형태
FROM TABLE1 LEFT OUTER JOIN TABLE2 ON() -- WHERE TABLE1.COL = TABLE2.COL(+) FROM TABLE1 RIGHT OUTER JOIN TABLE2 ON() -- WHERE TABLE1.COL(+) = TABLE2.COL FROM TABLE1 FULL OUTHER JOIN TABLE2 ON() -- 오라클에는 없음 걸러낸다음 유니온
'DataBase > Oracle' 카테고리의 다른 글
오라클 - 객체 종류 (0) 2023.08.31 SQL - 서브쿼리 (0) 2023.08.31 SQL - 다중행 함수 (0) 2023.08.30 오라클 SQL - 단일행함수 (0) 2023.08.30 2. SQL - 조회 (0) 2023.08.29