💻Programming/Oracle

[Oracle/오라클] 테이블 조인 (내부조인)

horang_dev 2021. 3. 15. 19:31

 테이블 조인 

 - 관계형 데이터베이스의 핵심

 - 여러 테이블에 분산되어 저장된 자료들의 관계를 이용하여 데이터를 추출하는 연산

 - 종류

    1) 내부조인, 외부조인

    2) 일반조인, ANSI 조인

    3) Cartesian Product, Equi Join ( 동등조인 ), Non-Equi Join, Self Join, etc ...


 1. 내부 조인 ( INNER JOIN )

   - 조인조건을 만족하는 테이터만 연산의 결과 반환되고 조인조건에 맞지않는 자료는 무시됨.

 

(일반조인)

 SELECT 컬럼LIST , ...

       - 반드시 2개 이상의 테이블이 사용되어야 함.

       - 조인조건에 사용되는 컬럼명이 같을 시 테이블명이나 별칭을 사용하여 어느 테이블에 속해있는지 구분해야 함.

  FROM  테이블명1 [ 테이블별칭1 ] , 테이블명2 [ 테이블별칭2 ] [, 테이블명3 [ 테이블별칭3 ] ,... ] 

 WHERE  조인조건

   [ AND 조인조건 , ... ]   [ AND 일반조건 , ... ]    - 사용되는 테이블의 갯수가 n개 일 때 조인조건은 최소 n-1개 이상이어야 함.    - 조인조건에 사용되는 컬럼은 두 테이블에 존재하는 같은 자료를 저장하고 있는 컬럼임. (보통 외래키 관계 활용)    - 조인조건과 일반조건의 기술 순서는 상관없음

 

 

(ANSI 조인)

 SELECT 컬럼LIST , ...

  FROM  테이블명1 [ 테이블별칭1 ] 

  INNER JOIN 테이블명2 [ 별칭2 ] ON (조인조건) - 테이블1과 2가 조인됨. 직접적 관계가 있는 테이블 사용

  [ AND 일반조건 ] - 테이블1과 2에만 적용되는 조건

[ INNER JOIN 테이블명3 [ 별칭3 ] ON (조인조건) - 테이블1과 2가 조인된 결과와 테이블3 조인

  [ AND 일반조건 ] ]  - 테이블1과 2가 조인된 결과와 테이블3에 적용되는 조건

[ WHERE 일반조건 , ... ] - 전체 테이블에 적용되는 조건

 

ex) 상품테이블(prod)에서 각 분류에 속하는 상품의 수를 조회하시오.     Alias는 분류코드, 분류명, 상품의 수이다.

  --일반 형식
  SELECT A.prod_lgu AS 분류코드,
   	 B.lprod_nm AS 분류명,
         COUNT(*) AS "상품의 수"
    FROM prod A, lprod B
   WHERE A.prod_lgu = B.lprod_gu
   GROUP BY A.prod_lgu, B.lprod_nm
   ORDER BY 1;
   
  --ANSI 형식
  SELECT A.prod_lgu AS 분류코드,
   	 B.lprod_nm AS 분류명,
         COUNT(*) AS "상품의 수"
    FROM prod A
   INNER JOIN lprod B ON (A.prod_lgu = B.lprod_gu)
   GROUP BY A.prod_lgu, B.lprod_nm
   ORDER BY 1;
   

-- 출력 결과 --


 2. Cartesian Product (ANSI에서는 CROSS JOIN이라고 함)

   - 모든 가능 행들의 조합

   - 조인에 참여한 테이블의 행의 곱과 열의 합을 합한 결과 반환

   - 반드시 필요한 경우가 아니면 사용 자제

   - 조인조건을 생략하거나 잘못 적용한 경우 발생


 3. Equi Join

   - 동등조건으로 조인조건에 '=' 연산자가 사용되는 조인

   - ANSI에서는 INNER JOIN이라 함.

 

ex) 장바구니테이블(cart)에서 2005년 7월 상품별 판매현황을 조회하시오.

     Alias는 상품코드, 상품명, 판매수량, 판매금액이다.

  --일반 형식
  SELECT A.cart_prod AS 상품코드,
   	 B.prod_name AS 상품명,
         SUM(A.cart_qty) AS 판매수량,
         SUM(A.cart_qty*B.prod_price) AS 판매금액
    FROM cart A, prod B
   WHERE A.cart_prod = B.prod_id
     AND A.cart_no LIKE '200507%'
   GROUP BY A.cart_prod, B.prod_name
   ORDER BY 1;
   
  --ANSI 형식
  SELECT A.cart_prod AS 상품코드,
   	 B.prod_name AS 상품명,
         SUM(A.cart_qty) AS 판매수량,
         SUM(A.cart_qty*B.prod_price) AS 판매금액
    FROM cart A
   INNER JOIN prod B ON (A.cart_prod = B.prod_id)
   WHERE A.cart_no LIKE '200507%'
   GROUP BY A.cart_prod, B.prod_name
   ORDER BY 1;
  

-- 출력 결과 --


 4. Non-Equi Join

   - 조인조건에 사용된 연산자가 '=' 이 아닌 조인

   - IN, ANY, SOME등이 주로 사용

 

ex) 사원테이블(employees)과 급여등급테이블(sal_grade)을 사용하여 60번 부서에 속한 사원들의 급여와 등급을

    조회하시오.

    Alias는 사원번호, 사원명, 급여, 등급이다.

    SELECT A.employee_id AS 사원번호, 
           A.emp_name AS 사원명, 
           A.salary AS 급여, 
           B.grade AS 등급
      FROM employees A, sal_grade B
     WHERE A.department_id = 60
       AND A.salary BETWEEN B.lsal AND B.hsal;

-- 출력 결과 --


 5. SELF JOIN

   - 하나의 테이블에 2개 이상의 테이블 별칭을 부여하여 서로 다른 테이블로 간주하여 조인 연산 수행

 

ex) 회원테이블에서 직업이 '주부'인 회원들의 평균 마일리지보다 많은 마일리지를 보유한 회원을 조회하시오
     Alias는 회원번호, 회원명, 직업, 마일리지이다.

    SELECT A.mem_id AS 회원번호, 
           A.mem_name AS 회원명, 
           A.mem_job AS 직업,
           C.amile AS 평균마일리지,
           A.mem_mileage AS 마일리지
      FROM member A, 
          (SELECT AVG(B.mem_mileage) AS amile
             FROM member B
            WHERE mem_job = '주부') C
     WHERE A.mem_mileage > C.amile;
반응형