본문 바로가기
DATABASE/ORACLE

[Oracle] SQL JOIN

JOIN






이 포스트 부터는 SCOTT 계정을 사용 하여 예제를 들겠습니다





조인의 필요성


사원이름(ENAME), 부서 번호(DEPTNO)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SQL> SELECT ENAME, DEPTNO FROM EMP;
 
ENAME          DEPTNO
---------- ----------
SMITH              20
ALLEN              30
WARD               30
JONES              20
MARTIN             30
BLAKE              30
CLARK              10
SCOTT              20
KING               10
TURNER             30
ADAMS              20
 
ENAME          DEPTNO
---------- ----------
JAMES              30
FORD               20
MILLER             10
 
14 개의 행이 선택되었습니다.
cs



부서 번호에 대한 부서 이름은 부서(DEPT) 테이블에 있다.

특정 사원에 대한 부서명을 알아내기 위해서는 부서 테이블에서 정보를 얻어와야 한다


1
2
3
4
5
6
7
8
SQL> SELECT DEPTNO,DNAME FROM DEPT;
 
    DEPTNO DNAME
---------- --------------
        10 ACCOUNTING
        20 RESEARCH
        30 SALES
        40 OPERATIONS
cs


테이블을 같이 보아야 정보를 얻을 수 있다는 결론이 나온다.

그래서 JOIN이 필요하다





● CROSS JOIN 


한쪽 테이블의 모든 행들과 다른 쪽 테이블의 모든 행을 조인시키는 기능을 한다.

그래서 CROSS JOIN의 결과 개수는 두 테이블 개수를 곱한 개수가 된다.


cross join에 대한 이미지 검색결과


1
SELECT *FROM emp, dept;
cs

총 11개의 칼럼이 나온다. (emp 칼럼의 개수 : 8 , dept 칼럼의 개수: 3)

로우 수는 사원 한 명에 대해서 DEPT 테이블의 4개의 로우와 결합이 되기 때문에 14*4가 된다.


조인 결과가 의미를 가지려면 조인 할 때, 조건을 지정해야 한다.



JOIN의 종류

종류 

설명 

Equi Join 

동일 칼럼을 기준으로 조인 

Non-Equi Join 

동일 칼럼이 없이 다른 조건을 사용하여 조인 

Outer Join 

조인 조건에 만족하지 않는 행도 나타낸다 

Self Join 

한 테이블 내에서 조인한다 




INNER JOIN (Equi JOIN, Non-Equi JOIN)


● INNER JOIN (내부 조인)

조건을 사용하여 두 테이블의 레코드를 결합한다.

EQUI JOIN, NON-EQUI JOIN, NATURAL JOIN 등이 있다.



- Equi Join ( 등가조인 )

foreign 키와 primary 키 값이 equal 일 때 양쪽 테이블의 값을 가져오는 조인

table_name.column_name 형태로 표시

두 테이블을 조인 시킬 조인 조건은 WHERE 절에서 TABLE1.COLUMN_NAME = TABLE.2COLUMN_NAME 으로 기술





1
select *FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
cs

EMP의 DEPTNO와 DEPT의 DEPTNO 가 같은 목록을 출력한다.


사원(EMP) 테이블과 부서(DEPT) 테이블의 공통 컬럼인 DEPTNO의 값이 일치 되는 조건 WHERE 절에 기술

테이블을 조인 하려면 일치되는 공통 컬럼을 사용해야 하며, 컬럼의 이름이 같게되면 혼동이 오기 때문에 컬럼 이름 앞에 테이블 이름을 기술한다.



--Equi Join에 AND 연산하기

예) 이름이 SCOTT인 사람의 부서명을 출력

1
SELECT *FROM emp,dept WHERE emp.deptno = dept.deptno AND ename ='SCOTT';
cs



※ 컬럼명의 모호성 해결 해야한다!

1
SELECT ename, dname, deptno From EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND ENAME='SCOTT';
cs

두 테이블에 동일한 이름의 칼럼을 사용하면 어느 테이블 소속인지 불분명하기에 애매모호한 상태라는 오류 메세지가 출력된다.


컬러명 앞에 테이블 명을 명시적으로 기술하자

1
SELECT EMP.ename, DEPT.dname, EMP.deptno From EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND ENAME='SCOTT';
cs





- Non Equi Join

두 테이블간의 컬럼 값이 일치하지 않을 때 사용하는 조인

WHERE 절에서 = 연산자 이외의 BETWEEN, <, > 등의 비교연산자를 사용한다


급여 등급을 5개로 나누어 놓은 salgrade에서 정보를 얻어와서 각 사원의 급여 등급을 지정해보자




SALGRADE 테이블

1
2
3
4
5
6
7
8
9
SQL> SELECT *FROM salgrade;
 
     GRADE      LOSAL      HISAL
---------- ---------- ----------
         1        700       1200
         2       1201       1400
         3       1401       2000
         4       2001       3000
         5       3001       9999
cs


사원 테이블 (EMP)와 급여 등급(salgrade) 테이블을 조인 해보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SQL> SELECT ename, sal, grade FROM emp, salgrade
  2  WHERE sal BETWEEN losal and hisal;
 
ENAME             SAL      GRADE
---------- ---------- ----------
SMITH             800          1
JAMES             950          1
ADAMS            1100          1
WARD             1250          2
MARTIN           1250          2
MILLER           1300          2
TURNER           1500          3
ALLEN            1600          3
CLARK            2450          4
BLAKE            2850          4
JONES            2975          4
 
ENAME             SAL      GRADE
---------- ---------- ----------
SCOTT            3000          4
FORD             3000          4
KING             5000          5
 
14 개의 행이 선택되었습니다.
cs


'DATABASE > ORACLE' 카테고리의 다른 글

[Oracle] SQL Outer Join / ANSI Join  (1) 2018.04.20
[Oracle] SQL Self Join  (0) 2018.04.20
[Oracle] SQL HAVING  (1) 2018.04.20
[Oracle] SQL GROUP BY 절  (0) 2018.04.20
[Oracle] SQL 그룹 함수 집계 데이터  (0) 2018.04.20