본문 바로가기

데이터분석/SQL

SQL 첫걸음 - 테이블 결합(JOIN)

1. 곱집합과 교차결합

곱집합 : 집합의 연산 방법 중 하나, 카티전곱(Cartesian product)라고도 불림

 

교차결합(Cross Join)

SELECT * FROM 테이블명1, 테이블명2
SELECT * FROM sample72_x;

SELECT * FROM sample72_y;

 

SELECT * FROM sample72_x, sample72_y;

FROM구에 테이블 두 개를 지정해 곱집합 구하기

- FROM구에 복수의 테이블을 지정하면 교차결합을 함. 교차결합은 두 개의 테이블을 곱집합으로 계산

 

UNION의 연결과 결합 연결의 차이

- UNION으로 합집합을 구했을 경우에는 세로 방향으로 더해짐

- FROM 구로 테이블을 결합할 경우에는 가로 방향으로 더해짐

* 결합은 열(가로)방향으로 확대됨!

 

2. 내부 결합

: 결합 방법으로는 교차결합보다 내부결합이 자주 사용됨

CREATE TABLE 상품(
	상품코드 CHAR(4) NOT NULL,
    상품명 VARCHAR(30),
    메이커명 VARCHAR(30),
    가격 INTEGER,
    상품분류 VARCHAR(30),
    PRIMARY KEY (상품코드)
);

상품 테이블 작성하기

 

CREATE TABLE 재고수 (
	상품코드 CHAR(4),
    입고날짜 DATE,
    재고수 INTEGER
);

재고수 테이블 작성하기

 

- 재고수 테이블에서 상품분류가 식료품인 상품의 재고수를 표시하는 경우, 상품코드보다 상품명으로 표시하면 알아보기 쉬울 것 

- 재고수 테이블과 상품 테이블을 결합해 가로로 나열하고자 함

SELECT * FROM 상품, 재고수;

상품 테이블과 재고수 테이블을 교차결합하기

- FROM 구에 테이블을 복수로 지정하면 곱집합으로 계산됨

- 이렇게 만들어진 집합에서 원하는 데이터를 검색하기 위해 WHERE 구로 조건을 지정함 : 상품코드가 같다는 조건필요

SELECT * FROM 상품, 재고수
	WHERE 상품.상품코드 = 재고수.상품코드;

상품코드가 같은 행을 검색하기

- 내부결합: 교차결합으로 계산된 곱집합에서 원하는 조합으로 검색하는 것

SELECT 상품.상품명, 재고수.재고수 FROM 상품, 재고수
	WHERE 상품.상품코드 = 재고수.상품코드
    	AND 상품.상품분류 = '식료품';

검색할 행과 반환할 열 제한하기

- 상품분류가 '식료품'이라는 조건 필요 : WHERE구에 조건 추가

- 조건 추가할 때는 기존 조건식과 상품분류의 조건식이 모두 참이어야 하므로 AND로 조건식 연결

- 상품명과 재고수만 반환히도록 SELECT 구에 열 지정

- WHERE 구에 두 개의 조건식 저장되어있음 

* 첫 번째: 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것

* 두 번째: 결합 조건이 아닌 검색 조건

- 첫 번째 조건식의 조건을 '결합조건'이라 부름

 

3. INNER JOIN으로 내부결합하기

- 상품 테이블과 재고수 테이블을 이용한 사례를 INNER JOIN을 활용해 바꾸기

SELECT 상품.상품명, 재고수.재고수
	FROM 상품 INNER JOIN 재고수
    	ON 상품.상품코드 = 재고수.상품코드
    WHERE 상품.상품분류 = '식료품';

내부결합

SELECT * FROM 테이블명1 INNER JOIN 테이블명2 ON 결합조건

* INNER JOIN으로 두 개 테이블을 가로로 결합할 수 있음!

 

4. 내부 결합을 활용한 데이터 관리

- 코드와 이름을 가지는 테이블로 분할해 관리하면 저장공간 절약 가능

CREATE TABLE 메이커 (
	메이커코드 CHAR(4) NOT NULL,
    메이커명 VARCHAR(30),
    PRIMARY KEY(메이커코드)
);

메이커 테이블 작성하기

- 상품 테이블에서 메이커명을 메이커코드로 변경해둠

SELECT S.상품명, M.메이커명
	FROM 상품2 S INNER JOIN 메이커 M
    	ON S.메이커코드 = M.메이커코드;

상품 테이블과 메이커 테이블을 내부결합하기

- 테이블에  S, M이라는 별명을 붙임 : SELECT 명령에서 복수의 테이블을 다룰 경우 어느 테이블의 열인지 정확하게 지정해야 하기때문

- 상품 테이블의 메이커코드만을 살펴보면 중복하는 행이 있음 : 기본키 제약은 상품코드에만 적용되어있어 데이터상 제약 위반 X

- 메이커 테이블은 메이커코드에 기본키가 지정되어 있어 중복을 허용하지 않음

- 메이커코드는 유일하게 하나씩만 존재, 중복될 수 없음 : 존재하지 않거나 하나만 존재

 

외부키 : 다른 테이블의 기본키를 참조하는 열

- 메이커 테이블의 메이커코드는 기본키

- 상품 테이블의 메이커코드는 '외부키' 

 

자기결합(Self Join)

- 테이블에 별명을 붙일 수 있는 기능을 이용해 같은 테이블끼리 결합하는 것

SELECT S1.상품명, S2.상품명
	FROM 상품 S1 INNER JOIN 상품 S2
    	ON S1.상품코드 = S2.상품코드;

상품 테이블을 자기결합하기

- 상품 테이블을 가로로 두 개 나열해 상품코드로 결합

- 자기결합에서는 결합의 좌우가 같은 테이블이 됨 : 구별하기 위해 꼭 별명을 붙여야 함

 

5. 외부 결합

- '어느 한쪽에만 존재한느 데이터 행을 어떻게 다룰지'를 변경할 수 있는 결합방법

- 상품3 테이블에 상품코드가 0009인 행 추가, 재고수 테이블에는 0009 상품에 대한 데이터 X

- 이 상태에서는 곱집합을 구해도 0009 = 0009가 되는 행은 존재하지 않으므로 내부결합 결과에서는 상품고드가 0009인 상품이 제외됨

SELECT 상품3.상품명, 재고수.재고수
FROM 상품3 INNER JOIN 재고수
ON 상품3.상품코드 = 재고수.상품코드
WHERE 상품3.상품분류 = '식료품';

내부결합에서는 상품코드가 0009인 상품이 제외됨

- 이 경우에는 외부결합을 사용하면 됨

- 외부결합은 결합하는 테이블 중에 어느 쪽을 기준으로 할지 결정할 수 있음 

 

상품테이블(결합의 왼쪽)을 기준으로 INNER JOIN대신 LEFT JOIN 사용

SELECT 상품3.상품명, 재고수.재고수
	FROM 상품3 LEFT JOIN 재고수
    	ON 상품3.상품코드 = 재고수.상품코드
    WHERE 상품3.상품분류 = '식료품';

외부결합으로 상품코드 0009인 상품도 결과에 포함하기

- 재고수 테이블에는 0009에 대한 데이터가 없으므로 NULL로 표시됨

- 상품테이블을 오른쪽에 지정하는 경우나 재고 테이블을 기준으로 삼고 싶다면 RIGHT JOIN을 사용하여 외부결합을 하면된다

* LEFT JOIN ,RIGHT JOIN으로 외부결합을 할 수 있음!