Cracking Code

SQL - JOIN (ORACLE) 본문

Database

SQL - JOIN (ORACLE)

CrackCo 2020. 7. 19. 16:47
검색하고자 하는 컬럼이 두 개 이상 테이블에 존재할 때 사용할 수 있는 기술이 있습니다.
JOIN에 대해서 알아봅시다.

기본적인 오라클의 JOIN의 종류는 아래와 같습니다.

1. Cartesian Product
2. Equi Join
3. Non-Equi Join
4. Outer Join
5. Self Join

일반적으로 기본키 or 외래키를 사용하여 두 테이블을 합칩니다.

한 컬럼을 기준으로 JOIN 할 때 모호성이 발생하므로 테이블명이나 별칭을 컬럼 앞에 씁니다.

-- 모호성 해결
SELECT ENAME, EMP.DEPTNO,
	DNAME, LOC
-- DEPTNO는 DEPT 테이블에도 존재하므로
-- EMP의 DEPTNO를 출력하겠다고 명시
FROM EMP, DEPT;

 

1. CARTESIAN PRODUCT

모든 가능한 행들의 JOIN입니다.

A 테이블의 각 행마다 B 테이블의 모든 행들을 연결시켜 출력합니다.

그러므로 출력되는 행은 N x M의 갯수를 출력합니다.

보통 조인 조건이 생략되거나 잘못된 경우 출력됩니다.

 

사원 테이블과 부서 테이블을 JOIN하여 사원 이름, 직업, 부서 번호, 이름, 장소의 카테시안 프로덕트를 출력해봅시다.

SELECT EMPNO, ENAME, JOB,
	DEPT.DEPTNO, DNAME, LOC
FROM EMP, DEPT
ORDER BY EMPNO;

사원의 행마다 부서 테이블의 모든 행들이 연결되어 출력되는 것을 확인할 수 있습니다.

 

2. EQUI JOIN

SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column;

조인 조건에서 = 문자를 사용하여 값들이 정확하게 일치하는 경우 사용합니다.

단순 조인 또는 내부 조인이라고도 합니다.

또한 테이블이 별칭(Alias) 적용할 수 있고 적용 시 SELECT과 WHERE 절에서 Alias를 사용해야 합니다.

 

사원과 부서 테이블에서 사원의 번호, 이름, 부서의 지역을 출력해봅시다.

SELECT EMPNO, ENAME, LOC
FROM EMP e, DEPT d
WHERE e.DEPTNO = d.DEPTNO;

 

3. NON-EQUI JOIN

두 개의 테이블에 공통 컬럼이 없는 조인입니다.

한 테이블의 값을 이용하여 다른 테이블의 값을 지정할 때 사용합니다.

보통 부등 연산자를 조인 조건으로 사용합니다.

 

사원 테이블에서 부서 번호가 10인 사원의 번호, 이름, 업무, 급여, 급여의 등급, 하한 값, 상한 값을 출력해봅시다.

SELECT EMPNO, ENAME, JOB, SAL,
	GRADE, LOSAL, HISAL
FROM EMP, SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL
	AND DEPTNO = 10;

 

4. OUTER JOIN

조인 조건을 만족하지 못하는 행들은 출력이 안 되지만 그러한 행들을 보기 위해 사용하는 조인입니다.

데이터 값이 조건에 만족하지 않아 누락된 행들까지 보여줍니다.

조건절에서 컬럼 뒤에 (+) 연산자를 사용합니다.

(+) 연산자는 정보가 없는 테이블에 NULL 행을 생성하여 조인하도록 도와줍니다.

 

사원 테이블과 부서 테이블에서 사원의 정보와 부서 정보를 OUTER 조인하여 출력해봅시다.

SELECT EMPNO, ENAME, JOB, e.DEPTNO,
	d.DEPTNO, DNAME, LOC
FROM EMP e, DEPT d
WHERE e.DEPTNO(+) = d.DEPTNO;

40번 부서에 소속되어 있는 사원은 없지만 (+) 연산자를 사용해 NULL로 채운 모습입니다.

 

5. SELF JOIN

특정 테이블 자신을 자신이 JOIN 하는 방법입니다.

ex) 각 종업원의 관리자를 찾을 때

반드시 Alias를 사용하여 조인해야 합니다.

 

사원 테이블에서 SELF JOIN 하여 관리자를 출력해봅시다.

SELECT e1.ENAME 사원, e2.ENAME 관리자
FROM EMP e1, EMP e2
WHERE e1.MGR = e2.EMPNO;

'Database' 카테고리의 다른 글

SQL - SUB QUERY  (0) 2020.07.19
SQL - JOIN (ANSI)  (0) 2020.07.19
SQL - GROUP BY, HAVING  (0) 2020.07.19
SQL - SUM, AVG, MAX, MIN, COUNT  (0) 2020.07.19
SQL - DECODE  (0) 2020.07.19
Comments