외부 조인의 유형으로는 왼쪽 조인(LEFT JOIN), 오른쪽 조인(RIGHT JOIN), 전체 조인(FULL JOIN) 세가지가 있다.

 

LEFT/RIGHT JOIN

왼쪽 조인과 오른쪽 조인은 어느 테이블이 왼쪽으로 올지 순서를 제외하고는 본질적으로는 같은 논리를 가지고있다.

위 예시에서는 Customers 테이블을 기준으로 Orders와 Refunds 테이블이 조인된 형태이다.

이 경우에는 Customers가 Primary, Orders와 Refunds가 Secondary 테이블이 된다. 

Secondary테이블을 Primary 테이블에 조인시킬 때, Secondary테이블의 행과 매치되는 행이 없어도 Primary테이블의 모든 행들이 출력된다. 내부 조인에서는 두 테이블 간 매치되는 행이 없는 경우에는 해당 행이 아예 출력되지 않았었다. 

 

위 예시는 Right Join을 사용한 예시이다.

Primary/Secondary관계가 반대로 된것 외에는 Left Join과 결과물이 완전히 같다.

떄문에 Left Join을 활용할 줄 안다면 Right Join은 사용하지 않아도 무방하다.

 

FULL JOIN

FULL JOIN(전체 조인)에서는 Left/Right Join과는 다르게 Primary가 존재하지 않고 양 테이블이 모두 Secondary이다. 

따라서 테이블_1과 테이블_2 사이에 서로 매칭되는 행이 없더라도 서로의 모든 행을 보여줘야 한다.

위 예시에서 확인할 수 있는것처럼 서로 매칭되는 행이 없더라도 해당 행이 출력된다.

'DB > 관계형 DB' 카테고리의 다른 글

서브쿼리(Subqueries)  (0) 2021.05.07
교차 조인(cross join)  (0) 2021.04.29
내부 조인(INNER JOIN)  (0) 2021.04.28
PIVOT(크로스탭)  (0) 2021.04.28
소계(ROLL UP / CUBE)  (0) 2021.04.23

내부 조인은 두 테이블간 공유하는 열을 통해 두 테이블을 조인 시켜주는것이다.

위 예시에서는 CustomerID를 통해 두 테이블을 조인시켰다.

SELECT*
FROM 테이블_1
INNER JOIN 테이블_2
ON 테이블_1.매칭될 열 = 테이블_2.매칭될 열  

위 형태가 내부 조인의 기본적인 형태이다.

테이블_1과 테이블_2의 순서가 바뀌어도 동일한 결과가 출력된다.

 

'DB > 관계형 DB' 카테고리의 다른 글

교차 조인(cross join)  (0) 2021.04.29
외부 조인(LEFT/RIGHT JOIN, FULL JOIN)  (0) 2021.04.28
PIVOT(크로스탭)  (0) 2021.04.28
소계(ROLL UP / CUBE)  (0) 2021.04.23
분할(Partition)  (0) 2021.04.23

PIVOT 함수는 행을 열로 변환할 수 있게 해준다.

사용 예는 다음과 같다.

SELECT
FROM(PIVOT을 적용할 쿼리문) AS result
PIVOT(그룹 함수(집계할 열) FOR PIVOT의대상이 될 열 IN([값1],[값2]...)) AS pivot_result

의 형태를 가진다.

 

'DB > 관계형 DB' 카테고리의 다른 글

외부 조인(LEFT/RIGHT JOIN, FULL JOIN)  (0) 2021.04.28
내부 조인(INNER JOIN)  (0) 2021.04.28
소계(ROLL UP / CUBE)  (0) 2021.04.23
분할(Partition)  (0) 2021.04.23
랭킹 함수(Row_Number, Rank, Dense_Rank, NTile)  (0) 2021.04.22

ROLL UP

Roll Up은 각 카테고리별로 소계를 내어 그 최종 합계를 내는 키워드이다.

위 코드에서 CASE - END 구문까지 한 컬럼, ISNULL(Subcategory...)가 한 컬럼, SUM(Quantity)가 한 컬럼이다.

Grouping 함수는 집계된 행의 NULL 여부를 판단할때 사용된다. 해당 행이 소계 합계인경우 1을 리턴하고 이외에는 0을 리턴한다.

 

CUBE

Cube는 데이터가 계급적인 구조를 가지고 있을때 효과적이다.

앞선 예시와는 다르게 데이터가 계층을 이루지 않는 경우가 있는데, 이 때 행의 소계를 내려고 할때 사용된다.

첫번째 행처럼 두 열 모두 NULL값을 가지는 경우는 총계, 한칸만 NULL인경우엔 다른 한칸에 대한 소게이다.

CUBE도 ROLL UP처럼 GROUPING 함수를 사용할 수 있다.

마찬가지로 Grouping함수로 한쪽이 NULL인경우는 다른 한쪽의 소계, 둘 다 NULL인 경우에는 총계로 분류해줄 수 있다.

 

'DB > 관계형 DB' 카테고리의 다른 글

내부 조인(INNER JOIN)  (0) 2021.04.28
PIVOT(크로스탭)  (0) 2021.04.28
분할(Partition)  (0) 2021.04.23
랭킹 함수(Row_Number, Rank, Dense_Rank, NTile)  (0) 2021.04.22
데이터 그룹화(Group By)  (0) 2021.04.22

Partition은 키워드는 데이터 분할에 이용된다,

위 코드에서는 Exchange를 기준으로 파티션을 나누고, ROW_NUMBER로 PERatio의 랭킹을 매겨 정렬했다.

기본적으로 랭킹 함수를 이용하는 형태에서 ORDER BY절 앞에 PARTITION을 사용해주면 된다.

 

'DB > 관계형 DB' 카테고리의 다른 글

PIVOT(크로스탭)  (0) 2021.04.28
소계(ROLL UP / CUBE)  (0) 2021.04.23
랭킹 함수(Row_Number, Rank, Dense_Rank, NTile)  (0) 2021.04.22
데이터 그룹화(Group By)  (0) 2021.04.22
데이터 요약 - 집계 함수  (0) 2021.04.15

랭킹 함수에는 기본적으로 다음 네 가지 함수가 있다.

Row_Number 연결된 표현이나 다른 열에 명시된 순서에 따라 행 번호를 생성한다.
Rank 둘 이상의 행이 명시된 열이나 표현에 대해 행 번호를 생성한다(단, 같은 값을 가진 경우에 대해 같은 번호를 부여하고, 그 수 만큼 다음 번호를 건너뛴다. ex- 1, 2, 2, 4)
Dense_Rank Rank와 동일하지만 번호를 건너뛰지 않는다. ex- 1, 2, 2, 3
NTile 다은 열이나 표현에 명시된 수서에 근거해 백분위수나 다른 ntile을 생성한다.

위는 Row_Number, Rank, Dense_Rank의 사용 예시이다.

여기서 over 키워드는 랭크 함수가 어떻게 적용될지 지정한다.

위는 NTILE()함수의 사용 예이다. 사분위와 십분위로 나누었다.

앞서 본 함수들과 매개변수가 추가 된것 이외에는 동일하다.

 

'DB > 관계형 DB' 카테고리의 다른 글

소계(ROLL UP / CUBE)  (0) 2021.04.23
분할(Partition)  (0) 2021.04.23
데이터 그룹화(Group By)  (0) 2021.04.22
데이터 요약 - 집계 함수  (0) 2021.04.15
데이터 요약 - 중복제거(Distinct)  (0) 2021.04.15

+ Recent posts