backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • 1. 윈도우 함수(Window Function)
  • 2. GROUP BY
  • 3. 윈도우 함수와 GROUP BY의 차이점
  • 4. 예제 비교
  • 5. 윈도우 함수 추가 예제
  • 1. LAG와 LEAD 개요
  • 2. 기본 구문
  • 3. LAG와 LEAD의 차이점
  • 4. 예제 데이터
  • 5. LAG 사용 예제
  • 6. LEAD 사용 예제
  • 7. LAG & LEAD 비교 사용
  • 8. OFFSET과 기본값 설정
  • 9. 활용 사례
  1. DB&SQL

09 SQL 활용

1. 윈도우 함수(Window Function)

윈도우 함수는 집계값을 구하되, 원본 데이터의 각 행을 유지하면서 해당 행과 관련된 집계 결과를 계산합니다. 즉, 그룹화하지 않고도 각 행별로 집계 작업을 수행할 수 있습니다.

주요 특징

  • 원본 행 유지: 데이터의 모든 행이 유지됩니다.

  • OVER 절 사용: 윈도우 함수는 OVER() 절을 사용해 연산 범위(윈도우)를 정의합니다.

  • 집계와 개별 데이터 동시 제공: 집계 결과를 계산하면서 개별 데이터도 함께 제공합니다.

주요 함수

윈도우 함수는 다음과 같은 함수로 구성됩니다:

  • 순위 함수: ROW_NUMBER(), RANK(), DENSE_RANK()

  • 집계 함수: SUM(), AVG(), MIN(), MAX(), COUNT()

  • 이동 함수: LAG(), LEAD(), FIRST_VALUE(), LAST_VALUE()

기본 구문

SELECT
    column1,
    column2,
    SUM(column3) OVER (PARTITION BY column1 ORDER BY column2) AS running_total
FROM table_name;

2. GROUP BY

GROUP BY는 데이터를 특정 기준으로 그룹화하고, 그룹별로 데이터를 집계합니다. 그룹화가 이루어지면 각 그룹에 대해 한 행만 반환됩니다.

주요 특징

  • 그룹별 데이터만 반환: 그룹화된 각 그룹에 대해 하나의 결과 행만 반환됩니다.

  • 집계 함수 필수: SUM(), AVG(), COUNT() 등 집계 함수와 함께 사용됩니다.

  • 행 축소: 데이터를 그룹으로 묶기 때문에 결과 데이터의 행 수가 줄어듭니다.

기본 구문

SELECT
    column1,
    SUM(column2) AS total
FROM table_name
GROUP BY column1;

3. 윈도우 함수와 GROUP BY의 차이점

특징

윈도우 함수

GROUP BY

원본 데이터 유지 여부

원본 데이터를 유지하며 추가 계산값을 함께 표시합니다.

그룹화된 결과만 반환하고 원본 데이터는 제거됩니다.

결과 행 수

원본 데이터의 행 수와 동일합니다.

그룹화된 데이터만 남아 행 수가 줄어듭니다.

사용 방식

OVER() 절을 사용해 윈도우(범위)를 정의합니다.

GROUP BY를 사용해 특정 컬럼을 기준으로 그룹화합니다.

사용 목적

그룹화 없이도 순위 계산, 이동 평균, 누적 합 등을 계산할 때 사용됩니다.

그룹화된 데이터에 대해 요약 정보(합계, 평균 등)를 계산할 때 사용됩니다.

적용 함수

순위 함수, 이동 함수 등 다양한 윈도우 함수.

집계 함수만 사용 가능합니다.


4. 예제 비교

(1) 데이터

| department | employee | salary |
|------------|----------|--------|
| Sales      | John     | 5000   |
| Sales      | Jane     | 6000   |
| IT         | Alice    | 7000   |
| IT         | Bob      | 8000   |

(2) 윈도우 함수 사용

부서별 급여 합계를 모든 행에서 확인하고 싶을 때:

SELECT
    department,
    employee,
    salary,
    SUM(salary) OVER (PARTITION BY department) AS total_salary
FROM employees;

결과:

| department | employee | salary | total_salary |
|------------|----------|--------|--------------|
| Sales      | John     | 5000   | 11000        |
| Sales      | Jane     | 6000   | 11000        |
| IT         | Alice    | 7000   | 15000        |
| IT         | Bob      | 8000   | 15000        |

(3) GROUP BY 사용

부서별 급여 합계를 계산하고, 그룹화된 결과만 보고 싶을 때:

SELECT
    department,
    SUM(salary) AS total_salary
FROM employees
GROUP BY department;

결과:

| department | total_salary |
|------------|--------------|
| Sales      | 11000        |
| IT         | 15000        |

5. 윈도우 함수 추가 예제

(1) 순위 계산 (ROW_NUMBER)

각 부서별로 급여 순위를 매기기:

SELECT
    department,
    employee,
    salary,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees;

결과:

| department | employee | salary | rank |
|------------|----------|--------|------|
| Sales      | Jane     | 6000   | 1    |
| Sales      | John     | 5000   | 2    |
| IT         | Bob      | 8000   | 1    |
| IT         | Alice    | 7000   | 2    |

(2) 누적 합계 (Running Total)

부서별 급여의 누적 합계를 계산하기:

SELECT
    department,
    employee,
    salary,
    SUM(salary) OVER (PARTITION BY department ORDER BY salary) AS running_total
FROM employees;

결과:

| department | employee | salary | running_total |
|------------|----------|--------|---------------|
| Sales      | John     | 5000   | 5000          |
| Sales      | Jane     | 6000   | 11000         |
| IT         | Alice    | 7000   | 7000          |
| IT         | Bob      | 8000   | 15000         |

1. LAG와 LEAD 개요

LAG 함수

  • 정의: 현재 행의 기준으로 이전 행의 값을 가져옵니다.

  • 용도: 이전 값과 현재 값을 비교하거나, 변화율 등을 계산할 때 사용합니다.

LEAD 함수

  • 정의: 현재 행의 기준으로 다음 행의 값을 가져옵니다.

  • 용도: 다음 값과 현재 값을 비교하거나, 미래 값을 참조할 때 사용합니다.


2. 기본 구문

LAG(column_name, offset, default_value) OVER (PARTITION BY column1 ORDER BY column2)

LEAD(column_name, offset, default_value) OVER (PARTITION BY column1 ORDER BY column2)
  • column_name: 참조할 열

  • offset: 몇 행 앞(LEAD) 또는 몇 행 뒤(LAG)를 참조할지 설정 (기본값은 1)

  • default_value: 참조할 데이터가 없을 때 반환할 기본값 (기본값은 NULL)

  • PARTITION BY: 그룹화 기준 (옵션)

  • ORDER BY: 참조할 행의 순서를 결정


3. LAG와 LEAD의 차이점

함수

값 참조 방향

용도

LAG

이전 행

전년도 데이터, 전월 데이터 비교 등

LEAD

다음 행

다음 행의 값 참조, 예측 데이터 등


4. 예제 데이터

| emp_id | department | salary | join_date  |
|--------|------------|--------|------------|
| 1      | Sales      | 5000   | 2023-01-01 |
| 2      | Sales      | 6000   | 2023-02-01 |
| 3      | Sales      | 7000   | 2023-03-01 |
| 4      | IT         | 8000   | 2023-01-01 |
| 5      | IT         | 9000   | 2023-02-01 |

5. LAG 사용 예제

(1) 이전 행의 급여 가져오기

SELECT
    emp_id,
    department,
    salary,
    LAG(salary) OVER (PARTITION BY department ORDER BY join_date) AS previous_salary
FROM employees;

결과:

| emp_id | department | salary | previous_salary |
|--------|------------|--------|-----------------|
| 1      | Sales      | 5000   | NULL            |
| 2      | Sales      | 6000   | 5000            |
| 3      | Sales      | 7000   | 6000            |
| 4      | IT         | 8000   | NULL            |
| 5      | IT         | 9000   | 8000            |

(2) 급여 변화량 계산

SELECT
    emp_id,
    department,
    salary,
    LAG(salary) OVER (PARTITION BY department ORDER BY join_date) AS previous_salary,
    salary - LAG(salary) OVER (PARTITION BY department ORDER BY join_date) AS salary_change
FROM employees;

결과:

| emp_id | department | salary | previous_salary | salary_change |
|--------|------------|--------|-----------------|---------------|
| 1      | Sales      | 5000   | NULL            | NULL          |
| 2      | Sales      | 6000   | 5000            | 1000          |
| 3      | Sales      | 7000   | 6000            | 1000          |
| 4      | IT         | 8000   | NULL            | NULL          |
| 5      | IT         | 9000   | 8000            | 1000          |

6. LEAD 사용 예제

(1) 다음 행의 급여 가져오기

SELECT
    emp_id,
    department,
    salary,
    LEAD(salary) OVER (PARTITION BY department ORDER BY join_date) AS next_salary
FROM employees;

결과:

| emp_id | department | salary | next_salary |
|--------|------------|--------|-------------|
| 1      | Sales      | 5000   | 6000        |
| 2      | Sales      | 6000   | 7000        |
| 3      | Sales      | 7000   | NULL        |
| 4      | IT         | 8000   | 9000        |
| 5      | IT         | 9000   | NULL        |

(2) 다음 급여와 현재 급여 비교

SELECT
    emp_id,
    department,
    salary,
    LEAD(salary) OVER (PARTITION BY department ORDER BY join_date) AS next_salary,
    LEAD(salary) OVER (PARTITION BY department ORDER BY join_date) - salary AS salary_gap
FROM employees;

결과:

| emp_id | department | salary | next_salary | salary_gap |
|--------|------------|--------|-------------|------------|
| 1      | Sales      | 5000   | 6000        | 1000       |
| 2      | Sales      | 6000   | 7000        | 1000       |
| 3      | Sales      | 7000   | NULL        | NULL       |
| 4      | IT         | 8000   | 9000        | 1000       |
| 5      | IT         | 9000   | NULL        | NULL       |

7. LAG & LEAD 비교 사용

이전 급여와 다음 급여를 모두 포함한 테이블 만들기:

SELECT
    emp_id,
    department,
    salary,
    LAG(salary) OVER (PARTITION BY department ORDER BY join_date) AS previous_salary,
    LEAD(salary) OVER (PARTITION BY department ORDER BY join_date) AS next_salary
FROM employees;

결과:

| emp_id | department | salary | previous_salary | next_salary |
|--------|------------|--------|-----------------|-------------|
| 1      | Sales      | 5000   | NULL            | 6000        |
| 2      | Sales      | 6000   | 5000            | 7000        |
| 3      | Sales      | 7000   | 6000            | NULL        |
| 4      | IT         | 8000   | NULL            | 9000        |
| 5      | IT         | 9000   | 8000            | NULL        |

8. OFFSET과 기본값 설정

이전 행 대신 2행 전 참조 (offset 2):

SELECT
    emp_id,
    salary,
    LAG(salary, 2, 0) OVER (PARTITION BY department ORDER BY join_date) AS two_previous_salary
FROM employees;

결과: 2행 전 값이 없으면 기본값(0)을 반환합니다.

| emp_id | salary | two_previous_salary |
|--------|--------|---------------------|
| 1      | 5000   | 0                   |
| 2      | 6000   | 0                   |
| 3      | 7000   | 5000                |
| 4      | 8000   | 0                   |
| 5      | 9000   | 0                   |

9. 활용 사례

  1. 매출 데이터 분석:

    • LAG: 전월 대비 매출 변화량 계산.

    • LEAD: 다음 달 예산과의 차이 계산.

  2. 이탈 분석:

    • LAG: 고객의 이전 구매 날짜를 참조해 이탈 가능성 분석.

  3. 시계열 데이터:

    • LAG/LEAD: 시계열 데이터의 전후 값 비교.

Previous실습스키마Next실습스키마

Last updated 4 months ago