SQL

JOIN

euicheol0910 2024. 12. 18. 17:47

오늘 INNER JOIN과 OUTER JOIN에 대해 배웠다.

 

우선, JOIN은 두 개 이상의 테이블에서 데이터를 조회하고자 할 때 사용되는 구문이며

조회 결과는 하나의 결과(RESULT SET)를 반환한다.

 

관계형 데이터베이스에서는 최소한의 데이터를 각각의 테이블에 담고 있으며 무작정 다 조회해 오는 것이 아니라 각 테이블간 연결고리(외래키)를 통해 데이터를 매칭시켜 조회해야한다.

 

JOIN은 크게 "오라클 전용구문"과 "ANSI 구문"이 있는데, 웬만하면 ANSI구문을 사용하는게 좋을 거 같다.

 

 

등가조인(EQUAL JOIN) / 내부조인(INNER JOIN)

 

우선 등가조인(EQUAL JOIN) / 내부조인(INNER JOIN)은 연결시키는 컬럼의 값이 일치하는 행들만 조회(일치하는 값이 없는 행은 조회 제외)한다.

 

오라클 전용구문은 아래와 같이 작성한다.


--FROM절에 조회하고자 하는 테이블을 나열(,구분)
--WHERE절에 매칭시킬 컬럼에 대한 조건을 제시

 

3가지의 유형으로 작성을 하는데 예시를 들면,

 

1. 연결할 두 컬럼명이 다른 경우(EMPLOYEE: DEPT_CODE/ DEPARTMENT: DEPT_ID)

 

전체 사원들의 사번,사원명,부서코드,부서명을 조회하라고 하면,

SELECT EMP_ID,EMP_NAME,DEPT_CODE,DEPT_TITLE
FROM EMPLOYEE,DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;

다음과 같이 작성하면 된다.

 

2. 연결할 두 컬럼명이 동일한 경우

 

전체 사원들의 사번,사원명,직급코드,직급명 조회하라고 할 때,

SELECT EMP_ID,EMP_NAME,J.JOB_CODE,JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;

EMPLOYEE 테이블에 있는 JOB_CODE와 JOB 테이블에 있는 JOB_CODE가 컬럼명이 같기 때문에 EMPLOYEE를 E로 별칭을 붙이고, JOB을 J로 별칭을 붙여 컬럼이 같아도 컴퓨터가 인식할 수 있도록 해준다.

 

ANSI구문은 아래와 같이 작성한다.

 

--FROM절에 기준이 되는 테이블 하나만 기술한다.
--JOIN절에 같이 조인하고자 하는 테이블 기술 + 매칭시킬 컬럼에 대한 조선
--JOIN USING / JOIN ON

 

포괄조인 / 외부조인(OUTER JOIN)


두 테이블 간의 JOIN시 일치하지 않는 행도 포함시켜 조회가능하다.단, 반드시 LEFT/RIGHT를 지정해야한다.(어떤 테이블이 기준이냐) 

SELECT EMP_NAME,DEPT_TITLE,SALARY,SALARY*12
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

다음과 같이 JOIN할 경우, 부서배치를 받지않은 2명의 사원정보가 누락되는 일이 발생한다.

 

이를 방지하기 위해 LEFT [OUTER] JOIN을 사용하는데 (괄호 안에 OUTER는 생략 가능이다.)

LEFT [OUTER] JOIN은 두 테이블 중 왼편에 기술된 테이블을 기준으로 JOIN하는 것이다. 즉, 기준을 미리 잡아놓기 떄문에 위와 같이 2명의 사원정보가 누락되는 일은 없다.

 

비등가 조인

처음에 이해를 못 했던 JOIN이다. 매칭시킬 컬럼에 대한 조건 작성 시 '='를 사용하지 않는 조인문이다. 중복되는 컬럼값이 나오지 않을경우 사용하는 '비등가'조인은, ANSI구문 사용시 JOIN ON만 사용가능하며, 범위(수치적 범위, 기간적 범위)기반조인을 구현할 때 주로 사용한다. 

 

예를 들어 사원명, 급여, 급여레벨 조회할 때,EMPLOYEE 테이블과 SAL_GRADE 테이블의 겹치는 컬럼값이 없다.

SELECT EMP_NAME, SALARY, SAL_LEVEL
FROM EMPLOYEE
JOIN SAL_GRADE ON (SALARY >=MIN_SAL AND SALARY <=MAX_SAL);

이때, 위와 같이 EMPLOYEE의 SALARY 컬럼값을 SAL_GRADE의 MIN_SAL과 MAX_SAL 사이에 해당하는 SAL_LEVEL에 연결시켜 JOIN을 시켜줄 수 있다.

 

자체조인(SELF JOIN)

자체조인도 처음에 헷갈렸던 구문인데,뜻 그대로 같은 테이블을 다시 한 번 조인하는 경우이며,

 

하나의 테이블에서 서로 다른 두 개의 행을 비교해야하는 경우 사용하며,
동일한 테이블을 조인하는 것이기 떄문에 '별칭'을 사용해서 구분해야한다.

 

SELECT E.EMP_ID 사원번호,E.EMP_NAME 사원명,E.DEPT_CODE 사원코드,
        M.EMP_ID "사수사번",M.EMP_NAME "사수의 사원명",M.DEPT_CODE "사수의 부서코드"
FROM EMPLOYEE E
LEFT JOIN EMPLOYEE M ON (E.MANAGER_ID=M.EMP_ID);

예시로,

전체 사원의 사원사번, 사원명, 사원부서코드와-------------------> E로 별칭

        사수 사번,사수의 사원명, 사수의 부서코드를 연결시켜야 할 때,--------------------------------->M으로 별칭

 

EMP_ID와 MANAGER_ID를 비교하여 부합하는 것을 찾아야한다.  그래서 E와 M으로 별칭을 나눠 자기 자신을 조인하여 MANAGER_ID와 EMP_ID가 같은 것을 찾는다. SELECT에서 조회할 컬럼들에 별칭에 맞게 앞에 E.또는 M.을 붙여 표현하며, 조인을 하게되는 M.컬럼인 애들은 'E.EMP_ID 사원번호' 처럼 큰 따옴표 처리를 안 하면 오류가 발생하니 큰따옴표를 추가해야한다.