본문으로 바로가기

[Oracle] 조인(JOIN) -1-

category DB/Oracle 2021. 5. 7. 15:00

2015. 7. 9. 11:14 Naver Blog 백업용


모든 테이블 정보 보기

- SELECT * FROM TAB;

 

 

간단하게 JOIN 연습해보기

- SELECT ENAME,DNAME FROM EMP,DEPT;

- ENAME(14개 ROWS) / DNAME(5개 ROWS)

- 두개를 합친 70개 ROWS가 출력됨

- 조건이 없기때문에 DNAME을 모든 ENAME에 매치시킴

: HEEJU ACCOUNTING / HEEJU SALES / HEEJU RESEARCH / ...

 

 

CROSS JOIN = 카티션 프로덕트

- 테이블이 조인될 때 WHERE절에 의해 공통되는 컬럼에 의한 결합이 발생하지 않는 경우

 

 

 

 조인의 종류

- EQUI JOIN : 동일 컬럼을 기준으로 조인

- NON-EQUI JOIN : 동일 컬럼이 없이 다른 조건을 사용하여 조인

- OUTER JOIN : 조인 조건에 만족하지 않는 로우도 나타냄

- SELF JOIN : 한 테이블 내에서 조인

 

1) EQUI JOIN

 

- 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치되는 행을 연결해 결과 생성

 

- SELECT ENAME,HIREDATE,DNAME

  FROM EMP,DEPT

  WHERE EMP.DEPTNO = DEPT.DEPTNO; -> 소속을 명확하게 해 줄 필요가 있음

 

 + 소속의 명확성 향상을 위해

- 테이블명.애트리뷰트

ex) SELECT EMP.DEPTNO, DEPT.DEPTNO

FROM EMP, DEPT

- ALIAS 사용

ex) SELECT E.DEPTNO, D.DEPTNO

FROM EMP E, DEPT D
 

- 문제. SALES 부서에 있는 사원의 이름,입사일,월급,부서명을 출력하세요. (2개 테이블 조인)

SELECT E.ENAME, E.HIREDATE, E.SAL, D.DNAME

FROM EMP E, DEPT D

WHERE E.DEPTNO = D.DEPTNO AND D.DNAME='SALES';

 

- 문제. 3개 테이블 조인

SELECT E.ENAME, E.DEPTNO, D.DNAME, L.CITY

FROM EMP E, DEPT D, LOCATIONS L 

HERE E.DEPTNO = D.DEPTNO AND D.LOC_CODE = L.LOC_CODE;

 

- 문제. 서울에 근무하는 사원의 목록

SELECT E.ENAME, E.DEPTNO, D.DNAME, L.CITY

FROM EMP E, DEPT D, LOCATIONS L

WHERE E.DEPTNO = D.DEPTNO AND D.LOC_CODE = L.LOC_CODE AND L.CITY='SEOUL';

 

2) NON-EQUI JOIN

 

- 특정 범위내에 있는지를 조사하기위해 WHERE 절에 조건을 넣어 비교함

- 주로 은행에서 실적, 회사에서 실적 등을 조회하기 위하여 사용함

 

문제. 사원의 월급의 등급을 출력

SELECT E.ENAME, E.SAL, S.GRADE

FROM EMP E, SALGRADE S

WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

--> 보통 BETWEEN AND를 활용

 

3) SELF JOIN

 

- 하나의 테이블 내에서 조인해서 데이터를 얻어내기 위한 조인

- 대표적인 예로 관리자의 이름/사원번호를 뽑아내기 위한 예시를 들 수 있다.

 

- 문제1. 관리자별로 관리하고 있는 직원이 몇명인지 구하시오.

SELECT M.ENAME, COUNT(E.EMPNO)

FROM EMP E, EMP M

WHERE E.MGR = M.EMPNO

GROUP BY M.ENAME;

 

- 문제2. 매니저가 KING인 사원의 사원명, 부서코드, 급여 정보 출력하기

SELECT E.ENAME, E.DEPTNO, E.SAL, E.MGR, M.ENAME

FROM EMP E, EMP M

WHERE M.ENAME = 'KING' AND E.MGR = M.EMPNO;

 

4) OUTER JOIN

 

- 어느 한쪽의 테이블에는 데이터가 존재하는데 다른쪽 테이블에는 존재하지 않는 경우,

  그 데이터는 출력되지 않는 문제를 해결하기 위한 조인 기법

 

- 먼저, 두개의 튜플을 EMP 테이블에 넣는다

INSERT INTO EMP VALUES('7777','장동건',NULL,NULL,SYSDATE,0,0,NULL);

INSERT INTO EMP VALUES('8888','고소영',NULL,NULL,SYSDATE,0,0,NULL);

 

- 문제1. 사원이름, 부서번호, 입사일을 기본으로 출력 --> DEPTNO가 NULL인 값도 출력된다. 

SELECT ENAME, DEPTNO, HIREDATE

FROM EMP;

 

- 문제2. DEPTNO가 동일한 정보를 출력 --> DEPTNO가 NULL인 값은 출력되지 않는다. 

SELECT E.ENAME, E.DEPTNO, E.HIREDATE, D.DNAME

FROM EMP E, DEPT D

WHERE E.DEPTNO = D.DEPTNO;

 

- 정보가 부족한 쪽에 (+) 기호를 붙인다.

SELECT E.ENAME, E.DEPTNO, E.HIREDATE, D.DNAME

FROM EMP E, DEPT D

WHERE E.DEPTNO = D.DEPTNO(+);

부서명이 없지만 + 기호를 붙여 정보가 있다는 전제하에 데이터를 출력해주게됨. 

 

- 문제3. 매니저가 없는 사원의 사원명, 부서코드, 급여 정보 출력하기(SELFJOIN문제2 응용)

SELECT E.ENAME, E.DEPTNO, E.SAL, E.MGR, M.ENAME

FROM EMP E, EMP M

WHERE E.MGR = M.EMPNO(+);

 

 

ANSI JOIN

- 형식

SELECT *

FROM TABLE1 INNER JOIN TABLE2

WHERE TABLE1.COL1 = TABLE2.COL2

- 예시

SELECT ENAME, DNAME

FROM EMP INNER JOIN DEPT

WHERE EMP.DEPTNO = DEPT.DEPTNO

'DB > Oracle' 카테고리의 다른 글

[Oracle] 데이터 무결성 -1-  (0) 2021.05.07
[Oracle] 서브쿼리 -1-  (0) 2021.05.07
[Oracle] 검색(SELECT) -1-  (0) 2021.05.07
[Oracle] 그룹함수 -1-  (0) 2021.05.07
[Oracle ] SQL 주요함수 -3-  (0) 2021.05.07