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 |