본문 바로가기
Programming/Oracle SQL

JOIN

SELECT E.empno, E.ENAME, E.SAL, E.DEPTNO, D.DEPTNO, D.DNAME, 
FROM EMP E, DEPT D      -- FROM에서 table을 약어로 치환
WHERE E.DEPTNO = D.DEPTNO   -- Equi JOIN 개념
ORDER BY E.EMPNO;

서로 다른 두 개의 표에서 정보를 뽑을 때 where절이 없으면 출력이 이상하게 된다.

 

서로 다른 두 표이지만 데이터가 동일하면 Equi JOIN(등가조인)을 where로 표현해서 사용

*비등가조인: equal기호 없이 사용하는 조인. 근데 실무적으로 잘 안씀

 

SELECT D.DEPTNO, D.DNAME, E.EMPNO, E.ENAME, E.SAL  -- E.DEPTNO를 또 SELECT 안해도 된다!
FROM EMP E, DEPT D
where E.DEPTNO = D.DEPTNO and SAL > 2000  -- 이 조인 구문이 이미 DEPTNO를 완성한다!
order by E.DEPTNO, E.EMPNO;  -- 문제에 따라 오름차순을 정렬해서 똑같이 출력!

SELECT D.DEPTNO, D.DNAME, TRUNC(AVG(E.SAL)) as AVG_SAL,  -- TRUNC없으면 지저분하게 SAL출력됨
MAX(E.SAL) as MAX_SAL, MIN(E.SAL) as MIN_SAL, COUNT(*) as CNT
FROM EMP E, DEPT D
where D.DEPTNO = E.DEPTNO
group by d.deptno, D.DNAME;   -- 이 부분 없으면 출력오류 생김

 

 

 

 

 

 

 

*자체 조인(Inner join): 하나 테이블을 여러 테이블처럼 사용 ex) FROM EMP E1, EMP E2 where E1.MGR = E2.EMPNO;

 

 

근데 데이터 형식은 같으나 다른 한쪽 표에는 또 다른 추가 범위에 대한 데이터가 있다면?

 

-> OUTER JOIN (외부 조인)

WHERE 조건문에 조인을 적용하는 공식: (+)를 오른쪽에 붙이면 LEFT, 오른쪽에 붙이면 RIGHT. (서로 반대 이름이구나!)

단 ORACLE에는 FULL JOIN 개념이 없다. 무조건 한 쪽 기준을 맞춰야 한다.

 

 

[조인 개념 차이]

LEFT OUTER JOIN

 

SELECT D.DEPTNO, D.DNAME, E.EMPNO, E.ENAME, E.JOB, E.SAL
FROM DEPT D, EMP E
where D.DEPTNO = E.DEPTNO(+)   -- DEPTNO기준으로 OPERATIONS DNAME 살림
ORDER BY D.DEPTNO, E.ENAME;    -- 결과에 맞게 정렬

 * developer 프로그램은 null 표시 나오지만 prompt에서는 공백으로 나온다.

 

 

 

 

 

 

 

 

 

==== JOIN 총 정리 ===
== EQUI JOIN(동등 조인)
SELECT E.*, D.*
  FROM EMP E, DEPT D
WEHRE E.DEPTNO = D.DEPTNO


SELECT E.*, D.*
  FROM EMP E INNER JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)

 

SELECT E.*, D.*
  FROM EMP E JOIN DEPT D ON USING (DEPTNO) => X

 


===LEFT OUTER JOIN
SELECT E.*, D.*
  FROM EMP E, DEPT D
WEHRE E.DEPTNO = D.DEPTNO(+)

 

SELECT E.*, D.*
  FROM EMP E LEFT OUTER JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)  

 

 

 

===RIGHT OUTER JOIN
SELECT E.*, D.*
  FROM EMP E, DEPT D
WEHRE E.DEPTNO(+) = D.DEPTNO

 

SELECT E.*, D.*
  FROM EMP E RIGHT OUTER JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)

 

 

===RIGHT OUTER JOIN
SELECT E.*, D.*
  FROM EMP E, DEPT D
WEHRE E.DEPTNO(+) = D.DEPTNO

 

 

===FULL OUTER JOIN
ORACLE X
SELECT E.*, D.*
  FROM EMP E FULL OUTER JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)

 

 

===NATURAL JOIN   (거의 안씀)
SELECT E.*, D.*
  FROM EMP E, DEPT D

 

SELECT E.*, D.*
  FROM E NATURAL JOIN D

728x90
반응형

'Programming > Oracle SQL' 카테고리의 다른 글

DML and DCL (Data Manipulation, Control Language)  (0) 2023.08.25
Subquery  (0) 2023.08.25
다중행 함수, GROUP BY, HAVING  (0) 2023.08.24
Oracle Functions  (1) 2023.08.23
기본 이론, 명령어 (table 관리), constraint, SELECT  (0) 2023.08.23