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의 관계에 대해 잘 이해해 보자
Author And Source
이 문제에 관하여(22.03.31 WIL 서브쿼리 & 뷰 & 그룹/윈도우 함수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jk05018/22.03.31-WIL-서브쿼리-뷰-그룹윈도우-함수저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)