오라클 일반조인과 ANSI 조인

조수경·2021년 9월 29일
0

Oracle

목록 보기
8/19

테이블 조인

  • 관계형 데이터베이스의 주요 연산중 하나

  • 다수개의 테이블에 분산된 자료를 테이블 간에 설정된 관계를 이용하여 참조하는 연산

  • 구분
    . 일반조인, ANSI 조인
    . 내부조인, 외부조인--조인 가지수가 더 많은 것이 외부 적은것이 내부(외부조인의 사용은 자제하는 것이 좋음)
    . 동등조인, 세미조인, 안티조인(넌이퀴조인), 카타시안조인(조인 조건이 잘못 사용된 경우), 등등

    1. 일반조인과 ANSI 조인

    • 일반조인은 DBMS 회사별로 제공되는 조인 형식
    • ANSI 조인 : 미국표준위원회에서 제정한(89년 기준안) 조인문 형식

    2. 내부조인
    1) 동등조인(Equi - JOIN)
    - 조인조건에 '=' 연산자가 사용된 조인
    - 가장 일반적인 조인 형식

(사용형식: 일반조인)
SELECT 컬럼list
FROM 테이블명1 [별칭1], 테이블명2 [별칭2],테이블명3 [별칭3],...]
-- 별칭 반드시 기술, 서브퀴리가 올수 있음 (독립적으로 실행되야함)
WHERE 조인조건
[AND 일반조건]
--OR 연결은 없음
. '조인조건': 사용된 테이블들 간 동일한 데이터를 가진 컬럼명 '='연산자로 연결한 조건
. 조인조건의 갯수는 적어도 테이블의 수-1개 이상이어야 함 --더나와도 상관없지만 덜 나오면 안됨
. '일반조건'과'조인조건'의 기술 순서는 수행과 관계없음 --섞여 기술해도 상관없음

(사용형식: ANSI 조인)
SELECT 컬럼list
FROM 테이블명1 [별칭1] --테이블명1과 2는 반드시 직접조인되어야 한다.(공통 컬럼을 반드시 가져야함) 아니면 오류
INNER JOIN 테이블명2 [별칭2] ON (조인조건1 [AND 일반조건1])
[INNER JOIN 테이블명3 [별칭3] ON (조인조건2 [AND 일반조건2])]

--3번째테이블은 1과 2의 결과와 조인되어지는 것(그래서 테이블명 1과 3은 공통 컬럼이 없어도됨)
:
[WHERE 조인조건n] --테이블명 1~3까지 모두 연결된 것만 WHERE절에 작성 가능
. '테이블명1'과 '테이블명2'는 반드시 직접 조인 가능해야함
. '테이블명3'은 '테이블명1', '테이블명2' 조인 결과와 조인
. '일반조건1'은 '테이블명1', '테이블명2'에만 관련된 조건
. '일반조건n'은 모든 테이블에 공통으로 적용되는 조건

       사용예) 사원테이블에서 2005년 이후 입사한 사원들을 조회하시오.
               Alias는 사원번호, 사원명, 부서명, 입사일이다.
       (일반조인)
       SELECT A.EMPLOYEE_ID AS 사원번호, 
              A.EMP_NAME AS 사원명, --ENP 테이블에만 있어서 별칭을 안써도 되지만 써야대..
              B.DEPARTMENT_NAME AS 부서명, 
              A.HIRE_DATE AS 입사일
        FROM HR.EMP A, HR.DEPT B
        WHERE EXTRACT (YEAR FROM A.HIRE_DATE)>='2008'   --일반조건
          AND A.DEPARTMENT_ID = B.DEPARTMENT_ID
          ORDER BY 3;
       
       (ANSI 조인)
       SELECT A.EMPLOYEE_ID AS 사원번호, 
              A.EMP_NAME AS 사원명, --ENP 테이블에만 있어서 별칭을 안써도 되지만 써야대..
              B.DEPARTMENT_NAME AS 부서명, 
              A.HIRE_DATE AS 입사일
        FROM HR.EMP A
        INNER JOIN HR.DEPT B ON( A.DEPARTMENT_ID = B.DEPARTMENT_ID
              AND EXTRACT(YEAR FROM A.HIRE_DATE)>=2008)   --일반조건
          ORDER BY 3;
       
    사용예) 미국에있는 부서별 인원수를 조회하시오 -- 조건: 미국내 US인 DEPARTMENT만 구해야함
          Alias는 부서코드, 부서명, 인원수 --부서 코드와 부서명은 같은 값
          
          SELECT  B.DEPARTMENT_ID AS 부서코드,
                  A.DEPARTMENT_NAME AS 부서명,
                  COUNT(*) AS 인원수 
            FROM HR.DEPT A, HR.EMP B, HR.LOCATIONS C
           WHERE B.DEPARTMENT_ID = A.DEPARTMENT_ID
             AND A.LOCATION_ID = C.LOCATION_ID
             AND C.COUNTRY_ID = 'US'
        GROUP BY B.DEPARTMENT_ID, A.DEPARTMENT_NAME
        ORDER BY 1;
        
        (ANSI 조인)
        
    사용예) 2005년도 5월 거래처별 매입현황을 조회하시오 --매입은 BUYPROD
           Alias는 거래처코드, 거래처명, 매입수량, 매입금액이다.
          
           SELECT C.BUYER_ID AS 거래처코드,
                  C.BUYER_NAME AS 거래처명,
                  SUM(A.BUY_QTY) AS 매입수량합계,
                  SUM(A.BUY_QTY * B.PROD_COST) AS 매입금액합계
            FROM BUYPROD A, PROD B, BUYER C
           WHERE A.BUY_PROD = B.PROD_ID
             AND B.PROD_BUYER = C.BUYER_ID
             AND A.BUY_DATE BETWEEN TO_DATE('20050501') AND TO_DATE('20050531')
             GROUP BY  C.BUYER_ID, C.BUYER_NAME
             ORDER BY 1;
          
       (ANSI 조인)
       
profile
신입 개발자 입니다!!!

0개의 댓글