멋쟁이 사자처럼 20회차 ( 03 / 27 )
[학습목표]
1. 조인의 개념과 종류를 이해하고 INNER JOIN, OUTER JOIN , CROSS JOIN 의 차이를 설명할 수 있다. 2. ON, USING, NATURAL JOIN을 활용하여 두 개 이상의 테이블을 조인하고 원하는 데이터를 추출할 수 있다. 3. 실무에서 필요한 SELF JOIN과 EQUI JOIN을 적용하여 계층 구조 및 조건 기반 데이터 연결을 구현할 수 있다. 4. 데이터 레코드 기반의 엔티티를 이용하여 합집합, 교집합, 차집합 등 집합 연산을 구현하고 설명할 수 있다. 5. 서브 쿼리를 이해하고 설명 할 수 있다. |
INNER JOIN, OUTER JOIN , CROSS JOIN
1) INNER JOIN
두 테이블에서 일치하는 값만 출력되며, NULL과 False는 모두 제외된다.
ON 또는 USING을 사용하여 조인 조건을 명시한다.
[ON 사용 예시]
-- 컬럼명이 다를 때
SELECT columns
FROM table1
INNER JOIN table2
ON table1.common_column = table2.common_column;
[USING 사용 예시]
-- 컬럼명이 같을 때
SELECT columns
FROM table1 JOIN table2
USING (common_column);
같은값만 추출 / false, null 추출 되지 않는다.
두 테이블 모두에 일치하는 항목이 있으면 행을 반환
조인된 테이블의 행이 일치하지 않으면 행이 반환되지 않는다.
ex)
-- ANSI -- 칼럼명이 같을 때 USING
SELECT ENAME , DNAME
FROM EMP INNER JOIN DEPT USING(DEPTNO);
SELECT *
FROM X JOIN Y ON X1 = Y1;
2) OUTER JOIN
주종 관계를 만들어서 주 테이블은 전체출력, 종테이블은 True값만 출력된다.
OUTER JOIN에는 LEFT, RIGHT, FULL의 세 가지 유형을 갖는다.
한 테이블의 모든 행과 다른 테이블의 일치하는 행을 반환하는 데 사용된다.
일치하는 항목이 없으면 NULL 값을 사용하여 일치 항목이 없는 테이블의 열을 채운다.
- LEFT OUTER JOIN (왼쪽 기준 차집합):
왼쪽 테이블의 모든 데이터는 출력하고, 오른쪽 테이블에서 일치하는 값만 출력된다.
일치하지 않는 오른쪽 데이터는 NULL로 채워진다. (주테이블의 COUNT()에 맞추어서 종테이블의 NULL 값이 채워지는 결과 확인할 수 있다. 그리고 종 테이블의 COUNT()가 주테이블 보다 클 때 TRUE 값에 의한 행의 리턴에 의해 주테이블의 값이 늘어나는 것을 확인할 수 있다. )
ex)
-- Y를 주테이블로 만드로 X 종으로 지정하자 LEFT OUTER JOIN
SELECT *
FROM X LEFT OUTER JOIN Y
ON X1 = Y1;
[실행 결과]
- RIGHT OUTER JOIN (오른쪽 기준 차집합):
오른쪽 테이블의 모든 데이터는 출력하고, 왼쪽 테이블에서 일치하는 값만 출력된다.
일치하지 않는 왼쪽 데이터는 NULL로 채워진다. ( LEFT OUTER JOIN과 같이 주테이블의 COUNT()에 맞추어서 종테이블의 NULL 값이 채워지는 결과 확인할 수 있다. 그리고 종 테이블의 COUNT()가 주테이블 보다 클 때 TRUE 값에 의한 행의 리턴에 의해 주테이블의 값이 늘어나는 것을 확인할 수 있다. )
ex)
-- Q4-1. Y를 주테이블로 만들고 X를 종으로 지정하자. RIGHT OUTER JOIN
SELECT *
FROM X RIGHT OUTER JOIN Y
ON X1 = Y1;
[실행 결과]
- FULL OUTER JOIN (합집합):
왼쪽과 오른쪽 테이블의 모든 데이터를 출력하고,일치하지 않는 부분은 NULL로 채워진다.
MySQL에서는 LEFT JOIN과 RIGHT JOIN을 UNION으로 합쳐 구현한다.
FULL OUTER JOIN = RIGHT OUTER JOIN + LEFT OUTER JOIN / UNION(중복항목x ), UNION ALL(중복항목 O)
1) UNION 앞의 쿼리에서 Y의 모든 레코드를 검색하고 X테이블에 일치하는 레코드를 검색한다.
2) UNION 뒤의 쿼리에서 Y의 모든 레코드를 검색하고 X테이블에 일치하는 레코드를 검색한다.
3) UNION은 두개의 결과 레코드를 결합해서 리턴한다.
4) UNION 쿼리는 두개 쿼리 결과 부분에서 열의 개수와 유형일치를 확인한다.
5) 중복행 제거 후 결합한다.
ex)
SELECT *
FROM X RIGHT OUTER JOIN Y
ON X1 = Y1
UNION
SELECT *
FROM Y LEFT OUTER JOIN X
ON X1 = Y1;
[실행 결과]
ex)
SELECT X1,X2 FROM X
UNION ALL
SELECT Y1,Y2 FROM Y;
[실행 결과]
NATURAL JOIN
두 테이블에서 컬럼명이 같은 컬럼들을 자동으로 조인하며, 명시적으로 ON이나 USING 없이 동작하지만 명확성이 떨어져 실무에서는 잘 사용하지 않는다.
ex)
SELECT *
FROM EMP NATURAL JOIN DEPT;
[실행 결과]
EMP의 deptno와 DEPT의 deptno가 같은 컬럼으로 자동으로 조인하여 위와 같은 결과가 나온 것을 볼 수 있다.
SELF JOIN과 EQUI JOIN와 CROSS JOIN
1) SELF JOIN
한 테이블을 자기 자신과 조인하여 상위-하위 관계나 계층 구조를 표현할 때 사용한다.
ex)
SELECT 사원.EMPNO , 사원.ENAME , 관리자.EMPNO , 관리자.ENAME
FROM EMP 사원 LEFT OUTER JOIN EMP 관리자 ON (사원.MGR = 관리자.EMPNO);
2) EQUI JOIN (동등 조인)
=(동등 연산자)를 사용하여 조건을 지정하고, 테이블 간 일치하는 값[여러 개의 컬럼의 범위]만 추출하는 방식으로, 사실상 INNER JOIN과 동일하게 동작한다.
ex)
SELECT ENAME , SAL , GRADE AS 등급
FROM EMP , SALGRADE
WHERE SAL >= LOSAL AND SAL <= HISAL;
3) CROSS JOIN (데카르트 곱)
두 테이블의 모든 데이터를 서로 곱해서 조합한 결과를 출력한다.
결과 행 수가 첫 번째 테이블 행 수 × 두 번째 테이블 행 수가 된다.
ex)
SELECT *
FROM EMP CROSS JOIN DEPT;