Database

CHAPTER 04. 조인(JOIN)과 부질의(SubQuery)

starlikedh 2021. 3. 8. 15:24

 조인이란?

- 상호 특성 관련성을 갖는 두 개 이상의 테이블로부터 새로운 테이블을 생성하는 데 사용되는 연산
- 조인의 종류에는 크게 Cross 조인, Equi 조인, Non-Equi 조인, Self 조인, Outer 조인 5가지 유형이 존재

 CROSS 조인

- 관계 대수의 8가지 연산 중 카티션 프로덕트(Cartesian Product)를 구현한 것으로,
2개 이상의 테이블을 조인 조건 없이 실행하는 조인 연산을 의미.
select student.*, enrol.*
from student
cross join enrol;
실행 결과는 학생 테이블의 데이터 수가 10개이고 수강 테이블의 데이터가 12개라 하면 결과는 120개

 EQUI 조인

- 조인 중 가장 많이 사용되며 2개 이상의 테이블에 관련 있는 공통 열의 값을 이용
- WHERE 절의 '=' 연산자를 사용

한 번에 학생의 학번, 이름, 학과와 점수를 검색하는 질의문

 Non-Equi 조인

- Equi 조인에서 WHERE 절에 사용하는 '='이 아닌 다른 연산자를 사용하는 경우
- 기본키와 외래키 관계가 아닌 열 값들의 의미 있는 관계로 조인하는 경우

사원 테이블의 급여 열값이 급여 테이블의 하위급여와 상위급여 사이에 포함될 때 사원 등급 결정 질의문 WHERE 절에 between ~ and ~ 를 사용.

 Self 조인

- 자기 자신 테이블과의 조인이 요구되어 질 때가 있으며, 이런 경우 자기 자신과의 조인 사용.
- 결국 FROM 절에 같은 테이블의 이름이 2개 존재하게 되면 이때 테이블의 별칭 사용하여 구분.
- 아래는 자기 자신의 상급자를 구하는 질의문의 예.

select a.empno as 사원번호, a.ename as 사원이름,
          b.empno as 상급자 사원번호, b.ename as 상급자 이름
from emp a, emp b
where a.mgr = b.empno;

 Outer 조인

- 조인 조건을 만족하지 않는 행들도 질의 결과에 포함하기 위한 조인.
- 즉 2개 이상의 테이블이 조인될 때 어느 한쪽의 테이블에는 해당하는 데이터가 있으나,
다음 테이블에는 없는 경우 그 데이터는 출력되지 않는 문제를 해결하기 위한 조인.
- 아래는 수강 테이블을 기준으로 과목이름을 구하는 검색 질의문.
- Outer 조인의 종류에는 RIGHT OUTER 조인, LEFT OUTER 조인, FULL OUTER 조인 3가지가 있음.

select a.*, sub_name
from enrol a right outer join subject b
on a.sub_no = b.sub_no
order by 1;

 부질의(SubQuery)

- SELECT문 내에 또 다른 SELECT문을 포함할 수 있으며 이렇게 포함된 SELECT 문장을 서브쿼리라 함.
- 서브쿼리는 일반적으로 WHERE절, HAVING 절에 사용하며 FROM 절에도 사용 가능.
- 서브쿼리를 사용하여 '옥성우' 학생보다 신장이 큰 학생들의 학번, 이름, 신장을 구하기
select stu_no, stu_name, stu_height
from student
where stu_height >
           (select stu_height
            from student
            where stu_name = '옥성우');

- 일반적으로 서브쿼리의 질의문을 조인 질의로 표현 가능.
- 아래의 예는 101번 과목을 수강한 학생들의 정보를 구하는 질의문과 이를 조인 문장으로 작성한 것.

서브쿼리 사용
select *
from student
where stu_no in
           (select stu_no
            from enrol
            where sub_no = 101);
조인 사용
select  a.*
from student a, enrol b
where a.stu_no = b.stuno and sub_no = 101;

 집합(SET) 연산자

- 관계대수 8개의 연산자 중 두 개 이상의 질의 결과를 결합하기 위해 집합연산자를 사용.
- 집합 연산자를 사용하기 위해서는 두 개 이상의 질의문 결과의 열의 수와 데이터 타입은 일치해야 함.
- 열의 이름이 같지 않을 경우 첫 번째 SELECT 문의 열의 이름을 따름.
- 집합 연산자의 연산결과에 대한 정렬은 마지막 질의문에 ORDER BY 절을 사용.

연산자 설명
UNION 두 질의 결과 값의 합으로 중복을 제거됨
UNION ALL 두 질의 결과 값의 합으로 중복을 포함됨
INTERSECT 두 질의 결과값의 공통되는 값
MINUS 첫 번째 질의 결과에서 두 번째 질의 결과에 있는 행을 제거한 값