티스토리 뷰
조인이란?
-데이터베이스에서 두개 이상의 테이블로부터 결합하여 하나의 테이블로 만드는 기능입니다.
관계형 데이터베이스에서의 핵심 기능이며, 조인을 사용해 다양한 테이블을 만들 수 있습니다.
조인은 기본적으로 카타시안 곱으로 구현되며 카타시안 곱 연산 수행도중 특정 값 조건이 일치하는 행들만 뽑습니다.
동등(EQUI) 조인 VS 비동등(NON EQUI 조인)
- 동등 조인
-두 테이블 간의 조인 조건이 등호 연산자(=)를 사용하여 두 컬럼 값이 일치하는 경우에만 행을 결합하는 조인입니다.
SELECT e.emp_name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;
- 비동등 조인
-두 테이블 간의 조인 조건이 등호가 아닌 다른 연산자(< , > , <= , >=)를 사용하여 두 컬럼이 조건에 일치하는 경우에만 행을 결합하는 조인입니다.
SELECT e.emp_name, e.salary, s.grade_id
FROM employees e
JOIN salary_grades s ON e.salary BETWEEN s.min_salary AND s.max_salary;
조인테이블
조인은 2가지의 방식으로 사용할 수 있습니다. 두 가지 방식 다 같은 결과를 가져오며, 표현방식만 차이가 있습니다.
- from절에서 조인 사용하기
SELECT name FROM person1 JOIN person2
ON person1.name = person2.name;
2. from절에서 테이블 생성 후 추가연산을 where절에서 명시
SELECT name FROM person1, person2 where person1.name = person2.name;
조인의 종류
- Inner join
내부 조인으로 테이블 사이에서 공통된 속성을 기준으로 결합하는 조인 (Inner를 생략해도 가능)
SELECT o.order_id, o.product, c.customer_name
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id;
- Left outer join
왼쪽 외부 조인으로 테이블 사이에서 공통된 속성을 기준으로 결합하는 조인인데, 왼쪽 테이블은 모든 튜플이 다 살아있음 (null값을 넣어서 왼쪽테이블 튜플들을 살림)
SELECT o.order_id, o.product, c.customer_name
FROM orders o
LEFT OUTER JOIN customers c ON o.customer_id = c.customer_id;
- Right outer join
오른쪽 외부 조인으로 테이블 사이에서 공통된 속성을 기준으로 결합하는 조인인데, 오른쪽 테이블은 모든 튜플이 다 살아있음 (null값을 넣어서 오른쪽테이블 튜플들을 살림)
SELECT o.order_id, o.product, c.customer_name
FROM orders o
RIGHT OUTER JOIN customers c ON o.customer_id = c.customer_id;
- Full outer join
전체 외부 조인으로 양쪽의 테이블의 모든 튜플이 다 살아있음 (null값을 넣어 튜플들을 살림)
SELECT o.order_id, o.product, c.customer_name
FROM orders o
FULL OUTER JOIN customers c ON o.customer_id = c.customer_id;
- Cross join
카타시안 곱(Cartesian Product)라 불리며, 두 테이블의 모든 가능한 행 조합을 반환하는 조인입니다. 특정 조건은 없으며, 가능한 모든 조합을 반환합니다.
SELECT o.order_id, o.product, c.customer_name
FROM orders o
CROSS JOIN customers c;
자연조인
-두 테이블간의 동일한 이름을 갖는 모든 칼럼들에 대해 동등(EQUI)조인을 수행하는 조인입니다.
다른 조인들과는 다르게 추가 조건 명시를 할 수 없고, 조건과 상관 없이 동일한 이름의 모든 칼럼에 대해서 수행합니다.
자연조인은 NATURAL JOIN으로 표현하는 방법도 있고, USING으로 표현하는 방법이 있습니다.
SELECT o.order_id, o.product, c.customer_name
FROM orders o
NATURAL JOIN customers c; // JOIN customer USING (~~) 으로도 표현가능함
조인의 조건명시
- ON 조건절
-두 테이블 간의 조인 조건을 명시적으로 지정할 수 있습니다. 즉, 컬럼 명이 다르더라도 JOIN 조건을 사용할 수 있고,
두 테이블의 모든 컬럼을 참조할 수 있고, 다양한 조건(비동등 조인)을 사용할 수 있습니다.
SELECT name
FROM (person1 JOIN person2)
ON (person1.name = person2.name);
- USING 조건절
-ON과 달리 같은 이름을 가진 칼럼들 중에서 원하는 칼럼만 선택적으로 조인할 수 있습니다.
즉, 두 테이블간의 공통된 칼럼이 있어야하며, 서로 다른 이름의 칼럼은 조인을 할수 없습니다.
SELECT order_id, product, customer_name
FROM orders
INNER JOIN customers USING (customer_id);