제수기 > SQL > DML/DQL > join

Eunbi Jo·2024년 12월 24일
0

제수기

목록 보기
13/90
post-thumbnail
'제수기' - '제발 수업내용을 기억해라'

Join

Join 개념

RDBMS(Relational DBMS) 관계형 DB을 먼저 살펴보자. 예를 들어서 tbl_menu : 4 - tbl_category : 4는 한식 이렇게 정보를 나눠둔다.

  • 나누는 이유는, 중복값을 제거하기 위해.

table = entity, relation

  • RDB에서 독립되게 나타낼 때 entity

  • join의 결과로 나타나는 table(entitiy)relation(entitiy + entitiy)
    🥪둘 다 table인데, 독립적일 때랑 합쳐진 table일 때랑 다르게 부른다.

  • join을 할 떄, 연관성이 있는 컬럼을 기준으로 조합을 한다. 구심점 역할을 하는 컬럼을 찾아서 한다.

  • tabletable의 행과 행을 연결한다.

  • 행과 행끼리 가로방향으로 이어진다.

  • union : entitiyentitiy가 있을 때 컬럼의 개수가 똑같으면 위 아래로 합치는 방법. 다음시간에 다뤄보겠다.

  • 결과적으로 union은 행수가 늘어난다. 그냥 합치니까. 더 간단하다. 그런데 join은 특정 조건을 만족하는 행과 행을 연결한다. 최종적으로 가로 방향으로 이어진 행들이 모여진 table이 된다.

Join에서
=를 썼으면 EQUI JOIN. 90%가 이거임.
non-equi join은 잘 안 씀. is null, between, and,,,, 등이 쓰임.

Equi join 중에서도 inner join, left outer join, right outer join이 가장 많이 쓰인다. 사실상 얘네만 쓰인다고 봐도 된다.


Equi join

  • m.categoty_code, c.category_code가 같으면 찾아서 샥 붙여준다. 결과적으로 가상컬럼이 늘어난다.

  • from에서 m, c이렇게 별칭을 지정해준다.

  • where 추가도 가능하다.


inner join

-- join 수행 시 기준 컬럼의 값이 null이거나, 
상대 테이블에 매칭되는 행이 없는 경우 resultset에 포함되지 않는다.
-- [inner] join : inner 키워드 생략 가능
  • tbal_category, tbl_menu1:N의 관계다. tbl_category4면, tbl_menu에서 4에 해당하는 행들을 붙이니까.
select < 목록>
from < 번째 테이블>
	inner join < 번째 테이블>
    on <조인될 조건>
where 검색 조건

🥪inner joinjoin이라고만 써도 join으로 인식한다.

outer join

select < 목록>
from < 번째 테이블(LEFT 테이블)>
	<LEFT | RIGHT | FULL> OUTER JOIN < 번째 테이블(RIGHT 테이블)>
    ON <조인될 조건>
WHERE 검색 조건;

🥪 inner join과 outer join의 쓰임새를 비교해보자.

상황1.
🗣️"메뉴 좀 보여줘봐"
🗨️"카테고리 지정이 안 된 메뉴는 어떻게 할까요?"
"빼고 보여줘" -> inner join
"그래도 봐야 할 거 같은데?" -> outer join

상황2.
🗣️"카테고리별로 메뉴를 보고 싶어"
🗨️"하나의 카테고리에 몇 개의 메뉴가 더 있을 수도 있는데, 그것도 같이 보여드릴까요? 아니면 그냥 카테고리별 메뉴 1개씩만 보여드릴까요?"
"아 그냥 빼고 보여줘" -> inner join
"다 보여줘" -> outer join

Cross join

  • ON 구문을 사용할 수 없다.
  • 결과의 내용은 의미가 없다. random으로 join하기 때문.
  • 주 용도는 테스트하기 위해 대용량의 데이터를 생성할 때이다.
select *
	FROM buy
    CROSS JOIN member;

-- 카테디산곱 (Cartesian Product)
-- 모든 경우의 수를 조합해서 relation을 생성하는 것. 그래서 별도의 조건이 없다.

-- =====================

추가로 본 유튜브 영상 / INNER JOIN, OUTER JOIN 개념 이해하기

-- ======================

Self 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

  • 컬럼끼리 겹치는 게 있어야 한다.

  • 잘못된 순서 예시

  • 순서를 제대로 넣고 돌려보자. 두 개 컬럼이 같으면 조인이 된다.

최종 relation에 모든 행 포함시키기

내부 조인은 기준컬럼 dept_code가 null이면 빠지게 된다. dept_code가 null인 하동운, 이오리 사원의 행 2개가 내부 조인에서 제외됐다고 볼 수 있다.

  • 원래 24행이었다.

  • 22행으로 줄었다.

  • null이 있는 컬럼도 제외시키지 않고 보고 싶다면? 외부조인 실행

  • 그런데 왜 이렇게 하면 24행이 다 안 나올까?
    ㄴ 기준 컬럼에 null이 포함됐는데, 이후 계속 내부 조인이 되면서 null을 없앴기 때문이다. 이럴 때는 이후에 오는 것도 다 외부 조인으로 해줘야 한다.

0개의 댓글