22.03.31 WIL 서브쿼리 & 뷰 & 그룹/윈도우 함수

서브쿼리(Sub Query)

동작하는 방식에 따른 서브쿼리 분류

  • 연관 서브쿼리(Correlated SubQuery) : 메인 쿼리의 컬럼이 서브쿼리에 포함되며, 메인쿼리의 컬럼은 서브쿼리에 특정 조건으로 사용된다.
  • 비연관 서브쿼리(Un-Correlated Subquery) : 메인 쿼리 컬럼이 서브 쿼리에 포함되지 않으며, 주로 메인 쿼리에 특정한 값을 제공할 때 사용한다.
    %쉽게 풀어쓰자면! 메인쿼리의 컬럼(내용)이 서브 쿼리에서 쓰이는가 안쓰이는가에 따라 분류된다!

반환되는 데이터 형태에 따른 서브쿼리 분류

1. 단일 행 서브쿼리(Single Row Subquery)

서브 쿼리의 결과가 한 개의 행을 반환하며, 단일 행 비교 연산자(=,<,>,<=,>=)와 같이 사용된다.

2. 다중 행 서브쿼리(Multi Row Subquery) -EXISTS는 아직 사용 미숙 연습하자!

서브 쿼리의 결과가 두 개 이상의 행을 반환할 수 있으며, 다중 행 비교 연산자(IN, ALL, ANY, EXISTS)와 같이 사용된다.

EXISTS 예시

SELECT name
FROM employee a
WHERE EXISTS (
	SELECT id
	FROM employee b
	WHERE b.salary >= 10000 AND a.department_id = b.department_id
)

3. 다중 컬럼 서브쿼리(Multi Column Subquery)

서브 쿼리의 결과가 여러 개의 컬럼을 반환하며, 메인 쿼리의 조건과 동시에 비교된다.

다중 컬럼 예시

SELECT name, salary
FROM employee
WHERE (department_id, salary) IN
	(
	SELECT department_id, max(salary)
	FROM employee
	GROUP BY department_id
	);

스칼리 서브쿼리 - 나에게 어려운 개념이었음 잘 이해하자!

하나의 속성을 가지면서, 하나의 행만을 반환하는 쿼리이다.
SELECT절, WHERE절, HAVING절에서 사용 가능

스칼라 쿼리 사용 예시

-- salaries 테이블에서 직원 번호와 한 직원의 평균 급여를 중복없이 출력해보세요.
select distinct salaries.emp_no, (
        select avg(salary)
            from salaries as s
             where salaries.emp_no = s.emp_no
        group by emp_no
) as avg_salary
from salaries;

뷰(VIEW)

뷰는 다른 테이블에서 파생된 테이블이다, 물리적으로 데이터가 저장되는 것이 아니라 논리적으로만 존재하며 뷰를 사용한 질의 시에는 DBMS에서 뷰 정의에 따라 질의를 재작성하여 수행한다.
뷰의 특징

  • 독립성, 편리성, 보안성 보장
  • 생성된 뷰는 또 다른 뷰를 생성하는 데 사용 가능
  • 뷰의 정의는 변경할 수 없으며, 삭제 후 재생성이 필요
  • 뷰를 통한 갱신에는 제약이 따름, 갱신을 위해서는 기본적으로 원천 테이블의 기본키가 포함되어야 함
  • 원천이 되는 테이블이나 뷰가 삭제되면 이를 기반으로 하는 뷰도 함께 삭제된다.

View 정의 쿼리

CREATE (OR REPLACE) VIEW view_name AS
(
	SELECT column1, column2
	FROM table_name
	WHERE condition
);

그룹 함수 & 윈도우 함수

윈도우함수(Window function), 집계 함수(Aggregate function), 그룹 함수(Group function)은 주로 데이터 분석을 위해 사용된다.

윈도우 함수(WINDOW Function)

순위 집계 등 행과 행 사이의 관계를 정의하는 함수 - OVER 구분을 필수로 한다
SELECT WINDOW_FUNCTION (ARGUMENTS) OVER ([PARTITION BY column][ORDER BY 절][WINDOWING 절]) FROM table;

1.순위함수

얘시 ) RANK() OVER (ORDER BY salary DESC) FROM employee;

  • RANK : 동일한 값에는 동일한 순위를 부여
  • DENSE_RANK : RANK와 같이 같은 값에는 같은 순위를 부여하나 한 건으로 취급
  • ROW_NUMBER : 동일한 값이라도 고유한 순위를 부여

2.일반 집계함수

예시 ) AVG(Salary) OVER (PARTITION BY department_id) FROM employee;
일반 집계함수 AVG() , MIN(), MAX(), SUM() 등을 GROUP BY 구문 없이 사용할 수 있다.

3.그룹 내 행 순서 함수

예시 ) 각 부서에서 급여를 가장 많이 받은 사람
FIRST_VALUE(salary) OVER(PARTITION BY department_id ORDER BY salary ROWS BETWEEN UNBOUNDED PROCEDING AND UNBOUNDED FOLLOWING)

  • FIRST_VALUE : 가장 먼저 나온 값을 구한다.
  • LAST_VALUE : 가장 나중에 나온 값을 구한다.
    예시 ) 본인 사원 번호 앞에 해당하는 직원의 이름을 출력
    LAG(name, 1) OVER(ORDER BY id)
  • LAG : 이전 X번째 행을 가져온다.
  • LEAD : 이후 X번째 행을 가져온다.

4.그룹 내 비율 함수

예시) 직원 전체 급여의 합 중 각 행이 차지하는 비율
RATIO_TO_REPORT(salary) OVER() as total_salary

  • RATIO_TO_REPORT : 파티션 내 전체 SUM에 대한 비율
    예시) 급여 순 자신의 백분율
    PERCENT_RANK() OVER(ORDER BY salary DESC) AS percent_rank
  • PERCENT_RANK : 파티션 내 순위를 백분율로 구함 - 제일 높은 순위 행은 0, 가장 낮은 순위 행은 1
  • CUME_DIST : 파티션 내 현재 행보다 작거나 같은 건들의 수 누적 백분율로 구한다.
    예시)급여에 따라 직원들을 세 그룹으로 분류
    NTILE(3) OVER (ORDER BY salary DESC) as ntile
  • NTILE : 파티션 내 행들을 N등분한 결과를 구한다.

그룹 함수

전체 데이터의 통계는 물론이고. 데이터 일부에 대한 소계, 중계또한 제공

  • GROUPING SETS : 각 컬럼에 대해 GROUP BY로 생성한 통계를 모두 UNION ALL한 결과와 동일하다.
  • ROLL UP : 그룹화하는 컬럼에 대한 부분적은 통계를 제공해준다.
  • CUBE : ROLL UP 함수에서 제공하는 결과를 포함해서, CUBE 함수에서는 그룹화 하는 컬럼에 대해 결합 가능한 모든 경우의 수에 대해 다차원 집계를 생성
    CUBE(d.name, j.name) == ROLL UP(d.name,j.name) UNION ROLL UP(j.name,d.name) ?? -> ROLL UP과 CUBE의 관계에 대해 잘 이해해 보자

좋은 웹페이지 즐겨찾기