[실무에서 바로 쓰는 SQL 기본과 SQL 튜닝][ORACLE] 10강

MinHee·2023년 5월 20일
0
post-thumbnail

JOIN

EQUI JOIN

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'; -- 검색 조건

NON EQUI JOIN

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;

OUTER JOIN

(+) : 조인 조건절에서 데이터가 모자란 쪽에 입력함

일치하는 행이 없으면 출력되지 않는 단점을 개선 - 일치하지 않아도 결과에 출력됨

출력 예시

  SELECT e.ename, d.loc, e.deptno 
  from emp e, dept d 
  where e.deptno (+) = d.deptno;

E.DEPTNO 사원테이블에 BOSTON과 일치하는 행이 없어서 출력되지 않았으므로
E.DEPTNO 칼럼에 (+)를 붙임

SELF JOIN

다른 테이블과 조인하는 것이 아닌, 한 테이블 내에서 조인

예제 61

emp 테이블

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
profile
성장하는 개발자

0개의 댓글