DB 내부조인과 외부조인

allnight5·2023년 1월 12일
0

내부조인과 외부조인이 구분가지 않는다면
밴다이어그램을 보면서 이해하는것이좋다.

조인이란

두개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것입니다.

내부조인

두 테이블을 연결할때 가장 많이 사용된다.

내부조인의 형식

SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블> -- INNER JOIN은 'INNER' 생략가능
ON <조인될 조건>
[WHERE 검색 조건]

새션 maker_db에 buy테이블에서
SQL 블랙핑크(BLK)가 구매한 물건의 목록에 회원정보까지 합쳐서 보려면?

SELECT *
	FROM buy
	JOIN member
	ON buy.mem_id = member.mem_id
    
    order by member.mem_id;
--WHERE buy.mem_id = 'BLK';

where절 대신 order by를 사용해도 되며 buy대신 반대로 member을 넣어도
두 테이블이 겹치는부분만 출력되게 되며 두 테이블의 교집합만을 출력한다.

SELECT buy.mem_id, member.mem_name, buy.prod_name, member.addr
	FROM buy
		JOIN member
		ON buy.mem_id = member.mem_id;


-- 테이블 이름에 별칭을 붙이면
SELECT B.mem_id, M.mem_name, B.prod_name, M.addr
	FROM buy B
		JOIN member M
		ON B.mem_id = M.mem_id;

내부조인은 구매한 기록이 있는 회원들만 출력됩니다. 구매 테이블에 없는 전체 회원들까지 출력하고 싶으면 외부 조인을 사용해야 합니다.

외부조인

외부 조인은 두 테이블을 조인할 때 필요한 내용이 한쪽 테이블에만 있어도 결과를 추출할 수 있습니다.

SELECT < 목록>
FROM < 번째 테이블(LEFT 테이블)>
	<LEFT | RIGHT | FULL> OUTER JOIN < 번째 테이블(RIGHT 테이블)>
	ON <조인될 조건>
[WHERE 검색 조건];

right 테이블을 기준으로 right테이블이 모두 포함되며 겹치는 부분이 출력되는 방식이다.

use market_db;
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
	FROM member M
		right OUTER JOIN buy B
		ON M.mem_id = B.mem_id
	ORDER BY M.mem_id;

right 대신 left를 넣어준다면
left 테이블을 기준으로 left테이블이 모두 포함되며 겹치는 부분이 출력되는 방식이다.

use market_db;
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
	FROM member M
		left OUTER JOIN buy B
		ON M.mem_id = B.mem_id
	ORDER BY M.mem_id;

내부 조인과 외부조인 정리

내부 조인
두 테이블간 겹치는 특정 키 값을(foreign key를) ON 이라는 sql 키워드를 통해 설정하고, 두 테이블 간의 "겹치는" 부분만 출력되도록 했다.

외부 조인
마찬가지로 ON 키워드를 통해 join을 하며,
LEFT OUTER JOIN 은 LEFT 테이블(FROM 뒤에 오는 기준 테이블)의 모든 것 + RIGHT 테이블(JOIN 뒤에 오는 합치는 테이블)의 겹치는 부분만 을 보여준다. 반대의 경우도 같은 원리이며, FULL OUTER JOIN 은 두 테이블의 모든 값을 다 보여준다.

상호조인 자체조인 참조 사이트1

  • 상호조인 (cross join)
    CROSS JOIN이란? 서로 다른 Table의 모든 행과 행을 JOIN 하는 것을 의미.

CROSS JOIN의 결과 TABLE이 가지고 있는 ROW의 개수는 모두 몇 개일까요?
A. 정답은 바로!! (1번 Table 행 개수) X (2번 Table 행 개수)
※ 참고로 CROSS JOIN을 Cartesian Product(카티션곱)이라고 합니다

Q. CROSS JOIN은 왜 쓰는 걸까요?? 즉, CROSS JOIN의 용도는 무엇일까요??
그냥 TEST 용으로 대용량 DATA SET을 생성할 때 사용합니다.
예를 들면 부하 테스트나 대용량 데이터를 핸들링할 때 질의가 잘 되는지 확인하는 정도이죠.

Q. userTBL(회원 테이블)과 buyTBL(구매 테이블)을 CROSS JOIN 해 봅시다.

USE sqlDB;
SELECT * FROM buyTBL
   CROSS JOIN userTBL;
  • 자체조인 (self join)
    TABLE 1개가 있을 때, JOIN의 기준이 되는 TABLE에 '기준 TABLE 자신을 JOIN'하는 것을 의미합니다.
#TABLE 정의
USE sqlDB;
CREATE TABLE empTBL
(emp CHAR(3), -- 직워이름
 manager CHAR(3), -- 상관이름 aka. 매니저
 empTel VARCHAR(8) -- 해당 직원의 연락처 NOT 상관연락처
);  

Q. (사원명, 직속상관, 사원 전화번호) 이렇게 3개의 컬럼으로 구성된 간단한 조직도 TABLE을 정의하고,
그중 한 명의 사원을 골라, 해당 사원의 직속상관 연락처를 알아내 봅시다.

SELECT A.emp AS '부하직원', B.emp AS '직속상관', B.empTel AS '직속상관연락처'
FROM empTBL A -- 현재 기준이 되는 Table에 Alias로 'A'를 줍니다.
   INNER JOIN empTBL B -- 'B'라는 Alias로 자기자신(위의 A)와 Inner Join 합니다.  
    ON A.manager = B.emp -- Join 조건은 'A의 manager와 B의 emp가 같다.'입니다.
WHERER A.emp = '우대리'; -- '우대리'의 상관 번호가 알고 싶어!!

자체조인과 상호조인 SQL문 해석
1) TBL A의 emp, TBL B의 emp, TBL B의 empTel을 COLUMN으로 선택한다.
2) COLUMN을 가져오는 TBL은 TBL A이다.
3) 이때, TABLE A와 TABLE B를 이어 붙인다(교집합을 의미).
4) 두 테이블을 연결하는 부분(매치포인트)은 TABLE A의 MANAGER와 TABLE B의 EMP 값이 일치하는 순서이다.
5) 조회할 DATA의 조건은 WHERE절 아래로 TABLE A의 EMP_COL의 DATA VALUE가 '우대리'인 ROW만 RETURN 한다.

profile
공부기록하기

0개의 댓글