본문 바로가기
DataBase

[MariaDB] 카테시안 곱(Cartesian Product) 두 개 이상의 테이블 병합 / inner join 테이블 병합 함수 / on() 테이블 병합 시 조건 추가 함수 / Column 'deptno' in field list is ambiguous 에러 / outer join 특정 테이블의 n..

by bkuk 2022. 10. 18.

카테시안 곱(Cartesian Product)이란?

 

From절에 2개 이상의 Table이 있으며, 두 Table 사이에 유효 join 조건을 적지 않았을때,

해당 테이블에 대한 모든 데이터를 전부 결합하여 Table에 존재하는 행 갯수를 곱한 만큼의 결과값이 반환되는 것이다.

 

사원정보(emp) 테이블과 부서정보(dept) 테이블을 유효 조건없이 결합해보겠습니다.

select *
    -> from emp inner join dept;

 

아래 부서번호(deptno)만 봐도 이 테이블의 정리가 필요한 것을 알 수 있습니다.

 

그렇다면, 두 테이블이 결합할 때 조건을 하나 추가해보겠습니다.

조건은 기존 테이블의 있는 부서번호(deptno)결합하는 테이블에 존재하는 부서번호같다는 조건입니다.

select *
    -> from emp inner join dept
    -> where emp.deptno = dept.deptno;


 

그렇다면, 두 테이블을 결합하는데 위와 같이 부서번호는 동일하고 부서번호가 10번인 데이터만 출력해보겠습니다.

select *
    -> from emp inner join dept
    -> where emp.deptno = dept.deptno and emp.deptno = 10;

 

위 코드는 매우 깁니다. 짧게 쓰는 방법은 on 이라는 명령어를 사용하면 됩니다. 

또한, 테이블의 별명(새 이름)을 통해 사용가능 합니다.

*별명을 사용할 때 주의할 점은 Column 'deptno' in field list is ambiguous 와 같이 에러가 발생할 수 있습니다.

이는 두 테이블의 공통으로 사용하는 컬럼명이 있으므로, 정확한 별명을 앞에서 명시해줌으로써 해결할 수 있습니다.

 

따라서 아래와 같이 명시해서 출력해주면 됩니다.

select *
    -> from emp e inner join dept d
    -> on (e.deptno = d.deptno)
    -> where e.deptno=10;

 

직책이 "Clerk"인 사원에 대한 사원번호, 사원이름, 급여, 부서위치 출력

select empno, ename, sal, loc, job
from emp e inner join dept d
on (e.deptno = d.deptno) and (job = "Clerk")
group by ename;


 

이번에는 사원정보(emp) 테이블과 호봉정보(salgrade) 테이블을 결합해보겠습니다.

select *
    -> from emp inner join salgrade;

 

두 테이블을 유효 조건없이 결합했더니 아래와 같이 출력되었습니다.

 

급여하한과 급여상한을 이용해서 조건을 추가해보겠습니다.

select *
    -> from emp e inner join salgrade s
    -> on (e.sal >= s.losal and e.sal <= s.hisal);

급여하한과 급여상한에 맞춰서 테이블이 출력된 것을 볼 수 있습니다.

 

입사년도 2011년인 사원에 대한 사원번호, 사원이름, 급여, 호봉을 출력

select empno, ename, e.sal, s.grade
from emp e inner join salgrade s
on (e.sal >= s.losal and e.sal <=s.hisal)
where hiredate like "%2011%";

 


사원번호, 사원이름, 급여, 급여등급, 부서이름, 부서위치 출력, 3개의 테이블을 결합 후 출력

select empno, ename, sal, grade, dname, loc
from emp e inner join dept d 
on (e.deptno = d.deptno)
inner join salgrade s
on (e.sal >= s.losal and e.sal <= s.hisal);


40번 부서에서 근무하는 사원의 사원이름, 직책을 출력해보겠습니다.

 

부서정보(dept) 테이블에는 부서번호 40번이 존재하는데요. 

이로써 알 수 있는 내용으로는 원이 없는 부서도 있다는 정보입니다.

 

그렇다면 사원이 없는 부서에 대한 부서번호, 부서이름, 부서위치를 출력해보겠습니다.

이때 사용할 수 있는 함수는 outer join 입니다.

예를 들어, 사원이 없는 부서, 부서가 없는 사원, 주문이 없는 상품 등 null을 처리하는 명령어라고 이해하면 쉽습니다.

또한, outer join 앞에는 left와 right가 명시되어야 합니다.

이는 해당 테이블의 데이터를 null 값을 포함해서 출력해달라는 의미입니다.

예제를 통해 알아보겠습니다.

 

사원정보 테이블의 데이터를 전부 출력해보겠습니다.

select d.deptno, d.dname, e.empno, e.ename
from emp e left outer join dept d
on (d.deptno = e.deptno);

 

부서정보 테이블의 데이터를 전부 출력해보겠습니다.

select d.deptno, d.dname, e.empno, e.ename
from emp e right outer join dept d
on (d.deptno = e.deptno);

위에서는 출력이 되지 않았던 부서번호(dept) 40번이 출력된 것을 확인할 수 있습니다.

댓글