본문 바로가기

자린고비 독학하기/자린고비 코딩하기

SQL - JOIN

반응형

 

 

JOIN

  • CARTESIAN PRODUCT 
  • EQUI JOIN
  • NON-EQUI JOIN
  • SELF JOIN
  • OUTER JOIN

 

 

 

CARTESIAN PRODUCT (카티션 프로덕트 / 카티션 곱)

 

  • 두 개 이상의 테이블이 조인될 때, WHERE 절에 조건이 지정되지 않아 전체 행이 대응되는 것.
  • 의미가 없는 값이 출력된다. 

 

 

emp 테이블의 행은 14개, dept의 행은 4개이다. 둘을 카디션 프로덕트하면 둘을 곱한 값인 56이 출력된다.

 

 

카디션 프로덕트를 한 결과, emp와 dept가 연결되면서 의미 없는 값이 출력되었다. 

 

 

 

 

 

동등 조인 : EQUI JOIN 

  • 대상 테이블에서 속성의 값이 같은 열끼리 대응시킨다. 
  • 가장 많이 사용하는 방법이다.

 

 

 SELECT * FROM emp, dept
  WHERE emp.deptno = dept.deptno; 

emp 테이블과 dept 테이블에 서로 가진 deptno 열의 값이 같은 행만 출력하였다. 

 

 

SELECT ename, dname FROM emp, dept
   WHERE emp.deptno = dept.deptno AND emp.ename = 'SCOTT' ;

mp 테이블과 dept 테이블에 서로 가진 deptno 열의 값이 같으며, emp 테이블의 name 속성이 SCOTT인 행만 뽑았다.

 

  • 유의: SELECT에 두 테이블에 함께 존재하는 컬럼 이름을 넣게 되면, "ORA-00918: 열의 정의가 애매합니다" 오류가 뜬다.

 

이름 앞에 별칭 지정을 해 줌으로써 해결할 수 있다.

 

  • 별칭 : FROM 테이블 별칭 포맷으로 사용 가능하다. 해당 쿼리 안에서는 꼭 별칭 사용을 해 줘야 한다.

 

 

비등가 조인 : NON-EQUI JOIN 

동일 컬럼 없이 다른 조건을 이용해서 조인하는 방법.

  • 동등 조인은 JOIN 조건에 서로 같은 데이터를 가진 데이터를 JOIN해서 가지고 온다.
  • 그러나, 비등가 조인은 산술 연산자 등을 이용하여 해당 값과 같거나, 큰 경우 JOIN해서 가지고 온다. 

 

SELECT ename, sal, grade
FROM emp, salgrade
WHERE sal BETWEEN losal AND hisal;

테이블의 sal 값이 losal hisal 값 사이에 있을 때 두 열을 대응시켰다. 

 

 

 

  • 활용: emp, dept, salgrade 테이블을 이용하여 직원 이름, 부 이름, 등급을 출력하는 쿼리문을 만드시오.

 

SELECT e.ename, d.dname, s.grade
FROM emp e, dept d, salgrade s
 WHERE e.deptno = d.deptno AND  e.sal BETWEEN s.losal AND s.hisal ;

WHERE 조건절에 부 숫자와 부 이름이 같을 때 && 연봉이 losal과 hisal 안에 있을 때의 등급을 출력하도록 만들어 주었다.



 

 

자기 조인: SELF JOIN

 

  • 하나의 테이블을 가지고 조인
  • 테이블 이름이 같기 때문에 별칭 지정이 꼭 필요하다. 

 

mgr 속성과 empno 속성이 같은 테이블 중, ename 값이 SMITH인 열만 뽑았다. (SMITH의 매니저 이름을 구하는 쿼리문)

 

매니저를 구하는 쿼리문을 연결 연산자를 통해 문자열처럼 표현해 주었다. 그런데, 전체 컬럼은 14 개임에도 13 개만 출력된 이유는 무엇일까? 

 

 

외부 조인: OUTER JOIN 

  • WHERE 절의 조인 조건에 만족하지 않더라도, 해당 행을 결과 값에 출력하는 기법
  • 어느 한 테이블에는 존재하는 데이터가 다른 테이블에 존재하지 않는다면, 매칭되지 못한 데이터가 출력되지 않는 현상을 해결하기 위해 사용되는 방법이다. 
  • 존재하지 않는 테이블을 WHERE 조건정에 추가할 때 (+)를 붙여 표현해 줌으로서 해당 데이터가 출력되도록 한다.

 

SELECT employee.ename|| '의 매니저는 '|| manager.ename||'입니다.'

FROM emp employee, emp manager WHERE employee.mgr = manager.empno;

mgr 값이 누락되어 있는 KING의 경우 출력이 되지 않고 있다.

 

 

 

 

SELECT employee.ename|| '의 매니저는 '|| manager.ename||'입니다.'

FROM emp employee, emp manager WHERE employee.mgr = manager.empno(+);

KING을 함께 출력해 주기 위해서, 외부 조인 연산자 (+)을 사용해 주었다. mgr 값이 없더라도 출력되었음을 알 수 있다.

 

 

 


 

 

SELECT * FROM emp WHERE deptno=40;

emp 테이블에는 deptno가 40인 행은 존재하지 않는다.

 

SELECT e.ename, e.deptno, d.deptno, d.dname
FROM emp e, dept d
WHERE e.deptno(+) = d.deptno;

그러나, dept 테이블에는 deptno이 40인 값이 존재하기 때문에 emp 테이블에 (+) 연산자를 통해서 해당 값이 출력될 수 있도록 했다. 

 

 

반응형

'자린고비 독학하기 > 자린고비 코딩하기' 카테고리의 다른 글

SQL - DML  (0) 2019.08.01
SQL - DATA DICTIONARY VIEW  (0) 2019.08.01
SQL - 그룹 함수 / GROUP BY / HAVING  (1) 2019.07.31
SQL - NVL / DECODE / CASE  (0) 2019.07.31
"NULL"은 무엇인가?  (0) 2019.07.31