JOIN 방식
다수의 테이블의 필요한 데이터끼리 결합할 때 JOIN 방식을 사용
분리된 데이터 간의 공통된 정보, 즉 동일한 열값 또는 키값 기준으로 데이터를 논리적으로 연결할 수 있음
예제 참고 테이블
내부 조인 (Inner JOIN)
내부조인(inner join)은 교집합에 해당하는 방식
양쪽에 모두 존재하는 데이터만 반환
SELECT 학생.학번, 학생.이름, 지도교수.교수명
FROM 학생
JOIN 지도교수
ON 학생.학번 = 지도교수.학번
JOIN 키워드에는 JOIN 대상 테이블을 작성하고 ON 절에는 JOIN 할 비교 조건을 작성 (inner 생략 가능)
암시적 JOIN (내부 조인 결과 동일)
SELECT 학생.학번, 학생.이름, 지도교수.교수명
FROM 학생, 지도교수
WHERE 학생.학번 = 지도교수.학번
왼쪽 외부 조인 (LEFT OUTER JOIN)
왼쪽 외부 조인(left outer join)은 왼쪽 테이블(먼저 작성된 테이블) 기준으로 오른쪽 테이블(나중에 작성된 테이블)과 JOIN을 수행하지만, JOIN 조건이 일치하지 않더라도 왼쪽 테이블 결과는 최종 결과에 포함
키워드로 LEFT OUTER JOIN 또는 LEFT JOIN을 작성 (outer 생략 가능)
SELECT 학생.학번, 학생.이름, 지도교수.교수명
FROM 학생
LEFT OUTER JOIN 지도교수
ON 학생.학번 = 지도교수.학번
오른쪽 외부 조인 (RIGHT OUTER JOIN)
왼쪽 외부 조인(right outer join)은 오른쪽 테이블(나중에 작성된 테이블) 기준으로 왼쪽 테이블(먼저 작성된 테이블)과 JOIN을 수행하지만, JOIN 조건이 일치하지 않더라도 오른쪽 테이블 결과는 최종 결과에 포함
왼쪽 외부 조인 방식과 정반대 방식으로 동작
SELECT 지도교수.학번, 학생.이름, 지도교수.교수명,
FROM 학생
RIGHT OUTER JOIN 지도교수
ON 학생.학번 = 지도교수.학번
* 비고
99번 학생은 퇴학 또는 자퇴 상태로 학생 테이블에서는 이미 데이터가 삭제되었으나, 지도교수 테이블에는 남아 있는 가비지 데이터(garbage data)라고 추측할 수 있음
교차 조인(CROSS JOIN)
교차 조인(cross join)은 수학적 관점에서 봤을 때 데카르트 곱이라고 하는 곱집함 개념으로, JOIN에 참여하는 테이블에서 발생할 수 있는 모든 조합을 찾아내어 반환
모든 경우의 수가 출력 대상이므로 내부 조인에 비해 많은 데이터양을 얻을 수 있음
JOIN 연산과정의 시간적, 공간적 리소스 점유 측면에서 오버헤드가 발생하는 만큼 주의 필요
SELECT 학생.학번, 학생.이름,
지도교수.학번, 지도교수.교수명
FROM 학생
CROSS JOIN 지도교수
암시적 교차 JOIN (교차 조인 결과 동일)
SELECT 학생.학번, 학생.이름,
지도교수.학번, 지도교수.교수명
FROM 학생, 지도교수
자연 조인(NATURAL JOIN)
자연 조인(natural join)은 2개 테이블에 동일한 열명이 있을 때 JOIN 조건절을 따로 작성하지 않아도 자동으로 JOIN을 수행해주는 방식
JOIN이 제대로 성사되면 내부 JOIN과 동일한 결과 출력
SELECT 학생.*, 지도교수.*
FROM 학생
NATURAL JOIN 지도교수
학생 테이블과 지도교수 테이블에 동일하게 존재하는 학번 열을 토대로 JOIN이 됨
아래 쿼리문과 동일한 결과
SELECT * FROM 학생
JOIN 지도교수 ON 학생.학번=지도교수.학번
만약, 존재하는 열명이 하나도 없는 경우
SELECT 학생.*, 지도교수.*
FROM 학생
NATURAL JOIN 지도교수
동일한 열명이 없다면 발생 가능한 경우의 수를 모두 조합하는 교차조인으로 수행이 됨
즉, 자연조인은 동일한 열명이 있을 때는 내부 조인으로 수행, 동일한 열명이 없을 때는 교차 조인으로 수행
자연 조인은 열명 변경에 따라 출력 결과가 달라지며 의도치 않은 결과로 출력될 가능성이 높아 일반적으로 잘 활용되지 않음
* 참고
'MYSQL' 카테고리의 다른 글
[MYSQL] 개념적인 튜닝 용어 (0) | 2023.06.29 |
---|---|
[MYSQL] JOIN 알고리즘 용어 (0) | 2023.06.28 |
[MYSQL] 서브쿼리 위치, 메인쿼리와의 관계성, 반환 결과에 따른 SQL 용어 (0) | 2023.06.26 |
[MYSQL] DB 엔진, SQL 프로세스 용어 (0) | 2023.06.25 |
[MYSQL] SQL 쿼리문 최적화 - 효율적인 쿼리를 위한 팁 (1) | 2023.05.29 |
댓글