→ 실선과 점선의 차이는 제약조건(데이터 무결성)의 차이다. → countrylanguage는 복합키(CountryCode, Language)를 가진다.
ERD 점선과 실선의 차이
점선 : 비식별관계
부모테이블의 PK가 자식테이블의 일반 속성인 경우
부모 자식 관계가 아닌 그냥 참조 관계가 됩니다.
실선 : 식별관계
부모테이블의 PK가 자식테이블의 PK에 포함되는 경우
부모가 있어야 자식이 생길 수 있습니다.
JOIN
INNER JOIN
JOIN문의 기본값이며, 조건에 맞는 값만 출력됩니다. (교집합)
이때 테이블의 주종관계에 상관없이 조건에 맞는 데이터가 출력되며, 작성 순서는 출력 순서에만 지장이 갈 뿐 데이터 결과에는 아무런 지장을 주지 않습니다.
SELECT * FROM X JOIN Y ON X1 = Y1;
만약 컬럼명이 동일하다면 USING을 사용해서 조회할 수도 있습니다.
-- EMP 테이블에도 DEPT 테이블에도 DEPTNO 컬럼이 존재할 때
SELECT ENAME, DNAME FROM EMP JOIN DEPT USING(DEPTNO);
OUTER JOIN
outer join의 종류에는 LEFT, RIGHT, FULL 세가지가 있습니다.
위치에 따라 지정된 테이블을 주 테이블로 반대쪽 테이블을 종테이블로 지정하여 주-종 관계를 결정하게 됩니다.
주 테이블의 모든 행과 종 테이블의 일치하는 행을 반환하는 데 사용하며, 일치하는 항목이 없다면 NULL 값을 채워 출력하게 됩니다.
LEFT OUTER JOIN
왼쪽에 있는 테이블을 주 테이블로 설정하여 조회된 결과를 출력하며, 오른쪽에 있는 테이블을 종 테이블로 지정하여 조건에 맞는 값이 존재한다면 출력, 존재하지 않는다면 NULL로 채워서 출력됩니다. (차집합)
SELECT *
FROM X LEFT OUTER JOIN Y
ON X1= Y1;
X테이블 위주의 데이터가 출력되며, Y테이블은 X테이블과의 조건에 맞는 데이터(X1= Y1)만 엮어서 출력하게 되는 것입니다.
RIGHT OUTER JOIN
오른쪽에 있는 테이블을 주 테이블로 설정하여 전체 조회를 하며, 왼쪽에 있는 테이블은 종 테이블이 되어 조건에 맞는 값이 존재한다면 출력, 존재하지 않다면 NULL로 채워 출력됩니다. (차집합)
SELECT *
FROM x RIGHT OUTER JOIN Y
ON X1= Y1;
Y테이블 위주의 데이터가 출력되며, X테이블은 Y테이블과의 조건에 맞는 데이터(X1= Y1)만 엮어서 출력하게 되고 일치하는 데이터가 없다면 NULL로 출력되는 것입니다.
💡 조건에 맞는 데이터가 여러개라면? LEFT, RIGHT OUTER JOIN 조회 시 일치되는 조건이 여러개라면 맞는 조건의 모든 경우가 교차되어 출력됩니다. 즉, 조건에 맞는 데이터 중 종테이블의 개수가 주테이블 보다 크다면 주테이블의 출력 개수가 늘어나는 것을 확인 할 수 있습니다. SELECT * FROM X LEFT OUTER JOIN Y ON X1= Y1;
X의 C값이 세개이고 Y의 C 값이 1개일 때 출력 결과X의 C값이 세개이고 Y의 C 값이 2개일 때 출력 결과
FULL OUTER JOIN
양 테이블이 모두 주테이블이 되어 모든 조합이 출력되며, MySQL에는 FULL OUTER JOIN이라는 문법이 없어 UNION으로 테스트 해 볼 수 있습니다. (합집합)
SELECT *
FROM X RIGHT OUTER JOIN Y
ON X1= Y1
UNION
SELECT *
FROM X LEFT OUTER JOIN Y
ON X1= Y1;
UNION 동작 과정
UNION 앞의 쿼리에서 Y의 모든 레코드를 검색하고 X테이블에 일치하는 레코드를 검색한다.
UNION 뒤의 쿼리에서 X의 모든 레코드를 검색하고 Y테이블에 일치하는 레코드를 검색한다.
UNION은 두개의 결과 레코드를 결합해서 리턴한다.
UNION 쿼리는 두개 쿼리 결과 부분에서 열의 개수와 유형일치를 확인한 후 중복을 제거한다. → UNION ALL을 사용하면 중복이 제거되지 않고 출력됩니다.
주로 사용하는 조인은 INNER JOIN과 OUTER JOIN이며 이외의 몇가지 조인은 설명만 작성하고 마무리 하겠습니다.
이외의 조인
CROSS JOIN (데카르트 곱)
두 테이블의 모든 데이터를 서로 곱해서 조합한 결과를 출력합니다. (a테이블 행 * b테이블 행)
두 테이블의 모든 데이터를 서로 곱해서 조합한 결과를 출력한다. 결과 행수가첫 번째 테이블 행수X두 번째 테이블 행 수가 된다.
SELF JOIN (자기자신 조인) : NULL
한 테이블을 자기 자신과 조인하여 상위-하위 관계나 계층 구조를 표현할 때 사용한다. (주종관계)
NATURAL JOIN:
두 테이블에서 컬럼명이 같은 컬럼들을 자동으로 조인하며, 명시적으로 ON이나 USING 없이 동작하지만 명확성이 떨어져 실무에서는 잘 사용하지 않는다.
EQUI JOIN (동등 조인)
=(동등 연산자)를 사용하여 조건을 지정하고, 테이블 간 일치하는 갑[여러개의 컬럼의 범위] 만 추출하는 방식으로, 사실상 INNER JOIN과 동일하게 동작한다.