[SQL] 다양한 JOIN

Peter·2021년 7월 13일
0

SQL

목록 보기
12/19

JOIN?

SQL 조인은 두 개 혹은 그 이상의 테이블들을 공통 필드를 가지고 머지하는데 사용된다. 이는 스타 스키마로 구성된 테이블들로 분산되어 있던 정보를 통합하는데 사용된다.

JOIN 다양한 쓰임

LEFT JOIN

  • 왼쪽테이블의 결과는 전부 표시하고 다른쪽 데이터들중 왼쪽데이터와 연관된 것들만 가져옴

RIGHT JOIN

  • 오른쪽테이블의 결과는 전부 표시하고 다른쪽 데이터들중 오른쪽데이터와 연관된 것들만 가져옴

Others..

  • INNER JOIN은 해당하는 테이블들값을 서로 모두 가진것들만을 가져옴
  • CROSS JOIN은 모든 가능한 조합 경우의 수대로 조합함
  • FULL JOIN은 데이터가 있든 없든 모두 가져옴

JOIN 문법

SELECT A.*, B.*
FROM raw_data.table1 A
___JOIN raw_data.table2 B ON A.key1 = B.key1 and A.key2 = B.key2
WHERE A.ts >= '2019-01-01'
  • ___ 이 부분에 INNER, FULL, LEFT, RIGHT, CROSS 등 옵션이 들어감

JOIN시 고려해야할점

  • 중복 레코드 없고 Primary Key의 uniqueness 보장을 체크
  • 조인하는 테이블들 간의 관계 명확하게 정의
    - one to one: 유저세션채널과 타임스탬프 관계
    - one to many
    - many to one
    - many to many: 이런 경우 많지 않으며 one to one이나 one to many로 변환해 조인하는 것이 덜 위협
  • 어느 테이블을 베이스로 잡지 결정

JOIN의 종류

%%sql

DROP TABLE IF EXISTS raw_data.vital;
CREATE TABLE raw_data.vital (
    UserID int,
    VitalID	int,
    Date date,
    Weight int
);
INSERT INTO raw_data.vital VALUES
(100,	1, '2020-01-01', 75),
(100, 3, '2020-01-02', 78),
(101, 2, '2020-01-01', 90),
(101, 4, '2020-01-02', 95); 
%%sql

DROP TABLE IF EXISTS raw_data.alert;
CREATE TABLE raw_data.alert (
    AlertID int,
    VitalID	int,
    AlertType varchar(32),
    Date date,
    UserID int
);
INSERT INTO raw_data.alert VALUES
 (1,	4, 'WeightIncrease', '2020-01-01', 101),
 (2, NULL, 'MissingVital', '2020-01-04', 100),
 (3, NULL, 'MissingVital', '2020-01-04', 101);

  • 두개의 데이터 테이블이 있고
  • 과체중으로 판단해서 데이터를 넘기는 것이 Alert
  • 조인 연결관계는 VitalID
  • MissingVital은 아이디를 입력안하고 체중만 잰 정보

INNER JOIN

%%sql

SELECT * FROM raw_data.Vital v
JOIN raw_data.Alert a ON v.vitalID = a.vitalID;

  • 양쪽 테이블에서 매치가 되는 레코드들만 리턴함
  • 양쪽 테이블 필드가 모두 채워진 상태
  • 양쪽 다 서로 없는 레코드라 판단되면 안넘어옴

LEFT JOIN

%%sql

SELECT * FROM raw_data.Vital v
LEFT JOIN raw_data.Alert a ON v.vitalID = a.vitalID;

  • 왼쪽 테이블은 모든 레코드들을 리턴함
  • 오른쪽 테이블은은 왼쪽 레코드와 매칭 되는 경우만 채워짐

FULL, OUTER JOIN

%%sql

SELECT * FROM raw_data.Vital v
FULL JOIN raw_data.Alert a ON v.vitalID = a.vitalID;

  • 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들을 리턴함
  • 매칭되는 경우에만 양쪽 테이블들의 모든 필드들이 채워진 상태로 리턴

SELF JOIN

%%sql

SELECT * FROM raw_data.Vital v1
JOIN raw_data.Vital v2 ON v1.vitalID = v2.vitalID;

  • 동일한 테이블을 alias를 달리해서 자기 자신과 조인함

CROSS JOIN

%%sql

SELECT * FROM raw_data.Vital v
CROSS JOIN raw_data.Alert a;

  • 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들의 조합을 리턴함
profile
컴퓨터가 좋아

0개의 댓글