1. JOIN?
1-1. SQL JOIN
(1) SQL에서 JOIN은 두 개 이상의 테이블에서 데이터를 결합하는 데 사용되는 연산 방법이다. 두 개 이상의 테이블을 묶어서 하나의 결과를 만들어내는 것으로 실무에서는 두 개 이상의 테이블을 엮어서 원하는 데이터를 뽑아오는 일이 상당히 많으며 이러한 join은 데이터베이스 테이블 간에 관계를 설정, 관련된 컬럼을 사용해서 데이터를 연결할 수 있다.
select
(...)
from
(...)
inner join
(...)
on
(...)
where
(...)
2. (INNER) JOIN
2-1. INNER JOIN
(1) inner join은 내부 조인이라고도 하며 두 테이블 간에 조인 조건을 만족하는 로우만 반환하고 형식은 아래와 같다.
select columns_1
from table_1
inner join table_2
on table_1.column_name = table_2.column_name;
select columns_1
from table_1
join table_2
on table_1.column_name = table_2.column_name;
(2) 위의 쿼리처럼 inner join의 경우 예약어인 inner를 생략할 수 있다.
2-2. INNER JOIN 예시
select *
from purchases as p
join members as m
on p.member_name = m.member_name
where p.member_name = 'jack';
1번 예시
(1) 구매 테이블과 회원 테이블을 조인하여 결과를 가져오지만 조인 조건에 따라 구매 테이블의 회원 이름, 회원 테이블의 회원 이름이 동일한 로우들만 반환한다.
(2) 마지막으로 select 절의 조회 결과를 필터링하는 where 문이 사용되어 구매 테이블의 회원 이름이 "jack"인 로우만 반환하게 된다.
select
p.member_name,
p.product_name,
m.member_address,
concat(m.first_phone, m.last_phone) as phone_number
from purchase as p
join members as m
on p.member_name = m.member_name;
2번 예시
(1) 1번 예시와 거의 유사하지만 프로젝션 컬럼들의 개수가 변경되었다. 위와 같은 조인 조건을 만족하는 로우들을 기준으로 프로젝션에 나열된 컬럼들에 대한 데이터들을 모두 반환하게 된다.
(2) 프로젝션에서 member.name에 alias p가 붙은 이유는 회원 테이블, 구매 테이블 모두 동일한 member_name 컬럼을 갖고 있기 때문에 이를 구분하기 위해 앞에 alias를 붙여 주었다.
3. LEFT (OUTER) JOIN, RIGHT (OUTER) JOIN
3-1. OUTER JOIN
(1) 외부 조인이라고도 불리며 내부 조인과 반대로, 두 테이블 간의 조인을 수행할 때 조인 조건을 만족하지 않는 로우도 포함시키도록 하는 조인을 의미한다.
(2) 외부 조인의 경우 조인 조건을 만족시키지 않는 로우도 포함시켜야 할 때 사용할 수 있으며 이를 통해 조인하는 두 테이블 간에 관계를 유연하게 다룰 수 있다는 장점이 있다.
(3) 외부 조인은 예약어인 outer를 생략할 수 있으며 LEFT JOIN, RIGHT JOIN으로 쓸 수 있다.
3-2. LEFT JOIN
(1) 왼쪽 테이블의 로우를 모두 포함하고 오른쪽 테이블에서 조인 조건을 만족하는 로우가 있을 경우 해당 로우를 포함시키는 조인을 의미한다.
(2) 만약 오른쪽 테이블에 조인 조건을 만족하는 로우가 없다면 해당 컬럼은 NULL로 채워진다.
select
m.member_name,
p.product_name,
m.member_address
from members as m
left join product as p
on m.member_name = p.member_name
order by m.member_id;
(3) 회원 테이블의 모든 행을 포함하고, 오른쪽 테이블에서 조인 조건에 만족하는 행이 없으면 해당 컬럼은 NULL로 표시된다.
3-3. RIGHT JOIN
(1) 오른쪽 테이블의 로우를 모두 포함하고 왼쪽 테이블에서 조인 조건을 만족하는 로우가 있을 경우 해당 로우를 포함시키는 조인을 의미한다.
(2) 만약 왼쪽 테이블에 조인 조건을 만족하는 로우가 없다면 해당 컬럼은 NULL로 채워진다.
(3) left join, right join 두 조인의 차이는 문법상 테이블의 위치가 변경된 것 뿐이다.
-- 1
select
m.member_name,
p.product_name,
m.member_address
from members as m
left join product as p
on m.member_name = p.member_name
order by m.member_id;
-- 2
select
m.member_name,
p.product_name,
m.member_address
from product as p
right join members as m
on m.member_name = p.member_name
order by m.member_id;
4. CROSS JOIN
4-1. CROSS JOIN
(1) cross join의 경우 두 개 이상의 테이블 간에 모든 가능한 조합을 만드는 데 사용되는 조인이다.
(2) 각 테이블의 모든 레코드(행)를 다른 테이블의 모든 레코드(행)와 결합하여 Cartesian product를 생성한다.
(3) 각각 테이블의 모든 레코드들을 결합하는 만큼 결과는 각 테이블의 로우 수를 곱한 만큼의 행을 가지게 된다.
(4) 많이 사용되지는 않고 주로 대용량의 데이터를 생성하는 등의 특정한 케이스에서만 사용되는 조인이다.
4-2. CROSS JOIN 특징
(1) ON 조건 구문을 사용할 수 없다.
(2) 특정 케이스에서만 사용된다.
select count(*)
from members
cross join purchase;
5. SELF JOIN
5-1. SELF JOIN
(1) SELF JOIN의 경우 하나의 테이블 내부에서 조인하는 것을 의미한다.
(2) 실무에서 많이 사용되지는 않는 조인 방법이다.
(3) 주로 부모-자식 관계를 가지는 테이블에서 사용된다.
select
e.employee_id,
e.employee_name,
m.employee_name as manager_name
from employees as e
left join employees as m
on e.manager_id = m.employee_id;
※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.
개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다!
댓글