오늘은 몰랐으면 내일은 알면 된다
2022-11-09 (1) JOIN 본문
[집합 연산자 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(+);
'Java > JAVA 개발자 양성과정' 카테고리의 다른 글
| 2022-11-10 (1) 데이터 정의어(DDL: Data Definition Language) (0) | 2022.11.10 |
|---|---|
| 2022-11-09 (2) 서브쿼리 Subquery (0) | 2022.11.09 |
| 2022-11-08 (5) 다중행 함수, GROUP BY (0) | 2022.11.08 |
| 2022-11-08 (4) 람다식(Lambda Expression) (0) | 2022.11.08 |
| 2022-11-08 (3) 정규 표현식(Regular Expression) (0) | 2022.11.08 |