'제수기' - '제발 수업내용을 기억해라'
RDBMS(Relational DBMS) 관계형 DB
을 먼저 살펴보자. 예를 들어서 tbl_menu
: 4 - tbl_category
: 4는 한식 이렇게 정보를 나눠둔다.
table
= entity
, relation
RDB에서 독립되게 나타낼 때 entity
join
의 결과로 나타나는 table(entitiy)
은 relation(entitiy + entitiy)
🥪둘 다 table
인데, 독립적일 때랑 합쳐진 table
일 때랑 다르게 부른다.
join
을 할 떄, 연관성이 있는 컬럼을 기준으로 조합을 한다. 구심점 역할을 하는 컬럼을 찾아서 한다.
table
과 table
의 행과 행을 연결한다.
행과 행끼리 가로방향으로 이어진다.
union
: entitiy
와 entitiy
가 있을 때 컬럼의 개수가 똑같으면 위 아래로 합치는 방법. 다음시간에 다뤄보겠다.
결과적으로 union
은 행수가 늘어난다. 그냥 합치니까. 더 간단하다. 그런데 join
은 특정 조건을 만족하는 행과 행을 연결한다. 최종적으로 가로 방향으로 이어진 행들이 모여진 table
이 된다.
Join
에서
=
를 썼으면 EQUI JOIN
. 90%가 이거임.
non-equi join
은 잘 안 씀. is null, between, and,,,, 등이 쓰임.
Equi join
중에서도 inner join
, left outer join
, right outer join
이 가장 많이 쓰인다. 사실상 얘네만 쓰인다고 봐도 된다.
m.categoty_code
, c.category_code
가 같으면 찾아서 샥 붙여준다. 결과적으로 가상컬럼이 늘어난다.from
에서 m
, c
이렇게 별칭을 지정해준다.
where 추가도 가능하다.
-- join 수행 시 기준 컬럼의 값이 null이거나,
상대 테이블에 매칭되는 행이 없는 경우 resultset에 포함되지 않는다.
-- [inner] join : inner 키워드 생략 가능
tbal_category
, tbl_menu
는 1:N
의 관계다. tbl_category
가 4
면, tbl_menu
에서 4
에 해당하는 행들을 붙이니까.select <열 목록>
from <첫 번째 테이블>
inner join <두 번째 테이블>
on <조인될 조건>
where 검색 조건
🥪inner join
은 join
이라고만 써도 join
으로 인식한다.
select <열 목록>
from <첫 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인될 조건>
WHERE 검색 조건;
상황1.
🗣️"메뉴 좀 보여줘봐"
🗨️"카테고리 지정이 안 된 메뉴는 어떻게 할까요?"
"빼고 보여줘" -> inner join
"그래도 봐야 할 거 같은데?" -> outer join
상황2.
🗣️"카테고리별로 메뉴를 보고 싶어"
🗨️"하나의 카테고리에 몇 개의 메뉴가 더 있을 수도 있는데, 그것도 같이 보여드릴까요? 아니면 그냥 카테고리별 메뉴 1개씩만 보여드릴까요?"
"아 그냥 빼고 보여줘" -> inner join
"다 보여줘" -> outer join
join
하기 때문.select *
FROM buy
CROSS JOIN member;
-- 카테디산곱 (Cartesian Product)
-- 모든 경우의 수를 조합해서 relation을 생성하는 것. 그래서 별도의 조건이 없다.
-- =====================
추가로 본 유튜브 영상 / INNER JOIN, OUTER JOIN 개념 이해하기
-- ======================
- 좌우측 조인 테이블에 동일한 테이블을 사용하는 경우
- 같은 테이블 안에서 다른 행을 참조하는 경우
Tree(Fractal) 구조
부모자식관계 (카테고리, 회사 조직도, 특정 사이트 맵 등이 해당한다.)
같은 테이블 별칭을 다르게 해서 조인했다.
inner join을 쓰니까 null 값이 있어서 생략됐다.
left (outer) join으로 바꿔주면 12행이 다 나온다.
조직도로 EMP_ID와 MANAGER_ID 관계를 보자. (트리 구조 데이터)
일반적으로 자식쪽이 N, 부모쪽이 1인 관계를 가진다.
# 참조 표시를 할 때 '방향' 표시가 중요하다.
# 부모가 있어야 자식이 참조를 한다. child table -> parent table
-- employee.dept_code (자식) -> department.dept_id (부모)
-- department.location_id (자식) -> location.local_code (부모)
-- location.national_code (자식) -> nation.national_code (부모)
-- employee.job_code (자식) -> job.job_code (부모)
다중 조인에서는 조인 순서가 중요하다. employee -> department -> location -> nation
컬럼끼리 겹치는 게 있어야 한다.
잘못된 순서 예시
순서를 제대로 넣고 돌려보자. 두 개 컬럼이 같으면 조인이 된다.
내부 조인은 기준컬럼 dept_code가 null이면 빠지게 된다. dept_code가 null인 하동운, 이오리 사원의 행 2개가 내부 조인에서 제외됐다고 볼 수 있다.
원래 24행이었다.
22행으로 줄었다.
null이 있는 컬럼도 제외시키지 않고 보고 싶다면? 외부조인 실행
그런데 왜 이렇게 하면 24행이 다 안 나올까?
ㄴ 기준 컬럼에 null이 포함됐는데, 이후 계속 내부 조인이 되면서 null을 없앴기 때문이다. 이럴 때는 이후에 오는 것도 다 외부 조인으로 해줘야 한다.