본문 바로가기
[ SQL ]/SQL

[ SQL ] JOIN

by 환이s 2023. 1. 22.

이전 포스팅에서 SQL 함수에 대해서 알아보았습니다. 이번 포스팅은 함수를 활용하여 조인의 개념에 대해서 알아보고 기초적인 조인의 종류에 대해서 함께 알아보도록 하겠습니다.

 

■ JOIN 이란?

조인은 '어울리다'라는 의미를 가지고 있는데 이 말대로, 데이터베이스에서테이블 간의 결합을 이야기 합니다.

즉, 두 개 이상의 테이블에 대해서 결합하여 나타낼 때 조인이라는 것을 이용하며, 조금 더 해석해 보자면 하나의 테이블로  원하는 칼럼 정보를 참조할 수 없는 경우 관련된 테이블을 논리적으로 결합하여 원하는 컬럼 정보를 참조하는 방법

 

1 ) 전제조건

 

  • 논리적으로 결합되는 2개 이상의 테이블에는 반드시 공통 칼럼이 있어야 합니다.
  • 공통 칼럼은 데이터 타입과 데이터가 동일해야 함

 

2 ) JOIN 형식

 

select 컬럼 리스트 from 조인대상 테이블들(컴머로 구분, 별칭사용)
where 공통 컬럼을 이용한 조인조건
and 일반조건;

 

그럼 예제를 통해서 살펴보겠습니다.

예제 데이터는 student 테이블과 department 테이블을 사용하며, 테이블을 사용해서 학생의 이름과, 학과코드, 학과이름을 출력하는 데이터를 진행해 보도록 하겠습니다.

 

--student,department  테이블을 사용해서 학생의 이름,학과 코드,학과 이름(dname)을 출력
select s.name 이름,s.deptno1 학과,d.dname 학과이름
from student s, department d
where s.deptno1 = d.deptno; --조인조건 t.공통컬럼 = t.공통컬럼

 

위 예제처럼 학생의 학과이름을 데이터로 가져오기 위해 학생 테이블인 student와 학과 테이블인 department를  JOIN 하여 어떤 학생이 어떤 학과에 속했는지 한눈에 볼 수 있습니다.

 

위 예제는 JOIN의 종류에서 INNER JOIN 형식입니다. 대개의 업무에서 조인은 INNER JOIN을 주로 사용하며, 일반적으로 JOIN이라 하면 INNER JOIN을 자칭합니다.

 

조인의 종류에는 크게 4가지로 나뉘는데, 이너조인, 아우터조인, 크로스조인, 셀프조인이 있습니다.

그럼 아우터 조인부터 알아봅시다.

 

■ OUTER JOIN (외부조인)

OUTER JOIN이란 외부조인을 의미하며, 한쪽 테이블에는 해당 데이터가 존재하고 다른 쪽 테이블에는 데이터가 존재하지 않을 경우 모든 데이터를 조회하는 조인입니다.

 

OUTER JOIN의 활용법은 다음과 같습니다.

 

  • 조회 조건에서 (+) 기호를 사용합니다,
  • 오라클의 경우 조인시킬 값이 없는 조인 측에 (+)를 위치시킵니다.
  • (+)가 붙은 칼럼과는 in연산자를 함께 사용할 수 없습니다.
  • (+)가 붙은 컬럼과는 서브쿼리를 같이 사용할 수 없습니다.

 

그럼 OUTER JOIN을 활용하여 학생테이블인 student , 교수테이블인 professor를 활용하여 학생이름, 학과번호, 지도교수이름을 출력하는데 단, 지도교수가 배정되지 않은 학생의 명단도 모두 출력해 보겠습니다.

 

student 테이블의 데이터는 다음과 같습니다.

<student>

 

professor 테이블의 데이터는 다음과 같습니다.

<professor>

 

그럼 조인 코드를 통해 알아봅시다.

 

select s.name 학생이름, s.deptno1 학과번호, p.name 교수이름
from student s, professor p
where s.profno = p.profno(+);

위 예제 코드처럼 조회 조건에서 (+) 기호를 사용합니다.

다음 포스팅에서 ANSI에 대해서 포스팅하려고 하는데 크게 오라클용, ANSI용 두 개로 나뉘는데 ANSI용은 where절 대신 on절을 사용하며 , (콤마) 대신 outer join을 활용합니다.

다음 포스팅에서 자세하게 알아봅시다.

 

결과는 아래와 같습니다.

 

 

위 결과를 보면 16~20번 학생은 교수 이름이 (null)입니다, 그 이유는 두 테이블 간의 공통된 데이터가 없기 때문입니다.

즉, 공통된 데이터가 없으면 출력되지 않기 때문에 OUTER JOIN을 활용하여 이러한 데이터들도 함께 보고 싶은 경우 출력이 가능합니다.

 

■ CORSS JOIN

CORSS JOIN은 앞서 진행한 INNER JOIN, OUTER JOIN과 약간의 차이가 존재합니다.

INNER JOIN과 OUTER JOIN은 두 테이블간의 특정 기준에 의해 데이터 결합의 결과를 보여주는 방식이었다면, CORSS JOIN은 특정 기준 없이, 두 테이블간 가능한 모든 경우의 수에 대한 결합을 결과로 보여주는 방식입니다.

즉, 엄밀히는 조인은 아닙니다.

 

CORSS JOIN은 사원 테이블인 emp, 부서 테이블인 dept를 활용해서 알아보겠습니다.

먼저 emp 테이블 데이터는 다음과 같습니다.

 

<emp 테이블>

 

dept 테이블 데이터는 다음과 같습니다.

 

<dept 테이블>

 

위 테이블을 활용하여 CORSS JOIN에 대해서 알아봅시다. 예제코드는 다음과 같습니다.

 

select*from dept;
select*from emp;
--Corss 조인 : 두 테이블간 조합가능한 모든 경우의 수를 계산해서 산출하는 조인
select e.ename, d.dname
from emp e, dept d;

 

 

결과는 다음과 같습니다.

김철수	경리팀
이찬수	경리팀
박종수	경리팀
임채호	경리팀
나대호	경리팀
박지성	경리팀
구자철	경리팀
송기성	경리팀
김철호	경리팀
성명준	경리팀
황인태	경리팀
박민성	경리팀
박진성	경리팀
최철호	경리팀
김_수	경리팀
김철수	연구팀
이찬수	연구팀
박종수	연구팀
임채호	연구팀
나대호	연구팀
박지성	연구팀
구자철	연구팀
송기성	연구팀
김철호	연구팀
성명준	연구팀
황인태	연구팀
박민성	연구팀
박진성	연구팀
최철호	연구팀
김_수	연구팀
김철수	총무팀
이찬수	총무팀
박종수	총무팀
임채호	총무팀
나대호	총무팀
박지성	총무팀
구자철	총무팀
송기성	총무팀
김철호	총무팀
성명준	총무팀
황인태	총무팀
박민성	총무팀
박진성	총무팀
최철호	총무팀
김_수	총무팀
김철수	전산팀
이찬수	전산팀
박종수	전산팀
임채호	전산팀
나대호	전산팀
박지성	전산팀
구자철	전산팀
송기성	전산팀
김철호	전산팀
성명준	전산팀
황인태	전산팀
박민성	전산팀
박진성	전산팀
최철호	전산팀
김_수	전산팀

 

위 결과처럼 CORSS JOIN은 두 테이블간 가능한 모든 경우의 수에 대한 결합을 결과로 보여주는 방식입니다.

 

■ SELF JOIN

SELF JOIN은 말 그대로 자기 스스로를 결합시키는 JOIN입니다. SELF JOIN은 INNER JOIN 및 OUTER JOIN, CORSS JOIN과 동일한 방식으로 사용될 수 있지만 조인을 할 때에 기본 테이블 이외에 참조하는 테이블이 다른 테이블이 아닌 자기 자신이라는 점이 중요합니다. 즉, 참조해야 할 칼럼이 자신의 테이블에 있는 다른 칼럼인 경우에 사용합니다. 그리고 반드시 테이블에 대한 별칭이 꼭 있어야 합니다.

 

그럼 예제 코드를 통해서 알아봅시다. 코드에 사용할 데이터는 위 예제코드에서 보여드렸던 emp 테이블 데이터로 활용했습니다.

 

emp테이블에서 매니저아이디(mgr)는 자신의 상급자(사수)의 empno와 동일합니다.

이를 사용해서 각 사람의 사원번호와 이름 그리고 매니저 번호, 매니저 이름을 조회해 보겠습니다.

 

select*from emp;

select a.empno 사번, a.ename 이름, b.empno 매니저사번, b.ename 매니저이름
from emp a, emp b
where a.mgr = b.empno;

 

참고로 글쓴이는 join 할 때 별칭을 꼭 활용합니다. SELF JOIN을 제대로 이해하려면 참조할 다른 테이블이 존재하지 않을 때 자기 자신을 조인할 때 활용하는데, 그럴 땐 별칭을 활용합니다.  결과는 다음과 같습니다.

 

 

위와 같은 쿼리의 기본형태는 INNER JOIN과 동일하지만 참조하는 테이블이 from절에 오는 기본 테이블과 동일하며, 별칭을 활용해서 구별하는 모습을 볼 수 있습니다.

 

 


마치며

 

JOIN을 처음 들으면 약간 이해하기 힘들 수 있지만 집합을 생각해 보면 이해하기가 한결 수월해집니다..!!

저희 고등학교 시절 수학에서 집합에 대해서 여러 번 공부한 적이 있기 때문에 이해하기 쉬울 거라 예상합니다~:)

다음 포스팅에서 뵙겠습니다!

 

728x90

'[ SQL ] > SQL' 카테고리의 다른 글

[ SQL ] View_Index_Sequence  (0) 2023.02.01
[ SQL ] 테이블과 제약 조건(constraint)  (2) 2023.01.31
[ SQL ] Transaction and Sub Query  (0) 2023.01.30
[ SQL ] SQL 함수 정리  (1) 2023.01.21
[ SQL ] SQL(Structured Query Language)  (0) 2023.01.19