join 조건으로 equal 조건을 부여함 (=)
일치하는 행이 없으면 결과에 출력되지 않음
예제 58) 사원 테이블과 부서테이블을 조인해서 이름과 부서위치를 출력하시오
SELECT ename, loc
from emp, dept
where emp.deptno = dept.deptno;
여기서 select절에 deptno를 추가하면 '열의 정의가 애매하다'는 오류가 출력됨
두 개의 테이블 모두 deptno라는 칼럼이 존재
SELECT emp.ename, dept.loc, emp.deptno
from emp, dept
where emp.deptno = dept.deptno;
위와 같이 테이블까지 명시를 해줘야 성능이 더 좋음.
명시를 안할 시, 모든 테이블의 칼럼을 스캔하여서 칼럼을 찾는 과정이 발생한다.
SELECT e.ename, d.loc, e.deptno
from emp e, dept d -- 테이블 별칭
where e.deptno = d.deptno;
테이블 별칭을 지정하여, SQL문을 더 간결하게 작성할 수 있음
직업이 SALESMAN인 사원들의 이름과 직업과 부서위치를 출력하시오
SELECT e.ename, e.job, d.loc
FROM emp e, dept d
where e.deptno = d.deptno -- 조인 조건
and e.job='SALESMAN'; -- 검색 조건
join 조건으로 non-equal 조건을 부여함(부등호 또는 between)
두 테이블 사이에 공통된 조건이 없더라도 조인이 가능함
예제 59) 사원 테이블과 급여 테이블을 조인하여 이름, 월급, 월급에 대한 등급을 출력하시오
SELECT e.ename, e.sal, s.grade
FROM emp e, salgrade s
where e.sal between s.losal and s.hisal; -- 조인 조건
공통된 컬럼은 없지만, 비슷한 의미를 가지는 컬럼이 있다.
emp 테이블의 sal칼럼은 salgrade 테이블의 hisal과 losal 사이에 존재한다.
급여 등급이 4등급인 사원들의 이름과 월급을 출력하는데 월급이 높은 사원부터 출력
select e.ename, e.sal
from emp e, salgrade s
where e.sal between s.losal and s.hisal -- 조인 조건
and s.grade = 4 -- 검색 조건
order by e.sal desc;
(+) : 조인 조건절에서 데이터가 모자란 쪽에 입력함
일치하는 행이 없으면 출력되지 않는 단점을 개선 - 일치하지 않아도 결과에 출력됨
SELECT e.ename, d.loc, e.deptno
from emp e, dept d
where e.deptno (+) = d.deptno;
E.DEPTNO 사원테이블에 BOSTON과 일치하는 행이 없어서 출력되지 않았으므로
E.DEPTNO 칼럼에 (+)를 붙임
다른 테이블과 조인하는 것이 아닌, 한 테이블 내에서 조인
mgr 칼럼 : 관리자의 사번 정보를 의미
SELECT 사원.ename as 사원, 관리자.ename as 관리자
from emp 사원, emp 관리자 -- emp 테이블 내부에 사원 정보와 관리자 정보가 같이 있음, 분리한다고 가정
where 사원.mgr = 관리자.empno;
예제) 관리자인 사원들보다 더 많은 월급을 받는 사원들의 데이터만 출력
SELECT 사원.ename as 사원, 관리자.ename as 관리자
from emp 사원, emp 관리자
where 사원.mgr = 관리자.empno;
and 사원.sal > 관리자.sal