SQL의 기본 문법은 다음 글 참조.

Join

  • join은 관계형 DB에서 기본이자 가장 중요한 기능이다.
  • 두 개 이상의 테이블을 묶어 데이터를 추출하는 기능.
  • 관계형 DB에서 join을 이용하여 서로 다른 테이블 간의 원하는 정보를 얻을 수 있음.

  • emp 테이블: 직원의 이름, 직원 번호, 직무, 부서 넘버에 대한 정보가 담겨져 있는 테이블
  • dept 테이블: 부서 넘버에 맞는 부서 이름, 위치가 담겨져 있는 테이블

emp 테이블에는 부서 넘버가 존재한다. 하지만 부서 이름과 부서 위치가 명시되어있지 않는다. 만약 emp 테이블에 있는 직원 정보를 포함한, 그에 맞는 부서의 이름과 위치까지 알고 싶다면 join을 이용하여 새로운 테이블을 생성한다.

emp 테이블은 deptno 기준으로 value가 unique하지 않은 M집합이다. dept 테이블은 deptno 기준으로 value가 unique한 1집합이다. deptno 기준으로 join시, 즉 1:M 조인 시 나오는 결과는 M집합이 된다.

예시


실습

실습은 DBeaver에서 ProgreSQL을 사용하여 진행한다.

현재 hr 스키마에 dept, emp, emp_dept_hist, emp_salaray_hist, salgrade 총 5개의 테이블가 있다.

스키마의 다이어그램 보기를 누르면 다음과 같이 ERD로 시각적으로 확인할 수 있다.

직원 정보와 직원이 속한 부서명을 가져오기
-- 직원 정보와직원이 속한 부서명을 가져오기.

select a.*, b.dname
from emp as a 
	join dept as b on a.deptno = b.deptno 

위 코드에서 hr이라는 스키마가 defalut로 설정했으므로 hr은 생략이 가능하다. emp as a라는 그룹과 dept as b 라는 그룹을 join할건데, a의 deptno와 b의 deptno를 기준으로 합친다. 합친 것 중, a의 모든 컬럼과 b의 dname을 추출한다는 의미이다.

실행 결과

job이 SALESMAN인 직원정보와 직원이 속한 부서명 가져오기.

select a.*, b.dname 
from emp as a join dept as b on a.deptno = b.deptno where a.job = 'SALESMAN'

실행 결과

부서명 SALES와 RESEARCH의 소속 직원들의 부서명, 직원번호, 직원명, JOB, 과거 급여 정보 추출

-- 부서명 SALES와 RESEARCH의 소속 직원들의 부서명, 직원번호, 직원명, JOB, 과거 급여 정보 추출

select b.dname, a.empno, a.ename, a.job, c.sal 
from emp as a
join dept as b on a.deptno = b.deptno 
join emp_salary_hist as c on a.empno = c.empno 
where b.dname in ('SALES', 'RESEARCH')

실행 결과

부서명 SALES와 RESEARCH의 소속 직원들의 부서명, 직원번호, 직원명, JOB 그리고 과거 급여 정보중 1983년 이전 데이터는 무시하고 데이터 추출

-- 부서명 SALES와 RESEARCH의 소속 직원들의 부서명, 직원번호, 직원명, JOB 그리고 과거 급여 정보중 1983년 이전 데이터는 무시하고 데이터 추출 

select b.dname, a.empno, a.ename, a.job, c.sal 
from emp as a
	join dept as b on a.deptno = b.deptno 
	join emp_salary_hist as c on a.empno = c.empno 
where b.dname in ('SALES', 'RESEARCH') 
and c.fromdate  >= to_date('1983-01-01', 'yyyy-mm-dd') 
order by c.fromdate ASC

실행 결과

인프런 강의

profile
노력하는 개발자

0개의 댓글