오늘은 몰랐으면 내일은 알면 된다

2022-11-09 (1) JOIN 본문

Java/JAVA 개발자 양성과정

2022-11-09 (1) JOIN

마스터피쓰 2022. 11. 9. 11:06

[집합 연산자 vs 조인]

: 집합 연산자를 사용한 결과는 두 개 이상의 select 문의 결과 값을 세로로 연결한 것이고, 조인을 사용한 결과는 두 개 이상의 테이블 데이터를 가로로 연결한 것이다.

 

여러 테이블을 단순히 나열만 하게 되면 데카르트 곱(카테시안 곱: Cartesian product, 크로스 조인(cross join), 교차 조인 : 각 집합을 이루는 모든 원소의 순서쌍)이 발생한다.

 

[등가 조인 equi join]

: 테이블을 연결한 후에 출력 행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식이다. 내부조인(inner join) 또는 단순 조인(simple join)으로 부르기도 한다.

조인 조건을 제대로 지정하지 않으면 데카르트 곱이 일어날 수 있는데, 이를 방지하기 위한 조건식의 최소 개수는 조인 테이블 개수에서 하나를 뺀 값이다.

 

[비등가 조인 non-equi join]

: 등가 조인 외의 방식을 의미한다.

 

[자체 조인 self join]

: 하나의 테이블을 여러개의 테이블처럼 활용하여 조인하는 방식이다.

 

[NATURAL JOIN]

: 같은 컬럼명을 찾아서 자동으로 ON절을 만들어준다. 등가 조인을 대신해서 사용할 수 있다. 조인의 기준 열을 SELECT 절에 명시할 때 테이블 이름을 붙이면 안된다.

SELECT employee_id, job_id, job_title
FROM employees NATURAL JOIN jobs;
--위아래는 서로 같다
SELECT employee_id, e.job_id, j.job_title
FROM employees e JOIN jobs j ON (e.job_id = j.job_id);

employees 테이블과 departments는 같은 이름의 컬럼이 둘이다. 따라서 natural join을 하게되면 다음과 같은 의미가 된다.

SELECT employee_id, department_id, department_name
FROM employees NATURAL JOIN departments;
--위아래 의미 같음
SELECT employee_id, e.department_id, department_name
FROM employees e JOIN departments d 
ON (e.department_id = d.department_id AND e.manager_id = d.manager_id);

관리자가 부서장이고 같은 부서에서 일하는 사원의 사번, 부서번호, 부서명을 출력한 셈이다.
따라서 natural join은 같은 이름의 컬럼이 하나이면 사용하기 적절하지만, 두개 이상이 되는 경우 원치않는 결과가 될 수도 있다.

 

[JOIN ~ USING]

: 등가 조인을 대신하는 문법이다. NATURAL JOIN과는 달리 USING 키워드에 조인 기준으로 사용할 열을 명시한다.

위에서 사용한 예시와 비교해보자.

SELECT employee_id, job_id, job_title
FROM employees NATURAL JOIN jobs;

SELECT employee_id, job_id, job_title
FROM employees JOIN jobs USING(job_id);

두번째 예시도 다음과 같이 바꿀 수 있다.

SELECT employee_id, department_id, department_name
FROM employees NATURAL JOIN departments;

SELECT employee_id, department_id, department_name
FROM employees JOIN departments USING(department_id);

 

[JOIN ON]

: 위의 구문들은 간단하긴 하지만 위험요소가 많다.(참고정도만 할것) 따라서 가장 안정적인 JOIN ON이 가장 많이 사용된다.

 

[OUTER JOIN]

: 위의 JOIN ON 까지를 inner join 이라고 부른다. inner join 과 outer join 을 그림으로 나타내면 아래와 같다.

 

left outer join은 왼쪽 열을 기준으로, 오른쪽의 데이터가 있든 말든 출력한다는 뜻이다.

반대로 right outer join은 오른쪽 열을 기준으로, 왼쪽의 데이터가 있든 말든 출력한다는 뜻이다. outer 는 생략 가능하다.

SELECT employee_id, e.department_id, department_name
FROM employees e LEFT OUTER JOIN departments d 
ON (e.department_id = d.department_id);

SELECT employee_id, e.department_id, department_name
FROM employees e RIGHT OUTER JOIN departments d 
ON (e.department_id = d.department_id);

 

참고) 오라클 버전에서 작성하는 방법

부족할 수 있는 열 쪽에 (+) 를 붙인다.

SELECT l.location_id, l.city, d.department_id, d.department_name
FROM locations l LEFT JOIN departments d on l.location_id = d.location_id;

SELECT l.location_id, l.city, d.department_id, d.department_name
FROM locations l, departments d
where l.location_id = d.location_id(+);