Oracle SQL 강좌
Equi Join, Non_Equi Join, Self Join 82 32 99,999+

by 구루비 조인 EQUI JOIN NON_EQUI JOIN SELF JOIN 셀프조인 등가조인 CARTESIAN PRODUCT NATURAL JOIN CROSS JOIN INNER JOIN [2002.01.20]


조인(Join)

Join 이란?
  • - 둘 이상의 테이블을 연결하여 데이터를 검색하는 방법 이다.
  • - 보통 둘 이상의 행들의 공통된 값 Primary KeyForeign Key 값을 사용하여 조인 한다.
  • - 두 개의 테이블을 SELECT문장 안에서 조인 하려면 적어도 하나의 컬럼이 그 두 테이블 사이에서 공유 되어야 한다.

Join 방법과 방식
  • - 조인의 방법 : Equi Join (등가 조인, 내부조인) , Non-Equi Join , Self Join , Outer Join
  • - 조인의 방식 : Nested Loop Join, Sort Merge Join, Hash Join

Equi Join

  • - 가장 일반적으로 사용하는 Equality Condition(=)에 의한 조인이다
  • - Equi join의 성능을 높이기 위해서는 Index 기능을 사용하는 것이 좋다.
-- dept 테이블과 emp 테이블을 조인하는 예제
SELECT e.empno, e.ename, d.dname
  FROM dept d, emp e
 WHERE d.deptno = e.deptno;

콤마(,) 대신 INNER JOIN을 사용 할 수 있으며, INNER는 생략 가능하다. Join 조건은 ON 절에 온다.

-- INNER JOIN절을 이용하여 조인하는 예제
SELECT e.empno, e.ename, d.dname
  FROM dept d 
 INNER JOIN emp e
    ON d.deptno = e.deptno;

NATURAL JOIN을 사용 하면 동일한 컬럼을 내부적으로 모두조인 하므로, ON절이 생략 가능하다.

-- NATURAL JOIN절을 이용하여 조인하는 예제
SELECT  e.empno, e.ename, d.dname
  FROM  dept d 
NATURAL JOIN emp e;

NATURAL JOIN의 단점은 동일한 이름을 가지는 칼럼은 모두 조인이 되는데, USING 문을 사용하면 컬럼을 선택해서 조인을 할 수가 있다.

-- JOIN~USING절을 이용하여 조인하는 예제
SELECT e.empno, e.ename, deptno 
  FROM emp e 
  JOIN dept d 
 USING (deptno);

Non-Equi Join

  • - 테이블의 어떤 column도 Join할 테이블의 column에 일치하지 않을 때 사용하고, 조인조건은 동등( = )이외의 연산자를 갖는다.
  • - BETWEEN AND, IS NULL, IS NOT NULL, IN, NOT IN
  • - 거의 사용하지 않는다
-- emp 테이블과 salgrade 테이블의 Non-Equi Join 예제
SELECT e.ename,e.sal,s.grade
  FROM emp e, salgrade s
  WHERE e.sal 
BETWEEN s.losal 
    AND s.hisal;

ENAME             SAL      GRADE
---------- ---------- ----------
SMITH             800          1
JAMES             950          1
ADAMS            1100          1
...

Self Join

  • - Equi Join과 같으나 하나의 테이블에서 조인이 일어나는 것이 다르다.
  • - 같은 테이블에 대해 두 개의 alias를 사용하여 FROM절에 두 개의 테이블을 사용하는 것 처럼 조인한다.
-- 사원의 매니저명을 조회하는 Self Join 예제
SELECT e.ename, a.ename "Manager"
  FROM emp e, emp a
 WHERE e.empno = a.mgr;

ENAME     Manager
------- ----------
FORD      SMITH
BLAKE     ALLEN
BLAKE     WARD
KING      JONES
...

Cartesian Product
  • - 검색하고자 했던 데이터뿐 아니라 조인에 사용된 테이블들의 모든 데이터가 반환 되는 현상
  • - Cartesian Product는 조인 조건을 정의하지 않은 경우 발생한다.
  • - 테이블의 개수가 N이라면 Cartesian Product를 피하기 위해서는 적어도 N-1개의 등가 조건을 SELECT 문안에 포함시켜야 하며 각 테이블의 컬럼이 적어도 한번은 조건절에 참조되도록 해야 한다.
  • - CROSS JOIN을 이용하면 Cartesian Product 값을 얻을 수 있다.
-- CROSS JOIN절을 이용하여 Cartesian Product 값을 얻는 예제
SELECT  e.empno, e.ename, d.dname
  FROM  dept d CROSS JOIN emp e;

56 개의 행이 선택되었습니다.

참고링크

- 강좌 URL : http://www.gurubee.net/lecture/1020

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by goguy [2004.05.08 16:37:50]
Non_equijoin에 검색순서
위의 예제에서 살펴봅니다.
SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.sal BETWEEN 3000 AND 4000;
1.from
2.where
3.select
1.에서 두개의 e, d 테이블이 검색되고
2.조건에 의해서 e테이블은 그대로 d테이블은 검색조건에 맞게 테이블이 재조정
3.에 의해서 결과가 뿌려지는데 공유되는 컬럼이 없기때문에
e테이블의 컬럼갯수 * d테이블의컬럼갯수 에의한 결과값이 만들어짐.

by goguy [2004.05.26 21:15:30]
Non-equijoin은 "RDB"에서 필요가 있는 걸까여..
JOIN 하는 이유는 무엇일까여..
DB설계시 테이블마다 효율적인 관계(PRIMARY_KEY, FOREIGN_KEY)를 맺을 수 있게 설계를 하는 것이 중요하겠지요

by smile [2005.11.09 20:01:33]
퍼갑니다.

by 이휴~ [2006.03.03 17:38:09]
헷갈려 헷갈려

by oracle [2006.03.20 15:19:13]
저기 카티션 곱 설명 부분에 철자 수정이요 retrun -> return

by 명 [2006.03.21 23:57:02]
좋은 내용입니다. 막 실습 다 해봤습니다.

그런데 아직 예명을 쓰는 이유를 모르겠네요.

예명 안써도 결과물엔 아무런 변화가 없을텐데요.

특별한 이유가 있나요?

by 음 [2006.04.17 19:21:33]
두 테이블에 같은 속성의 이름이면 구분할 수가 없어서 그런거 아닌가요..

by 까비르 [2006.05.12 09:43:47]
저거야 간단한 소스이지만.. from 절에 많은 테이블 이 지정이된다면...
그거 일일이 다써줄순없잖습니까 ㅎㅎ~

by 오라클 [2006.06.01 11:12:34]
ㅇㅇ저도 그렇게 생각합니다. ㅎㅎ
관리자님 정말 수고하십니다!! 감사합니다.

by ora [2006.06.19 17:14:46]
그렇게 배운거 같습니다.
학교에서... select문이 늘어나면 늘어날수록
긴 테이블명을 일일이 적는것이..-_-;;
그래서 쓰는 경우가 많다는...ㅎㅎ^^ 암튼 관리자님 지대 고맙습뉘??!

by 제임스 [2007.02.16 17:18:22]
감사감사

by 초보자 [2007.04.18 15:51:33]
self join을 쓰는 경우가 있나요?

by 초보자 [2007.04.18 15:55:22]
self join을 쓰는 경우가 있나요?
위에 예를 든,
==================================================
SELECT concat(a.ename,' ') ||' : \'|| b.sal 급여
FROM emp a, emp b
WHERE a.empno = b.empno
==================================================
SELECT 구문은 다음과 같던데.....
==================================================
select concat(ename, ' ') ||':\'|| sal 급여
from emp;
==================================================

굳이 self join을 할 경우가 있나요?
self join이 결국은 자기 자신을 모든 컬럼이 될거 아닌가요?
궁금점 1. 실업무에서 self join 할 경우가 있나요?
2. self join이을 하는 이유?(index가 걸려서 빠르다든지...등등)

by 샹지 [2007.05.03 15:42:24]
SELECT concat(a.ename,' ') ||' : \'|| b.sal 급여
이 문장 해석 하기 힘들어요 ㅠㅠ 해석좀 해주셔요

by 와니 [2007.05.11 15:12:07]
concat(a.ename,' ') -> 문자조작함수 ename 데이터뒤에 공백을 주고..
|| -> 이건 문자를 연결, 급여는 예명 이런식 아닐까요? 저도 MSSQL하다 와서리..

by 와니 [2007.05.11 15:14:10]
그래서 결과는 급여
a.ename :\b.sal
이렇게 나오는것 같네요.

by 정순표 [2007.06.21 16:27:11]
정순표 : \ 10000
출력시 이렇게 나옴니다..

by 황관홍 [2007.07.04 17:27:37]
('' 나옵니다. 이게 맞는 말입니다.. 캬캬캬캬!!

by 왕초보 [2007.07.20 21:40:38]
위의 Self Join 예제보다는, EMP 테이블에 manager란 컬럼이 있고 여기에 상관의 emp_id가 들어간다면, 상관의 이름을 출력하기 위해서는 Self Join을 해야 하죠.

즉, select a.emp_name, b.emp_name "Manager"
from emp a, emp.b
where a.manager = b.emp_id;

저도 배우는 중이라 틀린 게 있으면 수정해주세요~

by 엘리 [2007.09.19 15:43:51]
Self Join은 구현은 해보지 않았지만 트리 구조 구현시 실무에서 사용을 하더군요.
코드 값, 상위 코드 값 뭐 이런 컬럼이 있다면 이 테이블을 셀프 조인하여 사용하더군요...^^;

by 나야나 [2007.09.22 10:07:19]
SELF JOIN 자주는 안쓰지만 간혹 씁니다. 저 같은경우 DB MIGRATION 하는 도중에 MIRATION DATA를 임시 테이블로 필요한 값만 넣어야 했는데, 예를 들어 임시 테이블 MIRATION DATA 에는 보너스와 급여라는 컬럼이 있고, 임시테이블에는 연봉이라는 컬럼이 있을 경우 MIRATION DATA 보너스와 급여를 합쳐서 가져와여죠 이럴경우 SELE JOIN을 필요로 하게 되는거죠, 즉 MIRATION DATA 테이블에 컬럼 두개를 합쳐서 하나로 가져와야 될경우 전 테이블 하나이기에 SELE 조인을 사용했습니다.

by 웅 [2008.01.10 16:57:23]
셀프조인도 업무 성격에 따라서 자주 사용하는 곳이 있습니다.

by 정훈 [2008.12.15 23:40:56]
왕초보님께서 작성한거 보고 안되서.. 다시 만들어 봤어요
select e.ename, a.ename "Manager"
from emp e, emp a
where e.empno = a.mgr;
참고로 scott 로긴해서 나온 테이블이에요~

by 야라나이카 [2008.12.16 16:12:26]
으음, 좋은 조인이다

by Agrix [2010.04.23 16:09:13]
10번보니 이해가네요 헉

by hkm [2012.02.20 17:34:35]
너무 좋아요.. 퍼갑니다.

by 손님 [2012.11.02 13:45:02]

self join에서 이부분이 이해가 안가요
SELECT
e.ename, a.ename "Manager"

a.ename "Manager"의 의미는 무엇인가요...?ㅠㅠ

by 손님 [2012.11.13 15:47:18]
a.ename "Manager" 의 의미는 a.ename 이란 컬럼의 예명(alias)을 Manager 로 설정했다는뜻입니당

by 열혈성민 [2013.01.30 18:35:41]
카데시안 곱? 
카타시안 곱?
카티션 곱?

어쨋거나 발음은 여러개지만 수학에서 듣던 단어를
DB 공부하면서 들으니 신기하네요..
하지만 왜 이렇게 구분해서 칭하는지는 잘 모르겠습니다 'ㅅ';;

잘못하면 서버가 뻑나서 구분하는건가요?

by 이엘 [2016.11.27 20:59:54]

셀프조인 예제가 반대로 되어있는거같아요

킹이 사장이라 혼자 MGR이 null인데 저 표에 보면 존스가 매니저라고 뜨네요

SELECT a.ename, e.ename "매니저"

이렇게 해야하지않나요?


by raian [2022.11.08 15:42:42]

셀프조인 부분 위 이엘님이 쓴 뎃글처럼 본문 셀프조인 부분 수정되어야 됩니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입