데이터 웨어하우스와 SQL 기본에 대해 배우고 이를 바탕으로 데이터 분석에 대해 학습(4)

2023. 12. 21. 17:52TIL

SQL_Analysis_Day 4-1

 JOIN이란 두 개 혹은 그 이상의 테이블들을 공통 필드를 가지고 합치는데 사용된다. 이는 스타 스키마로 구성된 테이블들로 분산되어 있던 정보를 통합하는데 사용된다. 왼쪽 테이블을 LEFT, 오른쪽 테이블을 RIGHT라고 하자. JOIN의 결과는 방식에 상관없이 양쪽의 필드를 모두 가진 새로운 테이블을 만들어낸다. JOIN의 방식에 따라 어떤 레코드들이 선택되는지, 어떤 필드들이 채워지는지가 달라진다.

 

 JOIN 문법(__에 INNER, FULL, LEFT, RIGHT, CLOSS가 들어간다.)

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';

 

 JOIN시 먼저 중복 레코드가 없고 Primary key uniqueness가 보장됨을 체크해야 한다. 그리고 조인하는 테이블들 간의 관계를 명확하게 정의해야 한다(One to one, One to many, Many to one, Many to many). 또, 어느 테이블을 베이스로 잡을지 결정해야 한다. 

 

 다음으로 JOIN의 종류와 예시이다. 예시에 사용되는 테이블은 다음과 같다.

raw_data.Vital
raw_data.Alert

  • INNER JOIN
    • 양쪽 테이블에서 매치가 되는 레코드들만 리턴
    • 양쪽 테이블의 필드가 모두 채워진 상태로 리턴
SELECT * 
FROM raw_data.Vital v
JOIN raw_data.Alert a ON v.vitalID = a.vitalID;

  • LEFT JOIN
    • 왼쪽 테이블(Base)의 모든 레코드들을 리턴
    • 오른쪽 테이블이 필드는 왼쪽 레코드와 매칭되는 경우에만 채워진 상태로 리턴
    • RIGHT JOIN도 왼쪽, 오른쪽만 바뀌며 동일
SELECT * 
FROM raw_data.Vital v
LEFT JOIN raw_data.Alert a ON v.vitalID = a.vitalID;

  • FULL JOIN
    • 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들을 리턴
    • 매칭되는 경우에만 양쪽 테이블들의 모든 필드들이 채워진 상태로 리턴
SELECT * 
FROM raw_data.Vital v
FULL JOIN raw_data.Alert a ON v.vitalID = a.vitalID;

  • CROSS JOIN
    • 왼쪽 테이블과 오른쪽 테이블의 모든 레코드들의 조합을 리턴
SELECT * 
FROM raw_data.Vital v 
CROSS JOIN raw_data.Alert a;

  • SELF JOIN
    • 동일한 테이블을 alias를 달리해서 자기 자신과 조인
SELECT * 
FROM raw_data.Vital v1
JOIN raw_data.Vital v2 ON v1.vitalID = v2.vitalID;

 

SQL_Analysis_Day 4-2

 BOOLEAN은 True 또는 False를 나타내는 타입이다. flag = True 와True와 flag is True는 같은 표현이지만 flag is True와 flag is not False는 같은 표현이 아니다. 왜냐하면 flag is not False는 True뿐만 아니라 NULL도 해당하기 때문이다. 

 

 NULL 비교는 항상 IS 나 IS NOT으로 수행해야 한다. NULL 비교를 = 또는 != 또는 <>로 수행하면 잘못된 결과가 나온다.

 

 COALESCE는 NULL 값을 다른 값으로 바꿔주는 함수로 NULL 대신 다른 백업값을 리턴해줄때 사용한다. COALESECE(exp1, exp2, exp3,...)에서 exp1부터 인자를 하나씩 살펴서 NULL이 아닌 값이 나오면 그 값을 리턴한다. 만약 끝까지 갔는데도 모두 NULL이면 최종적으로 NULL을 리턴하게 된다. 

SELECT
	value,
	COALESCE(value, 0) -- value가 NULL이면 0을 리턴
FROM raw_data.count_test;

 

 공백 혹은 예약키워드를 필드 이름으로 사용하려면 ""로 둘러싸서 사용해야 한다. (group  → "group", 'mailing address'    " mailing address ")

 

공부하며 어려웠던 내용

조인을 두번 이상 쓰는 것을 처음 알게 되었다. 코드를 짤 때 항상 예외를 생각해야 겠다.