[SQL] JOIN 이란?

SungminPark·2023년 12월 5일

SQL

목록 보기
2/5
post-thumbnail

JOIN

JOIN

  • 관계형 데이터베이스 핵심 연산
  • 테이블 사이에 존재하는 관계(Relationship)을 이용하여 다수 테이블에 분산된 정보를 조회하는 기법

JOIN의 종류

  • 일반조인 vs ANSI 조인
  • 동등 조인 vs 비동등 조인
  • 내부조인(Inner Join) vs 외부조인(Outer Join)
  • Self Join, Cross Join, Cartesian Product등이 있음

테이블이 n개가 나오면 조인조건은 적어도 N-1개 나와야 함

내부조인은 (자료의 양이 적은)조건에 맞는 것만 내보냄

외부조인은 (자료의 양이 많은)조건에 맞지 않으면 NULL을 채워서 내보냄(되도록 쓰지 않음)

일반 조인 사용 형식

  1. 내부 조인
SELECT [테이블별칭 | 테이블명 ].컬럼명,
                    :
FROM 테이블명1 [별칭1], 테이블명2 [별칭2], 테이블명3 [별칭3]...n
WHERE  별칭1.컬럼명 연산자 별칭2.컬럼명 --조인조건
[AND 일반조건]
  1. 외부조인
SELECT [테이블별칭 | 테이블명 ].컬럼명,
                    :
FROM 테이블명1 [별칭1], 테이블명2 [별칭2], 테이블명3 [별칭3]...n
WHERE 별칭1.컬럼명[(+)] 연산자 별칭2.컬럼명[(+)] --외부조인조건
--일반 조건 기술할수없음

ANSI 조인 사용 형식

  1. 내부조인
SELECT [테이블별칭 | 테이블명 ].컬럼명,
                    :
FROM 테이블명1 [별칭1]
INNER JOIN 테이블명2 [별칭2] ON(조인조건)[AND 일반조건]
                    :
[INNER JOIN 테이블명n [별칭n] ON(조인조건)[AND 일반조건]
[ WHERE  일반조건]
--앞의 조인결과와 뒤의 조인이 다시 합쳐짐
  1. 외부조인
SELECT [테이블별칭 | 테이블명 ].컬럼명,
                    :
FROM 테이블명1 [별칭1]
LEFT|RIGHT|FULL OUTER JOIN 테이블명2 [별칭2]  ON (조인조건)[AND 일반조건] 
                :
LEFT|RIGHT|FULL OUTER JOIN 테이블명n [별칭n]  ON (조인조건)[AND 일반조건] 
--왼쪽이 더크면 LEFT 오른쪽이 더 크면 RIGHT 둘다 부족하면 FULL
WHERE [일반조건]

Cartesian Product(Cross Join)

  • 조인조건이 없거나 조인조건을 잘못 사용한 경우 발생
  • 결과는 조인에 참여한 테이블의 모든 행을 곱한 결과 행과 조인에 참여한 테이블의 모든 열을 갖는 뷰를 반환
  • 특별한 목적이 아니면 사용을 자제해야 함

Cross Join 사용형식

SELECT 컬럼정의
FROM 테이블명1
CROSS JOIN 테이블명2 [ON(조인조건)]
            :
  • 사용 예
    SELECT COUNT(*) "상품 행의 수"
    FROM PROD;
    
    SELECT COUNT(*) "장바구니 행의수"
    FROM CART;
    
    SELECT COUNT(*) "매입테이블 행의수"
    FROM BUYPROD;
    
    SELECT *
    FROM PROD, CART, BUYPROD;
  • ANSI CROSS 조인 형식
    SELECT COUNT(*)
    FROM PROD
    CROSS JOIN CART
    CROSS JOIN BUYPROD;

내부조인

일반 조인

SELECT [테이블명 | 별칭] 컬럼명 [AS 별칭]
                :
FROM 테이블명 [별칭], 테이블명 [별칭],...
WHERE 일반조건
AND 조인조건
  • 고유한 컬럼명인 경우 테이블 별칭을 사용하지 않아도 됨
  • 조인조건은 사용된 테이블의 수가 N개일 때 적어도 N-1개 이상이어야 함
  • 일반 조건과 조인 조건의 기술 순서는 상관없음 두 조건은 AND로 연결
  • 사용 예
    --사용 예
    --HR계정에서 급여가 15000이상인 사원을 조회하시오
    --Alias 사원번호, 사원명, 부서명, 직무명, 급여이며
    --부서코드 순으로 정렬하시오
    
    SELECT A.EMPLOYEE_ID AS 사원번호, 
           A.EMP_NAME AS 사원명, 
           B.DEPARTMENT_NAME AS 부서명, 
           C.JOB_TITLE AS 직무명, 
           A.SALARY AS 급여
    FROM HR.EMPLOYEES A, HR.DEPARTMENTS B , HR.JOBS C
    WHERE A.SALARY >= 15000 
    AND A.DEPARTMENT_ID=B.DEPARTMENT_ID
    ORDER BY A.DEPARTMENT_ID;
    --ANSI
    SELECT A.EMPLOYEE_ID AS 사원번호, 
           A.EMP_NAME AS 사원명, 
           A.DEPARTMENT_ID AS 부서코드,
           B.DEPARTMENT_NAME AS 부서명, 
           A.SALARY AS 급여
    FROM HR.EMPLOYEES A
    INNER JOIN HR.DEPARTMENTS B ON (A.DEPARTMENT_ID=B.DEPARTMENT_ID)
    WHERE A.SALARY >= 15000
    ORDER BY A.DEPARTMENT_ID;

외부조인

  • 내부조인은 공통적인 자료(적은쪽을 기준)를 기준으로 남는 자료를 무시한 결과를 반환
  • 외부조인은 자료의 종류가 많은 쪽을 기준으로 적은 쪽에 NULL 값을 갖는 행을 삽입하여 조인결과를 반환
  • 빈번한 사용은 시스템의 효율을 저하시키므로 자제하여 사용
  • 일반 외부조인에서는 조인조건을 기술할때 외부조인 연산자 ‘(+)’를 부족한 자료를 보유한 테이블의 컬럼명 뒤에 추가한다.
  • 여러 개의 조인 조건이 모두 외부조인을 수행해야 하는 경우 해당하는 조인조건 모두에 외부조인 연산자를 추가해야 함.
  • 한 테이블은 한번만 외부조인에 사용 될 수 있다. 즉, A, B, C테이블이 외부조인 되는 경우 A테이블을 기준으로 B테이블이 확장되어 조인됨과 동시에 C테이블을 기준으로 B테이블이 확장되어 조인 될 수 없다.
  • 일반 외부조인은 조인조건 이외의 조건이 부여되면 내부조인의 결과를 반환한다. 해결책으로 서브쿼리를 사용하거나 ANSI외부조인을 사용해야 함

ANSI 외부조인 형식

SELECT 컬럼기술 
              :
FROM 테이블명1 별칭1
LEFT|RIGHT|FULL OUTER JOIN 테이블2 별칭2 ON(조인조건 [AND 일반조건])
              :
[WHERE 일반조건];

'LEFT' : FROM 절의 '테이블명1'의 자료가 '테이블명'의 자료보다 많은경우 -- 행의 수가 아니다

'RIGHT' : FROM 절의 '테이블명1'의 자료가 '테이블명'의 자료보다 적은경우

'FULL' : FROM 절의 '테이블명1'의 자료가 '테이블명'의 자료가 모두 부족한 경우

profile
개발자 준비 중 입니다

0개의 댓글