본문 바로가기
개발 수업/DB

[Oracle/SQL] JOIN(CROSS JOIN ,EQUI JOIN, NON EQUI JOIN,NATURAL JOIN,INNER JOIN,OUTER JOIN,SELF JOIN)

by 오늘 하루s 2023. 6. 12.
728x90
더보기

Day29~30. 230609,230612

JOIN

두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것.

일반적으로 행들은 PK나 FK 값의 연관에 의해 JOIN이 성립된다.
어떤 경우에도 PK, FK 경우에는 관계가 없어도 논리적인 값들의 연관만으로 JOIN이 성립 가능

*카르테시안곱
*EQUI JOIN
*NATURAL JOIN
*INNER JOIN ON
*JOIN USING
*OUTER JOIN

*NON-EQUI JOIN
*SELF JOIN

 

SCOTT의 MODEL

 

CROSS JOIN ( =카르테시안 곱 )

1
2
3
select empno,ename, deptno
from emp
order by deptno asc;
cs

실행 결과

1
2
3
select deptno,dname
from dept
order by deptno asc;
cs
실행 결과

 

위의 두개 합치기, 아래 두 개의 결과 값 같음.

1
2
3
select empno,ename,dname
from emp,dept 
order by empno asc;
cs

 

1
2
3
select empno,ename,dname
from emp cross join dept 
order by empno asc;
cs

 

실행 결과(결과 뒤데 더 있음)

 

 

EQUI JOIN, NON EQUI JOIN

EQUI JOIN : 2개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용.

대부분 , PK, FK의 관계를 기반으로 함.

1
2
3
4
select e.empno,e.ename,d.dname
from emp e,dept d
where e.deptno = d.deptno 
order by e.empno asc;
cs

 

 

NON EQUI JOIN : 2개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우에 사용.
‘=’ BETWEEN, >, <= 연산자가 아닌 등 연산자 사용.

1
2
3
4
select e.empno, e.ename, e.sal , s.GRADE, s.LOSAL, s.HISAL
from emp e, salgrade s
where e.sal between s.LOSAL and s.HISAL
order by s.GRADE asc;
cs

 

 

 

 

NATURAL JOIN

두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN  수행, 

NATURAL JOIN이 명시되면 추가로 USING,  ON,  WHERE  절에서 JOIN 조건을 정의할 수 없다.

1
2
3
4
select e.empno, e.ename, deptno, d.loc, d.dname
from emp e NATURAL JOIN dept d
where e.empno >= 7500
order by d.dname asc;
cs

 

 

 

INNER   JOIN

JOIN  조건에서    동일한    값이    있는    행만 반환, 

USING이나    ON  절을    필수적으로   사용

 

INNER   JOIN ON

1
2
3
4
5
select e.empno, e.ename, d.loc, d.dname
from emp e INNER JOIN dept d
ON e.deptno = d.deptno 
where e.empno >= 7500
order by d.dname asc;
cs

 

 

JOIN    USING 

using 조건절

같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUL JOIN 할 수 있다.

1
2
3
4
select e.empno, e.ename, deptno, d.loc, d.dname
from emp e JOIN dept d USING(deptno)
where e.empno >= 7500
order by d.dname asc;
cs

 

 

ON 조건절

ON 조건절과 WHERE 조건절을 분리하여 이해하기 쉬우며,

칼럼명이 다르더라도 JOIN 조건을 사용할 수 있다는 장점이 있다.

 

 

OUTER JOIN(LEFT, RIGHT, FULL)

1
2
3
4
5
6
7
8
9
select e.empno, e.ename, e.deptno, d.deptno, d.loc, d.dname
from emp e ,dept d
where e.deptno(+= d.deptno
order by d.dname asc;
 
select e.empno, e.ename, e.deptno, d.deptno, d.loc, d.dname
from emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno
order by d.dname asc;
cs

 

1
2
3
4
5
6
7
8
9
select e.empno, e.ename, e.deptno, d.deptno, d.loc, d.dname
from emp e ,dept d
where e.deptno = d.deptno(+)
order by d.dname asc;
 
select e.empno, e.ename, e.deptno, d.deptno, d.loc, d.dname
from emp e LEFT OUTER JOIN dept d
ON e.deptno = d.deptno
order by d.dname asc;
cs

 

 

1
2
3
4
select e.empno, e.ename, e.deptno, d.deptno, d.loc, d.dname
from emp e FULL OUTER JOIN dept d
ON e.deptno = d.deptno
order by d.dname asc;
cs

 

SELF JOIN

한 테이블 내 두 칼럼이 연관 관계가 있을 때 동일 테이블 사이의 조인.

FROM절에 동일 테이블이 2번 이상 나타남. 반드시 테이블 별칭을 사용해야 함.

1
2
3
4
5
select e1.empno, e1.ename, e1.mgr "관리자번호",
       e2.empno, e2.ename
from emp e1, emp e2
where e1.mgr=e2.empno
order by e1.mgr asc;
cs

 

728x90