Web develop/SQL

[SQL/ORACLE] ORACLE JOIN & ANCI JOIN

ForA 2019. 6. 15. 20:33
728x90

ORACLE JOIN

CROSS JOIN

특정한 조건(WHERE)을 주지 않는다면 조인시 각 테이블이 갖는 행의 수를
곱한 형태의 결과가 출력

SELECT ename, dname FROM emp,dept;--> 결과행 56행

EQUI JOIN

조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치하는 행을
WHERE로 연결하여 결과를 생성하는 조인

SELECT ename, sal, loc FROM emp, dept 
WHERE emp.deptno = dept.deptno and loc ='NEW YORK';

SELECT ename, TO_CHAR(hiredate,'yyyy/mm/dd') hiredate, dname FROM emp, dept
WHERE emp.deptno = dept.deptno and dname = 'ACCOUNTING';

SELECT ename, dname, job FROM emp, dept 
WHERE emp.deptno = dept.deptno and job='MANAGER';

NON-EQUI JOIN

특정 범위 내에 있는 값을 조회하기 위해 (대소)비교연산자 사용

SELECT empno, ename, sal, grade, dnameFROM emp, dept, salgrade
WHERE ename = 'ALLEN' AND emp.deptno = dept.deptno 
AND sal between losal AND hisal ORDER BY sal;

SELF JOIN

마치 같은 테이블이 두개인 것처럼 자기 자신테이블과 조인하는 것

SELECT e1.empno, e1.ename, e1.sal,e1.mgr, e2.ename FROM emp e1,emp e2 
WHERE e1.ename='SCOTT' and e1.mgr = e2.empno;

SELECT e1.ename, e2.ename FROM emp e1, emp e2
WHERE e1.ename = 'SCOTT' ande1.deptno = e2.deptno;

OUTER JOIN

테이블 조인 중 한쪽테이블에 존재하지 않는 데이터로 인해서 출력되지 않는 행을 출력하고 싶을 때 사용'(+)' 기호 사용

(전체사원)각 사원의 이름과 그 사원의 직속 상사이름을 출력하시오
SELECT e1.ename 사원명, e2.ename 직속상사명 FROM emp e1, emp e2 
WHERE e1.mgr = e2.empno(+);

ANSI JOIN (9i부터)

=> DBMS 종류와 상관없이 실행되는 표준 조인

ANSI Cross JOIN

SELECT empno, ename, dname FROM emp CROSS JOIN dept;

ANSI Inner Join

  • 테이블 사이에 inner join 사용

  • 동등 조건식 ON(조건절) 뒤에 사용 (생략불가)

  • WHERE절 추가하는 것 가능

  • ON절에 동등비교와 추가적인 조건식을 기술 가능

  • USING(공통컬럼명) //ON절 대신 사용
    단, USING절 사용시 특정 테이블이 아닌 USING절에서 정의한 deptno 컬럼명만 사용

    SELECT empno, ename, dname FROM emp INNER JOIN dept ON emp.deptno = dept.deptno;
    
    SELECT empno, ename, dname FROM emp INNER JOIN dept ON emp.deptno = dept.deptno  
    WHERE ename = 'JAMES';
    
    SELECT empno, ename, dname FROM emp INNER JOIN dept USING(deptno);  
    SELECT empno, ename, emp.deptno, dname FROM emp INNER JOIN dept USING(deptno);  
    --에러발생

NATURAL JOIN

  • 두 테이블이 갖는 컬럼중 공통된 이름의 컬럼을 동등조건해줌
    SELECT empno, ename, dname FROM emp NATURAL JOIN dept;  
    SELECT empno, ename, dname FROM emp NATURAL JOIN dept WHERE ename = 'ADAMS';

ANSI OUTER JOIN

  • 조건에 맞지 않아도 해당하는 행을 출력하고 싶을 때 사용

  • LEFT OUTER JOIN: 조인문의 왼쪽에 있는 테이블의 모든 결과를 가져 온 후
    오른쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL로 표시

  • 조건절은 ON 사용

  • LEFT RIGHT FULL 사용시 OUTER 생략가능

    FROM 테이블명1 (LEFT | RIGHT | FULL) [OUTER] JOIN 테이블명2