데이터베이스 - join

조인(join)

우리가 데이터를 저장할 때 관계형 데이터베이스를 활용하여 저장하였다. 따라서 원하는 데이터를 가져오기 위해서는 여러 개의 테이블을 참조하여 원하는 정보를 뽑아내야 한다. 이렇게 여러 테이블을 참조하여 검색하는 것을 조인이라고 한다. 그리고 이 때 칼럼명은 중요하진 않다(뒤에서 배우겠지만, 조건절을 이용하여 서로 다른 칼럼명에 대해서도 데이터를 참조할 수 있다).

product는 양쪽 테이블을 곱한다는 의미이다. 그리고 여기엔 Equi join, Non-Equi join, Outer join, self join이 있다.
  • Cartesian Product

첫 번째 테이블의 모든 행들이 두 번째 테이블의 모든 행들과 join되는 경우이다. 이 때 행의 개수로 보았을 때 두 테이블의 행 개수를 곱한 것과 같다.

간단하게 예시를 들어보도록 하겠다. emp 테이블과 dept 테이블의 개수는 각각 4개, 12개이다. 이 두가지를 join을 사용한다면 다음처럼 4*12인 48개가 선택된다.



데이터를 살펴보면, 다음처럼 앞 테이블에 뒷 테이블의 내용이 순서대로 들어오고 있다.



이제 조건절을 사용하여 여러 테이블로부터 원하는 정보만을 가져오도록 하겠다. 먼저 join에는 조건절의 내용에 따라 equi 조인, non-equi 조인, outer 조인, self 조인이 존재한다.


먼저 ‘=’ 연산자를 사용하는 equi 조인을 살펴보자.

  • Equi 조인

equi 조인의 기본 형태는 다음과 같다.

select empno, ename, dname
from emp, dept
where emp.deptno = dept.deptno;

기본적인 select문과 비슷하다. 하지만 emp에서의 deptno와 dept의 deptno가 동일하다는 조건절을 사용하고 있다. 기존의 select문에서는 한 테이블에 대해서 조건을 주었다면, 이번엔 두 테이블의 칼럼을 사용하여 조건을 걸고 있다.

간단하게 직원 테이블에서 부서 테이블로부터 부서명 필드를 가져오도록 하자. 이를 위해서 부서 테이블의 부서번호와 직원 테이블의 부서번호가 동일한 데이터들에 대해 가져오도록 조건을 걸어 equi 조인을 수행하고 있다.


그리고 조인문을 작성할 때는 각 테이블의 요소에 대해서 “테이블.칼럼명”  형태로 select할 요소를 작성해주어야 한다.

아래 예시를 살펴보면, emp 테이블의 요소인지 dept 테이블의 요소인지를 표시하고 있다.


하지만 이 경우 타이핑의 양이 많아지기 때문에 다음처럼 축약형을 사용하여도 된다. 각 테이블을 축약형으로 선언하여 이를 통해 기존 테이블 이름을 대체할 수 있다.


게다가 두 테이블의 칼럼 명이 겹치지 않을 때는 그냥 써도 사실 상관없다.

물론 칼럼명이 겹칠 경우 이렇게 사용하게 되면 오류를 호출하기 때문에 조심해야 한다.

이 때는 소속을 밝힘으로써 오류를 해결해주자.

또한, and 연산자를 사용해서 조인한 테이블에서도  조건을 적용시켜 원하는 데이터의 범위를 더욱 좁힐 수 있다. 다음 예시에서는 기존 예시로 검색한 조인 테이블에서 직원번호가 7698인 직원에 대해서만 데이터를 검색하도록 조건을 추가하고 있다.



다음은 ‘=’ 연산자가 아닌 >, <와 같은 다른 연산자들을 사용하여 join문을 작성해보자. 이 경우를 non - equi 조인이라고 말한다.

  • non-equi

예시를 통해 non-equi 조인을 어떻게 사용할지 살펴보자. 먼저 직원 테이블과 호봉 테이블을 검색해보자. 이 때 각 직원들의 호봉까지 한 테이블에서 검색하고 싶다.

이를 위해서 non-equi 조인을 사용하겠다. 문법의 형태는 equi조인과 동일하지만 <, >를 사용하고 있다.

그리고 이는 앞에서 다뤘던 between을 사용해서 더 간단하게 만들어줄 수 있다.


문제
7839번 사원의 사원이름, 부서명, 부서위치, 급여, 호봉 sql 작성


  • 3개의 테이블을 연결하는 equi-join문을 만든다.
  • 해당 join 테이블에서 사원번호가 7839라는 조건을 추가한다.

댓글

이 블로그의 인기 게시물

데이터베이스 PL/SQL - 배열과 테이블

데이터베이스 PL/SQL 변수선언

데이터베이스 PL/SQL 제어문 - 반복문