본문 바로가기

Database

7. JOIN

JOIN이란?

- 둘 이상의 테이블을 연결하여 데이터를 검색

- 일반적으로 테이블의 식별키인 Primary Key와 공통키인 Foreign Key값을 사용하여 조인

 

JOIN의 종류

- Equi Join: 동일한 칼럼을 기준으로 조인

- Non Equi Join: 동일한 칼럼 없이 다른 조건을 사용하여 조인

- Other Join: 조인 조건에 만족하지 않는 행도 나타냄

- Self Join: 한 테이블 내에서 조인

- Inner Join: 일반적인 Join에서 ,(콤마) 대신 INNER JOIN절을 사용 → 조건을 만족하는 행만 반환

- Outer Join: 조인 조건을 만족하지 못하는 행들을 같이 조인하기 위하여 사용 조건을 만족하지 않는 행도 반환

 

 

1. Equi Join

 - 조인을 할 대상 테이블에서 공통적으로 사용하는 컬럼의 값이 일치되는 행을 연결하여 결과 생성

 - 가장 많이 사용하는 '='에 의해 조인함

-- 형식
SELECT 별칭1.컬럼명1, 별칭2,컬럼명2... 
FROM 테이블명1 별칭1, 테이블명2 별칭2
WHERE 별칭1.공통칼럼 = 별칭2.공통칼럼

예제 1: Allen의 부서명 조회 

SELECT e.ename, d.*
FROM emp_table e, dept_table d
WHERE e.deptno = d.deptno AND ename = 'ALLEN';

예제1 결과

예제 2: 뉴욕에서 근무하는 사원 정보 조회 

SELECT e.ename, e.job, e.hiredate, d.loc
FROM emp_table e, dept_table d
WHERE e.deptno = d.deptno AND d.loc = 'NEW YORK';

예제2 결과

 

2. Non EquiJoin

- 동일한 컬럼이 없이 다른 조건을 사용하여 조인 (많이 쓰이지는 않음)

- BETWWEN AND, IS NULL, IS NOT NULL, NOT IN 사용

 

예제 : 급여 grade 별 사원 정보 조회

SELECT e.ename, e.job, e.sal, s.grade
FROM emp_table e, salgrade_table s
WHERE sal BETWEEN losal AND hisal;

예제 결과

 

3. Self Join 

- 하나의 테이블에서 Equi Join

 

예제 : 각 사원들과 매니저의 이름을 합쳐서 조회 

SELECT e.ename || '의 매니저는 ' || m.ename  || '입니다'   매니저
FROM emp_table e, emp_table m
WHERE e.mgr = m.empno;

예제 결과

4. Inner Join

- 일반적인 Join

- (,)콤마 대신 INNER JOIN절 / WHERE 대신 ON절 / INNER 키워드는 생략 가능

-- 형식
SELECT 별칭1.컬럼명1, 별칭2,컬럼명2... 
FROM 테이블명1 별칭1 INNER JOIN 테이블명2 별칭2
ON 별칭1.공통칼럼 = 별칭2.공통칼럼

 예제 : 직무가 salesman인 사원들의 부서정보 조회

SELECT e.ename, e.job, d.*
FROM emp_table e INNER JOIN dept_table d
ON e.deptno = d.deptno AND e.job = 'SALESMAN';

예제 결과

 

5. Outer Join

- Equi 조인의 경우 한쪽 컬럼에만 값이 있다면 해당 행은 조회되지 못한다. (값이 이상하게 겹쳐서 나옴)

- 조인 조건을 만좃하지 못하는 행들도 같이 조회하기 위하여 Outer Join을 사용한다.

- '+' 연산자를 사용하며 조인조건을 만족하는 값이 없어도 조회하려는 쪽(한쪽에만)에 사용한다.

 

예제: King은 제일 상위 직급이기 때문에 매니저가 없다. 그래서 위의 Self Join의 예제 결과에서는 조회되지 않았는데, 

         King도 포함하여 정보를 조회할 수 있다. 

SELECT e.ename || '의 매니저는 ' || m.ename  || '입니다'   매니저
FROM emp_table e, emp_table m
WHERE e.mgr = m.empno(+);

 


ANSI 문법 

- 표준 SQL문으로 다른 DBMS에서도 사용 가능한 문법이다.

- 종류: LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN

 

예제로 사용할 테이블

 

1. LEFT OUTER  JOIN

- JOIN의 왼쪽에 오는 테이블을 모두 포함하여 조회.(오른쪽에 오는 테이블에 null이 있어도 왼쪽의 모든 행이 조회)

 

예제: 매니저가 없는 직원을 포함하여 조회(위의 그냥 outer join예제와 동일 

SELECT e.ename || '의 매니저는 ' || m.ename  || '입니다'   매니저
FROM emp_table e LEFT OUTER JOIN emp_table m
ON e.mgr = m.empno(+);

예제 결과

 

2. RIGHT OUTER JOIN 

: JOIN의 오른쪽에 오는 테이블을 모두 포함하여 조회.(왼쪽에 오는 테이블에 null이 있어도 왼쪽의 모든 행이 조회)

 

예제: Operations부서에 속하는 직원을 포함하여 조회

SELECT e.ename, e.job, d.*
FROM emp_table e RIGHT OUTER JOIN dept_table d
ON e.deptno = d.deptno 
ORDER BY e.deptno;

 

3. FULL OUTER JOIN 

: 왼쪽 오른쪽 어느쪽에 NULL값이 있더라도 포함하여 모두 출력

예제: t1_table과 t2_table 조인하기

SELECT test1_table.no NO1, test2_table.no NO2
FROM test1_table FUll OUTER JOIN test2_table
ON test1_table.no = test2_table.no;

 

'Database' 카테고리의 다른 글

9. 집합연산자  (0) 2023.05.04
8. 서브쿼리  (0) 2023.05.04
6. DML/TRANSACTION  (0) 2023.05.04
5. 단일함수/그룹함수/CASE문  (0) 2023.05.04
4. SQL언어의 종류 / SELECT / WHERE / 연산자  (0) 2023.05.04