오늘 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 사원번호' 처럼 큰 따옴표 처리를 안 하면 오류가 발생하니 큰따옴표를 추가해야한다.
'SQL' 카테고리의 다른 글
| SQL 함수 (2) | 2025.01.16 |
|---|---|
| DDL(CREATE)+1시간 동안 오류를 못 찾은 ORA-00907: 누락된 우괄호.. (3) | 2024.12.23 |
| 함수(FUNCTION) (0) | 2024.12.18 |
| Oracle SQL과 SQL Developer 환경 구축 및 기능 (1) | 2024.12.17 |
| KH정보교육원 (국비 교육) 첫 수업 후기 (4) | 2024.12.16 |