[SQLD] JOIN
노랭이 풀다 2-2에서 막혀서 공부하는 조인...ㅋ

정규화
- 이상현상 발생을 피하기 위해 테이블을 분할
- 학계/실무에서 주로 3NF(3차 정규형) 사용
JOIN
- 데이터의 통합 조회를 위해 여러 테이블들을 연결
- 실제 JOIN 연산은 두 개의 테이블에 대해서만 적용됨
- 일반적인 경우 PK/FK의 연관에 의해 JOIN이 성립
- 그 외에도 논리적인 값들의 연관성만으로 JOIN 성립 가능
JOIN의 유형
- Equi Join / Non-Equi Join
- 암시적 조인 / 명시적 조인
- Inner Join / Outer Join / Cross Join / Self Join
EQUI JOIN(동등 조인)
- 조인 조건으로 Equal(=) 연산 사용
- 중복 칼럼의 경우, 칼럼명 앞에 테이블명을 붙여야 함
- 중복되지 않는 칼럼도 칼럼명 앞에 테이블명을 붙이는 것을 권장
- 예) 선수명, 팀 아이디, 팀명을 출력
테이블명이 긴 경우 ALIAS 사용
- 셋 이상 테이블의 조인은 실제로는 두 테이블 간 조인이 연쇄적으로 일어남
Non EQUI JOIN
- 조인 조건으로 Equal (=) 이외의 연산 사용
- Between, >, >=, <, <= 등
- 예) 사원별 급여 등급 조회
- Q) EMP 테이블과 SALGRADE 테이블로부터, 사원명, 급여, 급여등급을 출력하는 질의를 완성하시오
INNER JOIN(내부 조인)
- 서로 대응되는 내용만 검색하는 조인
- 조건절을 필수로 사용
- 조인의 Default이므로 "INNER" 생략 가능
- INNER JOIN = JOIN
- 중복되는 칼럼에 반드시 접두사를 써야 한다
NATURAL JOIN
- INNER JOIN의 특수한 경우
- NATURAL INNER JOIN = NATURAL JOIN
- 두 테이블 간 동일한 이름을 갖는 모든 칼럼들에 대해 EQUL JOIN 수행
- 칼럼 간 데이터 타입도 동일해야 함
- 별도의 조인 칼럼 및 조건을 지정할 수 없음
- 조인의 대상이 되는 칼럼에는 접두사(테이블명 또는 ALIAS)를 사용할 수 없음
ON 조건절
- 암시적 JOIN
- 모든 조건을 WHERE절에 기술
- 명시적 JOIN
- JOIN 기준 조건은 ON절에 기술
- ON절의 괄호는 생략 가능
- JOIN과 무관한 일반 조건은 WHERE 절에 기술
- 예) 이름에 'S'를 포함하는 사원의 사원 이름, 부서 코드, 부서명 출력
USING 조건절
- ON절의 "=" 연산자 대신 USING 절 사용 가능
- ON절에서는 괄호 생략 가능, USING 서는 괄호 생략 불가
- 접두사를 사용할 수 없음
WHERE, ON, USING절 조건 기술 비교
OUTER JOIN
- 서로 대응되지 않는 행도 출력하는 조인
- 조건절을 필수로 사용
- 성능저하의 원인이 될 수 있으므로 필요한 경우만 사용
- LEFT OUTER JOIN
- 왼쪽 테이블의 데이터를 모두 읽은 후, 오른쪽 테이블에서 JOIN 데이터를 가져옴
- 오른쪽 테이블이 JOIN조건에 해당되지 않는 경우, 해당 칼럼은 NULL로 채
- RIGHT OUTER JOIN
- 오른쪽 테이블의 데이터를 모두 읽은 후, 왼쪽 테이블에서 JOIN 데이터를 가져옴
- 왼쪽 테이블이 JOIN 조건에 해당되지 않는 경우, 해당 칼럼은 NULL로 채움
- FULL OUTER JOIN
- 양쪽 테이블의 데이터를 모두 읽은 후, 상대 테이블에서 JOIN 데이터를 가져옴
- JOIN 조건에 해당되지 않는 경우, 해당 칼럼은 NULL로 채움
CROSS JOIN(교차 조인)
- 두테이블의 곱집합을 출력하는 조인
- 별도의 조인 조건이 없음
SELF JOIN
- 동일 테이블 사이의 조인
- FROM절에 동일 테이블이 두 번 이상 나타남
- 테이블 식별을 위해 반드시 별칭(Alias)를 사용해야 함
- 동일한 테이블을 개념적으로 서로 다른 두 개의 테이블로 사용함
- 예) FROM EMP E INNER JOIN EMP M
SELECT E.EMPNO, E.ENAME, M.EMPNO MGRNO, M.ENAME MNAME
FROM EMP E LEFT JOIN EMP M
ON E.MGR = M.EMPNO;
계층형 데이터
- 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터
- 엔터티가 순환관계 모델로 설계된 경우 발생
- 계층형 질의를 통해 접근 가능
- START WITH -시작 조건 지정
- 예) START WITH MGR IS NULL
- 예) START WITH EMPNO = 'D'
- CONNECT BY - 다음에 전개될 방향 지정
- (순방향) PRIOR 자식 = 부모
- 예) CONNECT BY PRIOR EMPNO = MGR
- (역방향) PRIOR 부모 = 자식
- 예) CONNECT BY PRIOR MGR = EMPNO
집합 연산자 개요
- 여러 질의(SELECT문) 결과를 하나로 결합하기 위해 사용
- 집합 연산의 대상이 되는 두 질의는...
- SELECT절의 칼럼 수가 동일해야 하고
- SELECT절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환 가능해야 함
- 반드시 동일한 데이터 타입일 필요는 없음
집합 연산 질의 예
- 집합 연산은 둘 이상의 SELECT문을 결합하는 것
- ORDER BY는 집합 연산을 적용한 최종 결과에 대한 정렬
- 맨 마지막 줄에 한 번만 기술함
UNION ALL
- 이질적 성격의 데이터를 한꺼번에 출력하는 연산도 가능
- 출력 칼럼의 칼럼명은 첫 SELECT 문의 칼럼명이 적용됨
ORDER BY 구분코드, POSITION -> ERROR!!
INTERSECT
- INTERSECT 연산자는 IN 서브쿼리, EXISTS 서브쿼리로도 표현 가능
-> 서브쿼리에서 설명
MINUS