JangGeonWu
janggeonwu97
JangGeonWu
전체 방문자
오늘
어제
  • 분류 전체보기 (78)
    • SQLD (21)
    • 개인 공부용 (17)
    • Django (9)
    • Tableau (6)
    • ElasticSearch (8)
    • 빅데이터 엔지니어 (5)
    • Spring 퀵 스타트 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 개인 공부 기록용 블로그

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
JangGeonWu

janggeonwu97

SQLD

1-2-2. 관계와 조인의 이해

2022. 9. 19. 16:45

1. 조인

[고객]

고객번호 고객명
100 정우진
101 한형식
102 황영은

[주문]

주문번호 고객번호 주문상태코드
1101 100 주문완료
1102 101 주문완료
1103 101 취소요청
1104 102 환불요청
1105 100 교환완료

위의 표에서, '주문번호가 1101인 주문의 고객명은 누구인가?'라는 질문에, '정우진'이라는 답을 할 수 있다. 이를 풀어보면 다음과 같다. 

 ㄱ. 주문 데이터에서 주문번호가 1101인 데이터를 찾는다

 ㄴ. 주문번호가 1101인 데이터의 행에서 고객번호가 100임을 확인한다.

 ㄷ. 고객 데이터에서 고객번호가 100인 데이터의 고객명에서 '정우진'을 확인한다.

 

이것이 바로 관계를 활용한 조인이다.

고객 테이블과 주문 테이블을 '조인'한 것이고, 여기서 '고객번호 = 조인 키(Join Key)'이다. 이를 SQL로 작성하고, 앞 순서와 연결해 본다면 다음과 같을 것이다.

 

SELECT B.고객명
   FROM 주문 A, 고객 B
  WHERE A.주문번호 = '1101' AND A.고객번호 = B.고객번호

 

2. 계층형 데이터 모델: 계층 구조를 가진 데이터

 - 일반적으로는 관계는 서로 다른 두 엔터티 간에 발생한다. 하지만 자기 자신과 관계가 발생하는 경우도 있다. 다음 경우를 보자.

 

EMPNO ENAME JOB MGR_EMPNO SAL DEPTNO
7369 SMITH CLERK 7902 800 20
7902 FORD ANALYST 7566 3000 20

MGR_EMPNO는 '각 사원 관리자의 사원번호'를 의미한다. 즉, smith의 관리자는 사원번호가 7902인 ford가 된다. 그러면 ford의 관리자는? 사원번호가 7566인 누군가일 것이다.

 

SELECT B.NAME
   FROM EMP A, EMP B
   WHERE A.ENAME = 'SMITH'
   AND A.MGR_EMPNO = B.EMPNO

이처럼 자기 자신을 조인한 것을 셀프 조인(Self-Join)이라고 한다.

이러한 계층형 데이터 모델의 이해는 추후 계층형 쿼리(Connect By 절)에서 유용하게 쓰인다.

 

3. 상호 배타적 관계

- 상호 배타적(Exclusive-OR) 관계는, '여러 엔터티 중 하나만 상속될 수 있음'을 의미한다. 다음 예시를 보도록 하자.

 

주문번호 고객구분코드 개인 / 법인번호
1101 A00 000000-00000000
1102 B99 111-11-111111

위의 표에서, 주문 엔터티의 '개인/법인번호'는 둘 중 하나만 상속될 수 있음을 의미한다. 이때, 주문번호가 1101인 주문의 주문자명을 보고 싶을 때는 어떻게 해야 할까?

개인번호와 법인번호가 중복되지 않는다는 전제가 있으면, 아래와 같이 코드를 작성하면 된다.

SELECT COALESCE(B.개인고객명, C.법인명) 고객명
 FROM 주문 A LEFT OUTER JOIN 개인고객 B
 ON (A.개인/법인번호 = B.개인번호) LEFT OUTER JOIN 법인고객 C
 ON (A.개인/법인번호 = C.법인번호)
 WHERE A.주문번호 = 1101;

위의 SQL 문에서, COALESCE는 표현식 목록에 널(NULL)이 아닌 첫 표현식을 리턴한다. 즉, 둘 중 하나는 NULL이기 때문에 COALESCE 함수를 사용하는 것이다.

이후 개인번호/법인번호에 맞추어 LEFT OUTER JOIN을 연달아 수행한다.

 

 

 

 

 

 

 

 

'SQLD' 카테고리의 다른 글

1-2-4. NULL 속성의 이해  (0) 2022.09.19
1-2-3. 모델이 표현하는 트랜잭션의 이해  (0) 2022.09.19
1-2-1. 정규화  (0) 2022.09.19
1-1-5. 식별자  (1) 2022.09.19
1-1-4. 관계  (0) 2022.09.19
    'SQLD' 카테고리의 다른 글
    • 1-2-4. NULL 속성의 이해
    • 1-2-3. 모델이 표현하는 트랜잭션의 이해
    • 1-2-1. 정규화
    • 1-1-5. 식별자
    JangGeonWu
    JangGeonWu

    티스토리툴바