본문 바로가기
DB

[SQL] 07. JOIN

by NOHCODING 2021. 11. 17.
반응형

 

 

(0) JOIN이란?

  메모리는 작업을 하는 공간이고, 디스크는 저장을 하는 공간이다. 데이터베이스를 작동시킬 때, 평소에는 데이터들을 하드디스크에 저장해 놓고 필요할 때마다 메모리로 복사해와서 조회도 하고, 변경 작업을 하게 된다. 예시로 '직업'이란 테이블 안에 A,B,C,D,E 가 있다고 하자. 사용자가 데이터베이스에 'select A, B from 직업'  명령어를 입력하게 된다면 저장되는 데이터 구조상 사용하지 않는 C,D,E 칼럼이 포함된 '직업'테이블이 전부 메모리에 올라가게 된다.

 

 그래서 테이블에 컬럼이 많을 경우, 중복되는 데이터를 막기위해  정규화라는 방법이 등장하게된다.  정규화는 하나로 되어 있는 것을 더 작은 조각으로 분리하는 기술을 말한다. 정규화를 수행하면 하나의 테이블이 여러개의 테이블들로 나누어져서 저장되고, 이때 여러 테이블에 흩어져 있는 데이터를 조합해서 가져오는 기술이 join 이다.

 

   1) 오라클 join문법

sql> select a.col1, b.col1
	from table a, table b
    where a.col2 = b.col2;

   2) ANSI join 문법

sql> select a.col1, b.col1
	from table a,[INNER] JOIN table b
    ON a.col2 = b.col2;

 

 

(1) Caresian Product (카디션 곱)

    ①  카디션 곱 : join 쿼리 중에 where 절에 기술하는 join 조건이 잘못 기술되었거나 없을 경우 발생하는 현상

    ②  ANSI SQl 에서는 CROSS JOIN이라고도 부름

    ③ 카디션 곱이 일어날 경우 JOIN 작업에 참조되는 테이블 행 수를 모두 곱한 결과 값이 만들어짐

 

   1) 카디션 곱을 사용하는 이유

       데이터를 복제해서 원본 테이블을 반복해서 읽는 것을 피하기 위해서 

       실수로 조인 조건 컬럼 중 일부를 빠뜨리는 경우 

 

 

(2) EQUL join (등가 조인) 

   ① 조건절에서 Equal 연산자 (=)를 사용해서 EQUL join이라고도 부름

    SELECT절에 "테이블이름. 컬럼이름" 으로 작성하면 된다. 

   ③ 만약 컬럼 이름이 하나의 테이블에만 있을 경우, 테이블 이름을 생략하고 컬럼 이름만 작성해도 된다. 

   ④ 그러나 양쪽 테이블에 모두 있는 컬럼일 경우에는 반드시 테이블이름을 앞에 붙여주어야 함

        그렇지 않은 경우 에러 발생:  (ORA - 00918: column ambiguously defined)

   ⑤ 한쪽에 없는 데이터(NULL)를 가진 값까지 다 보고 싶은 경우 Outer Join을 활용해야함.   

   ⑥ Join 조건 : where절에 join을 수행하기 위한 문법, 검색조건 : 이외의 절

   ⑦  Join조건과 검색조건이 동시에 있는 경우 : 검색조건 → 데이터의 검색 범위 줄이기 → Join작업을 수행

         검색 조건을 잘 활용 = join 작업속도가 빨라짐      

 

   1) 두 개의 테이블 join 예시 :

        emp 테이블과 dept테이블을 JOIN하여 사원 번호, 사원 이름, 부서 명을 출력하시오 

     ① oracle Join문법  

SELECT e.empno, e.ename, d.danme
	FROM emp e, dept d
    WHERE e.deptno = d.deptno;

     ANSI Join 문법

SELECT e.empno, e.ename, d,danme
	FROM emp e JOIN dept d
	ON e.deptno = d.deptno;

 

   2) 3개의 테이블을 이용한 Join 예시 

     ① oracle Join문법  

SESECT s.name,d.name,p.name
	FROM student s, department d, professor p
    	WHERE S.DEPTNOL = D.DEPTNO
        AND S.PROFNO = P.PROFNO;

     ② ANSI Join 문법

SELECT s.name,d.dname, p.name
	FROM student S JOIN department d 
   	on s.deptnol = d.deptno 
        JOIN professor p 
        ON s.profno = p.profno;

  

 

(3) Non-Equi Join 비등가 조인 

   ① 조인 대상 테이블이 같은 조건이 아닌 크기가 같거나 작거나 하는 경우 : Non-Equi Join (비등가 조인) 사용.

 

     1) ANSI Join 문법 예시

SELECT c.gname, TO_CHAR(c.point,'999,999'),g.gname
	FROM customer c JOIN gift g
    	ON c.point >= g.g_start
        AND c.point <= g.g_end;

 

 

(4) OUTER Join(아우터 조인)

    ① Inner Join 과 반대로 한쪽 테이블에는 데이터가 있고, 한쪽 테이블에 없는 경우

         데이터가 있는 쪽 테이블의 내용을 전부 출력하게 하는 방법

   ② 모든데이터를 다 출력하기에 DB성능에 영향을 미칠 수 있음을 명심하고 사용 여부에 신중해야 할 것 

   ③ 아우터 조인이 발생할 경우 조인 순서가 고정되어 사용자 뜻대로 변경할 수 없음(SQL 튜닝)

 

1) Oracle Outer Join 예시 

   ① Oracle Outer Join 문법

      - Oracle Outer Join  구문은 where 조건절에서 데이터가 없는 쪽에 (+) 표시를 함.

SELECT s.name, p.name
	FROM student s, profrssor p 
    WHERE s.profno = p.profno(+);

   ② ANSI Outer Join 문법 

      - Oracle Outer Join  : 데이터가 없는 쪽에 (+) 표시, ANSI Outer Join : 데이터가 존재하는 쪽에 표시

      - ANSI Outer Join : 데이터가 존재하는 쪽에 기호를 표시하기에  ON 조건절 중에 '=' 기호 기준으로 작성

SELET s.name, p.name
	FROM student s LEFT OUTER JOIN professor p
    	ON s.profno = p.profno;

 

 

(5) SELF Join 

    ① 원하는 데이터가 하나의 테이블에 다 들어가 있을 경우 SELF Join을 사용한다. 

    ② SELF Join이란 데이터를 가지고 있는 하나의 테이블을 메모리에 별명을 두개로 사용하여, 호출함

 

1) SELF Join 예시 

   ① Oracle SELF Join 문법

SELECT e1.ename , e2.ename
	FROM emp e1, emp e2
    	WHERE e1.mgr = e2.empno

 

   ② ANSI SELF Join 문법

SELECT e1.ename , e2.ename
	FROM emp e1 JOIN emp e2
    	ON e1.mgr = e2.empno

 

 

반응형

'DB' 카테고리의 다른 글

[SQL] 08. (2) 단일행 숫자 함수  (0) 2021.11.21
[SQL] 08. (1) 단일행 문자 함수  (0) 2021.11.20
[SQL] 03. oracle11g 데이터 타입  (0) 2021.11.15
[SQL] 06. Group 함수  (0) 2021.11.10
[SQL] 05. 컬럼 길이 조절  (0) 2021.11.09

댓글