코딩 기록들

오라클 SQLD 정리 본문

Database Programming

오라클 SQLD 정리

코딩펭귄 2024. 5. 27. 09:27

UNION vs UNION ALL
-> union all 은 중복을 허용함
-> union = union all + distinct + orderby

 

GROUP BY

- 집계함수 결과는 NULL값 가진 행 제외하고 수행함

- GROUP BY 절에서는 ALIAS 사용불가능

- GROUP BY 절 보다 WHERE절이 먼저 수행됨

 

그룹함수  ( 집계함수 VS 분석함수 )

* 집계함수

- 여러 행, 테이블 전체 행으로부터 그룹별로 집계하여 결과 반환(그룹별 1개의 행을 반환)  

   EX) ROLL UP, CUBE, GROUPING

ROLLUP
GROUP BY ROLLUP(A, B)

- 맨 처음 명시한 컬럼인 A에 대해서만 소그룹 합계를 보여줌
-  소그룹 간의 합계를 계산한다.
- GROUP BY로 묶은 각각의 소그룹 합계와 전체합계 모두 구할 수 있음
- 보통 NULL로 표현된 부분이 ROLLUP 함수를 써서 나온 합계

- 가장 부담이 적음. 성능에 (-)영향 주지 않음 (GROUPING에 비해서)

CUBE
GROUP BY CUBE(A, B);

- GROUP BY절에 명시한 모든 컬럼에 대해 소그룹 합계를 계산해줌 (ROLLUP과의 가장 큰 차이)

- 성능에 (-)영향 주지 않음

GROUPING SETS
GROUPING SETS

- ROLLUP, CUBE보다 훨씬 결과가 단순함. 특정 항목에 대한 합계를 계산해줌

- 계층구조가 평등한 관계이므로, 인수의 순서가 바뀌어도 결과는 같다

SELECT DEPTNO, JOB, SUM(SAL) S_SAL, GROUPING(DEPTNO), GROUPING(JOB)
  FROM SCOTT.EMP
 GROUP BY GROUPING SETS(DEPTNO, JOB);
GROUPING : 0인 부분 : 그루핑에 사용되었다는 뜻

 

https://for-my-wealthy-life.tistory.com/44

 

 

* 분석함수

- 집계 결과를 각 행마다 보여줌 ( = 그룹별 결과를 각 행마다 보여주는것 )

  EX) OVER (PARTITION BY ~~~)

- 반드시 OVER절을 함께 사용해야 하고

- OVER 절 내부에서 PARTITION BY 절을 사용하지 않을경우 결과 전체를 집계함 ( PARTITION BY 절을 사용하면 쿼리 결과에서 해당 칼럼을 그룹으로 묶어서 결과를 표시)

- 분석함수 종류 : 순위함수(RANK, DENSE_RANK, ROW_NUMBER, NTILE), 집계함수(SUM, MIN, MAX, AVG, COUNT), 기타함수(LAG, LEAD,=>하나의 쿼리에서 동시에 다른 ROW값에 접근할수있는 함수 RATION_TO_REPORT)

-- LAG (expr, offset, default) OVER (PARTITION BY 절)
- PARTITION_TO_REPORT : 계산대상 값 전체에 대한 현재 ROW의 상대적인 비율 값 반환

 

순위함수 (RANK, DENSE_RANK, ROW_NUMBER)

- 동일한 순위를 다르게 매겨야 하는 경우

-- 순위함수 사용시 ORDER BY 절 필수입력!

  동일한 값 다음순위
RANK 중복순위 부여 중복순위 개수만큼 건너뛰고 반환
DENSE_RANK 중복순위 부여 중복순위 상관없이 순차적으로 반환
ROW_NUMBER 중복 관계 없이 순차적 순위 반환

 

 

 

JOIN

INNER JOIN

-  두 개의  테이블로 부터 조인조건 만족하는 데이터 '만' 반환

OUTER JOIN

- 기준이 아닌 테이블의 데이터 중 조인조건 만족하는 데이터는 출력 & 만족안하는 데이터는 NULL값 출력

CARTESIAN JOIN

- 조인조건 없이 테이블을 조인하는 것

-- CROSS JOIN (데이터를 만들어낼때 많이 사용)

SELF JOIN

- 관계형 DB모델에서 순환참조 관계로 표현된 개체를 참조할 때 주로 사용

- 복잡한 순환관계 구현을 위해 CTE(일반 상용 DBMS), CONNECT BY(오라클) 방식 사용함

ANSI JOIN

- FROM절 다음에 CROSS JOIN 

- INNER JOIN ON 테이블명

- 두 테이블에 각각 조인을 정의한 컬럼 이름이 동일하다면

  :  USING(공통컬럼명) 으로 쓸수있음

  : USING절에서 조인할 컬럼을 지정하여 구문 더 간단히 표현가능

 

 

ANSI    VS   ORACLE   JOIN

 

 

 

서브쿼리

- 단일행 서브쿼리 : 수행결과가 오직 하나의 ROW  만 반화

- 다중행 서브쿼리 : 서브쿼리에서 반환되는 결과가 두개이상의 행일때 사용 : IN, ANY(뜻: OR), ALL(뜻: and), EXIST

 

 

 

-- 여기는 키워드 위주로만 접근하기~!

NESTED LOOP JOIN

- 가장 보편적으로 사용되는 조인방식

- 드라이빙 테이블(가장먼저 읽어야하는 테이블)선택에 따라 성능차이가 발생함(드라이빙 테이블의 선택이 매우중요)

- 조인조건으로 사용될 컬럼에 "인덱스가 존재하는지" 여부도 중요함 (꼭 인덱스 사용함)

- OLTP (온라인 처리, 부분처리, 소량처리)에 유리함 

 

HASH JOIN

- 두 테이블중 하나를 "해테이블"로 선정하여, 해시알고리즘으로 비교 (메모리에서 조인하는 방식, '=' 비교를 통한 방식에서 사용가능)

- 대용량처리(많은데이터 처리) / 배치처리 할 때 빠름

- 인덱스를 사용하지 않음

- 정렬작업이 없음

- EQUAL JOIN에서'만' 해당 조인 방식을 사용할 수 있음

 

SORT MERGE JOIN

- 대량데이터 조인에 유리하고, NESTED ROOP와는 다름

- = 뿐만이 아닌 NOT EQ에서도 활용가능함

- 정렬하고, 합치는 방식 !

- ORDERBY를 통해서 데이터를 정렬한 후 조인