조인 (join)

kmb·2022년 11월 22일
0

DB

목록 보기
7/10
post-thumbnail

조인 (join)

2개이상의 테이블들을 연결고리로 관계를 맺고 데이터를 추출하는것.

 

조인의 종류

Inner join의 상대개념이 Outer join이다.
Cross join은 ANSI SQL을 사용한것이며, Catasian join은 일반 SQL을 사용한것이다.


예시에 사용될 테이블은 아래와 같다.


동등 조인(Equi join)

where절에서 등호 연산자 = 를 사용해서 2개 이상의 테이블이나 뷰를 연결하는 방법.
두 테이블에서 공통된 값을 가진 컬럼을 등호 연산자 = 로 연결해서 조인 조건을 일치 시킨다.

SELECT a.employee_id, a.emp_name, a.department_id, b.department_name
FROM employees a, departments b 
WHERE a.department_id = b.department_id;

공통적으로 갖고있는 department_id 컬럼을 등호연산자 = 를 사용해서 조회 조건에 명시했다.


ANSI 조인

기존의 문법과는 다른 ANSI SQL 문법을 사용한 조인을 의미.
ANSI 조인에서는 join 조건이 FROM 절에 들어간다.

 

  • 기존 문법
SELECT a.employee_id, a.emp_name, a.department_id, b.department_name
FROM employees a, departments b 
WHERE a.department_id = b.department_id;  // join 조건
  • ANSI 문법
SELECT a.employee_id, a.emp_name, a.department_id, b.department_name
FROM employees a 
INNER JOIN departments b 
ON (a.department_id = b.department_id);  // join 조건

세미 조인(Semi join)

서브 쿼리를 사용해서 서브 쿼리에 존재하는 데이터를
메인 쿼리에서 IN, EXISTS 연산자를 사용하여 추출하는 방법.

예를 들어 서브 쿼리에 있는 테이블을 B, 메인 쿼리에 사용된 테이블을 A라고 가정한다면
세미 조인은 서브쿼리 B테이블에 존재하는 메인 쿼리 A테이블의 데이터를 추출하는 것이다.

세미 조인은 서브 쿼리에 존재하는 메인 쿼리 데이터가 중복해서 존재하더라도 최종 반환되는 데이터에는 중복되는 건이 없다. (일반 조인의 경우에는 중복 데이터가 반환된다)

 

  • EXISTS 연산자를 사용한 Semi join 예시
SELECT department_id, department_name
FROM departments a
WHERE EXISTS(SELECT *
             FROM employees b 
             WHERE a.department_id = b.department_id 
             AND b.salary > 3000)
ORDER BY a.department_name;    

서브 쿼리에 있는 employees 테이블에 존재하는 departments의 데이터를 추출한다.

 

  • IN 연산자를 사용한 Semi join 예시
SELECT department_id, department_name
FROM departments a
WHERE a.department_id IN(SELECT b.department_id
                         FROM employees b
                         WHERE b.salary > 3000)
ORDER BY department_name;    


안티 조인(Anti join)

서브 쿼리에 속하는 테이블 B에는 없고 메인 쿼리에만 존재하는 테이블 A의 데이터만 추출하는 방법.
(세미 조인의 반대 개념이다)

한쪽 테이블에만 있는 데이터를 추출하는 것이므로 NOT IN, NOT EXISTS 연산자를 사용한다.

 

  • NOT IN 연산자를 사용한 Anti join 예시
SELECT a.employee_id, a.emp_name, a.department_id, b.department_name
FROM employees a, departments b
WHERE a.department_id = b.department_id
AND a.department_id NOT IN (SELECT department_id 
							FROM departments 
                            WHERE manager_id IS NULL);

 

  • NOT EXISTS 연산자를 사용한 Anti join 예시
SELECT count(*) FROM employees a 
WHERE NOT EXISTS (SELECT 1 
                  FROM departments c 
                  WHERE a.department_id = c.department_id 
                  AND manager_id IS NULL);  


 

출처

  • 오라클 SQL과 PL/SQL을 다루는 기술 (책)
profile
꾸준하게

0개의 댓글