정규화와 JOIN
정규화
이상현상 발생을 피하기 위해 테이블을 분할
학계 / 실무에서 주로 3차 정규형을 사용한다.
JOIN
데이터의 통합 조회를 위해 여러 테이블들을 연결한다.
실제 JOIN 연산은 두 개의 테이블에 대해서만 적용된다.
일반적인 경우 PK / FK의 연관에 의해 JOIN이 성립한다.
우선 EMP 테이블 (직원)
DEPT 테이블 (부서)
SALGRADE 테이블 (급여 등급)
이 세 가지 테이블을 이용해 실습하자
JOIN의 유형
1) 동등 조인 / 비동등 조인
2) 내부 조인 / 외부 조인 / 크로스 조인 / 셀프 조인
3) 암시적 조인 / 명시적 조인
1) 동등 조인 / 비동등 조인
동등 조인
조인 조건으로 Equal 연산 사용한다.
중복 칼럼의 경우, 칼럼명 앞에 테이블을 붙여야 한다.
중복되지 않는 칼럼도 칼럼명 앞에 테이블명을 붙이는 것을 권장한다.
ex ) 사원명, 부서번호(EMP의), 부서명 출력
// EMP 테이블에 부서명이 없으니 동등 조인해서 가져온다.
SELECT EMP.ENAME, EMP.DEPTNO, DEPT.DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
위 코드에서 ALIAS 사용하기 ( 사용할거면 다른 절에서도 제대로 적용하자 )
SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
비동등 조인
조인 조건으로 Equal 이외의 연산을 사용한다.
Q) EMP 테이블과 SALGRADE 테이블로부터 사원명, 급여, 급여 등급을 출력하는 질의를 완성하시오
SELECT E.ENAME 사원명, E.SAL 급여, S.GRADE 급여등급
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN LOSAL AND HISAL;
2) 내부 조인 / 외부 조인 / 크로스 조인 / 셀프 조인
내부 조인
서로 대응되는 내용만 검색하는 조인이다.
조인절을 필수로 사용한다. 조인의 Default 이므로 "INNER" 생략 가능하다.
암시적 조인 (가독성이 떨어짐)
SELECT E.ENAME, E.DEPTNO, E.SAL, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E.SAL > 2000;
명시적 조인 (표준)
SELECT E.ENAME, E.DEPTNO, E.SAL, D.DNAME
FROM EMP E INNER JOIN DEPT D -- 여기서 "INNER"는 생략 가능
ON E.DEPTNO - D.DEPTNO
WHERE E.SAL > 2000;
Q ) 이름에 'S' 포함하는 사원의 사원이름, 부서코드, 부서명 출력
SELECT E.ENAME 사원이름, E.DEPTNO 부서코드, D.DNAME 부서명
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE E.ENAME LIKE '%S%';
NATURAL 조인
내부 조인의 특수한 경우다.
두 테이블 간 동일한 이름을 갖는 모든 칼럼들에 대해 동등 조인을 수행한다.
조인의 대상이 되는 칼럼에는 ALIAS 사용할 수 없다.
Q ) 다음 NATURAL 조인과 동일한 출력 갖는 내부 조인 질의를 작성하시오.
SELECT EMPNO, ENAME, DEPTNO, DNAME
FROM EMP NATURAL JOIN DEPT;
A )
-- 암시적 조인
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
-- 명시적 조인
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
-- 위 ON 조건절을 아래의 USING 조건절로 바꿀 수도 있다.
-- ON E.DEPTNO = D.DEPTNO; 을 USING DEPTNO; 변경 가능
외부 조인
서로 대응되지 않는 행도 출력하는 조인이다.
조건절을 필수로 사용한다.
성능 저하 원인이 될 수도 있으니 필요한 경우만 사용하자
LEFT OUTER JOIN
왼쪽 테이블의 데이터를 모두 읽은 후 오른쪽 테이블에서 JOIN 데이터를 가져온다.
RIGHT OUTER JOIN
오른쪽 테이블의 데이터를 모두 읽은 후 왼쪽 테이블에서 JOIN 데이터를 가져온다.
SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
FULL OUTER JOIN
양쪽 테이블의 데이터를 모두 읽은 후, 상대 테이블에서 JOIN 테이블을 가져온다.
SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
-- 위 코드와 아래 코드는 동일 (합집합)
SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
UNION
SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
CROSS JOIN(교차 조인)
두 테이블의 곱집합을 출력하는 조인이다.
별도의 조인 조건이 없다.
SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME
FROM EMP E CROSS JOIN DEPT D; -- 14 * 4 해서 56 행 출력됨
Q ) 다음 5가지 JOIN으로 생성되는 각 결과 레코드 수는?
SELECT S.DEPT, D.D_ID
FROM STUDENT S INNER JOIN DEPT D
ON S.DEPT = D.D_ID;
-- 정답 : 3개
SELECT S.DEPT, D.D_ID
FROM STUDENT S CROSS JOIN DEPT D;
-- 정답 : 12개
SELECT S.DEPT, D.D_ID
FROM STUDENT S LEFT OUTER JOIN DEPT D
ON S.DEPT = D.D_ID;
-- 정답 : 4개
SELECT S.DEPT, D.D_ID
FROM STUDENT S RIGHT OUTER JOIN DEPT D
ON S.DEPT = D.D_ID;
-- 정답 : 4개
SELECT S.DEPT, D.D_ID
FROM STUDENT S FULL OUTER JOIN DEPT D
ON S.DEPT = D.D_ID;
-- 정답 : 5개
SELF JOIN (셀프 조인)
동일 테이블 사이의 조인
FROM 절에 동일 테이블이 두 번 이상 나타난다.
테이블 식별을 위해 반드시 ALIAS를 사용해야 한다.
동일한 테이블을 개념적으로 서로 다른 두 개의 테이블로 사용한다.
FROM EMP E INNER JOIN EMP M
Q ) EMP 테이블로부터 사원의 사번과 이름, 매니저의 사번과 이름을 출력하기 위한 질의 작성
(단, 매니저가 없는 사원의 정보도 출력되어야 한다.)
SELECT E.EMPNO, E.ENAME, M.EMPNO MGRNO, M.ENAME MNAME
FROM EMP E LEFT OUTER JOIN EMP M
ON E.MGR = M.EMPNO
'전공 지식 정리 > 데이터베이스 설계' 카테고리의 다른 글
데이터베이스 SQL - Subquery (0) | 2022.12.19 |
---|---|
데이터베이스 SQL - TCL, DCL (0) | 2022.11.30 |
데이터베이스 SQL - Multi-row Function (다중 행 함수) (0) | 2022.11.29 |
데이터베이스 SQL - Function (0) | 2022.11.28 |
데이터베이스 SQL문 DDL (0) | 2022.10.24 |