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

위 예시에서는 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

Group By

Group By로 테이블에서 가져온 데이터를 몇 개의 그룹으로 분리할 수 있다.

학생들의 성적의 평균을 과제 유형에 따라 나누어 보고싶다고 하자.

GradeType을 기준으로 그룹을 묶어주어야 하기때문에 GROUP BY GradeType으로 그룹핑을 해줄 수 있다.

다만 여기서 문제점은 NULL값은 평균값을 구할 때 무시된다는 점이다.

만약 여기서 NULL값을 0점처리 하고싶다면 AVG(Group)을 AVG(ISNULL(Grade, 0))로 계산해야한다.

 

여기서 한단계 더 나아가보자.

Group By로 각 학생들의 퀴즈와 시험점수 평균을 내어보자.

이때는 Group By에 복수의 열을 넣어주면 된다.

학생 - 시험 유형 - 평균 점수 형태로 바꾸어주었다.

여기서 시험 평균 점수가 70점 이상인 학생의 데이터만 보고싶다고 하자.

이 경우에는 Having을 이용할 수 있다.

HAVING

Having과 Where은 선택 기준을 적용할때 이용된다.

다만 Where는 각 행에 적용되는 기준이라면 Having은 그룹 차원으로 선택 논리를 적용시킨다.
(where를 쓸때는 집계함수같은걸 못쓴다 avg, count, sum...)

Having 키워드는 반드시 group by 뒤와 order by 앞에 와야한다.

 

이번에는 7학년이면 70점 이상, 8학년이면 75점 이상인 학생 목록을 뽑아볼것이다.

위처럼 case문을 이용해 다른 조건을 부여할 수 있다.

GROUP BY와 CASE

Group By에서 case 표현이 사용될 때, 그와 똑같은 표현이 select의 문장에서도 사용되어야한다.

이와 같이 Select와 Group By에 같은 case문장이 사용되어야한다.

 

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

분할(Partition)  (0) 2021.04.23
랭킹 함수(Row_Number, Rank, Dense_Rank, NTile)  (0) 2021.04.22
데이터 요약 - 집계 함수  (0) 2021.04.15
데이터 요약 - 중복제거(Distinct)  (0) 2021.04.15
WHERE절의 조건부 논리(case)  (0) 2021.04.15

+ Recent posts