조인 Join
두 개 이상의 테이블을 결합하여 정보를 추출하는 것.
서브 쿼리도 비슷한 기능을 하지만 조인이 조금 더 포괄적인 개념이다.
select*from dept, emp;
from 뒤에 연결시킬 테이블들을 나열하면 되지만, 단순 나열만으로는 제대로 된 값을 얻어올 수 없다.
위 SQL문의 결과물...
dept의 로우 데이터가 4개, emp의 로우 데이터가 14개 이므로4*14, 총 56개의 로우 데이터가 나온다. 의미있는 데이터라고 볼 수 없다.
Q. SCOTT 사원이 소속된 부서명을 출력할 때
여태까지 배운 것만 활용한다면 두 줄의 SQL문을 작성해야 한다.
그리고 각각의 테이블이 나올 뿐, 하나의 자료라고 볼 수 없다.
select deptno from emp where ename='SCOTT'; -- 20
select dname from dept where deptno=20; -- research
이 때, 조인을 이용하면 보다 유의미한 데이터 출력이 가능하다.
1. 등가조인 (Equi Join)
두 테이블에 동일한 컬럼이 있을 때 이것을 기준으로 조인한다.
select*from dept, emp where dept.deptno = emp.deptno and ename='SCOTT';
결과물
emp, dept 이 두 테이블에 존재하는 공통 컬럼이 있다. deptno인데, 이 컬럼을 기준으로 두 테이블을 연결한다.
그것을 SQL문으로 표현할 때, 테이블1이름.공통컬럼명 = 테이블2이름.공통컬럼명 으로 쓴다.
위 SQL문에서는 dept.deptno = emp.deptno 으로 표현했다.
2. 비등가조인 (Non-Equi Join)
두 테이블에 동일한 컬럼없이 다른 조건을 사용하여 조인한다.
emp 테이블과 salgrade 테이블 사이에는 동일한 이름을 가진 컬럼이 없다.
emp에는 sal 컬럼에 급여 정보가 저장되어 있고,
salgrade에는 등급에 따른 급여 하한선과 상한선이 저장되어 있다.
이 때, 각 사원에게 등급을 부여하려면 다음과 같이 SQL문을 작성한다.
select ename, sal, grade from emp e, salgrade s where sal >= losal and sal <= hisal;
비교 연산자는 between 낮은값 and 큰값 으로도 대체 가능하다.
select ename, sal, grade from emp, salgrade where sal between losal and hisal;
결과물
3. 셀프조인 (Self Join)
한 개의 테이블 내에서 컬럼과 컬럼 사이의 관계를 이용하여 조인
emp 테이블의 사원번호(empno) 컬럼과 직속상관(mgr) 컬럼의 정보로 셀프조인,
각 사원들의 사원명, 직속상관을 출력하는 SQL문을 작성할 수 있다. (~의 사원은 ~이다.)
select employee.ename || '의 상사는 ' || manager.ename
from emp employee, emp manager
where employee.mgr = manager.empno;
서로 연관 시킬 칼럼에 각각의 별칭을 부여하여 조인시킬 수 있다.
별칭.컬럼명 으로 별칭을 부여한다.
결과물
그런데, emp 의 로우 데이터는 총 14개인데 결과물에는 13개의 로우 데이터가 있다.
이유는 KING 사원의 직속상관 값이 null 이기 때문이다.
4. 외부조인 (Outer Join)
조인 조건을 만족하지 않는 데이터를 출력해주는 조인.
1) 테이블을 조인할 때, 어느 한 쪽의 테이블에는 존재하지만 다른 한 쪽의 테이블에는 데이터가 존재 하지 않을 수도 있다. (null) 이 때, 데이터가 출력되지 않는 문제가 발생하는데, 이 문제를 해결하기 위한 조인 방법이다.
2) 정보가 부족한 곳에 (+)를 추가한다. 그러면 null을 포함한 데이터도 출력된다.
select employee.ename || '의 상사는 ' || manager.ename
from emp employee, emp manager
where employee.mgr = manager.empno(+);
셀프조인의 코드와 똑같은데 가장 마지막에 (+)를 추가한 것 뿐이다.
결과물
또 다른 예제로, 다음과 같이 emp 테이블과 dept 테이블을 놓고 보면,
dept 테이블에는 부서번호가 40번까지 등록되어 있다. 그런데 emp 테이블에는 40번 부서에 근무하는 직원이 없다.
다음과 같이 등가조인을 이용한 SQL문을 입력하면 사원의 이름과 부서번호, 부서명이 출력된다.
select ename, d.deptno, dname from dept d, emp e where d.deptno = e.deptno order by deptno;
40번 OPERATIONS 부서 소속 직원이 없기 때문에 정보는 나타나지 않는다.
where 문 끝에 (+)를 추가해준다. 문장의 가장 끝이 아닌, 정보가 부족한 쪽에 해야 한다.
select ename, d.deptno, dname from dept d, emp e where d.deptno = e.deptno (+) order by deptno;
결과물
비록 40번 부서 소속 직원이 없어 사원명은 null로 뜨지만, 부서에 대한 정보는 출력되었다.
'오라클 데이터베이스' 카테고리의 다른 글
DQL> Select - 서브 쿼리 (0) | 2022.07.27 |
---|---|
DQL> Select - ANSI Join (Cross, Inner, Natural, Outer) (0) | 2022.07.25 |
DQL> Select - Where 조건절, 비교 연산자, 논리 연산자, Between and, In, Like와 와일드카드, Null 연산을 위한 Nvl, Order by 절 (오름차순, 내림차순 정렬) (0) | 2022.07.20 |
DQL> SELECT의 기본 사용, DISTINCT, COUNT (0) | 2022.07.19 |
테이블 생성, 값 입력, 수정, 삭제 (0) | 2022.07.14 |