[정보처리기사 실기] Ⅷ. SQL 응용 - 응용 SQL 작성

Ⅷ. SQL 응용 - 응용 SQL 작성.


1. 집계성 SQL 작성

1.1. 데이터 분석 함수의 개념

  • 총합, 평균등의 데이터 분석을 위해서 복수행 기준의 데이터를 모아 처리하는 것을 목적으로 하는 다중 행 함수.
  • 다중 행 함수의 공통 특성.
    • 단일행을 기반으로 산출하지 않고 복수행을 그룹별로 모아 그룹당 단일 계산 결과를 반환.
    • GROUP BY 구문을 활용하여 복수 행을 그룹핑.
    • SELECT, HAVING, ORDER BY 등의 구문에 활용.


1.2. 데이터 분석 함수의 종류

  • 집계 함수 : 여러 행 또는 테이블 전체 행으로부터 하나의 결과값을 반환하는 함수.
  • 그룹 함수 : 소그룹 간의 소계 및 중계 등의 중간 합계 분석 데이터를 산출하는 함수.
  • 윈도 함수 : 데이터베이스를 사용한 온라인 분석 처리 용도로 사용하기 위해서 표준 SQL에 추가된 기능.


1.3. 집계 함수 (Aggregate Function)

1.3.1. 집계 함수의 개념

  • 여러 행 또는 테이블 전체 행으로부터 하나의 결과값을 반환하는 함수.

1.3.2. 집계 함수 구문

SELECT 컬럼1 컬럼2 컬럼3 ... 집계함수
FROM 테이블명
[WHERE  조건]
GROUP BY 컬럼1 컬럼2 컬럼3 ...
[HAVING 조건식 (집계함수 포함)]
  • GROUP BY 구문
    • SQL 에서 WHERE 구문을 활용하여 조건 대상 ROW를 선택.
    • 복수 ROW대상의 데이터 분석시 그룹핑 대상이 되는 부분을 선별시 GROUP BY 사용.
    • GROUP BY 구문은 실제 구체적 데이터 분석값을 보고자 하는 컬럼 단위를 선정할 때 사용되는 기준.
    • GROUP BY 특성
      • NULL값을 가지는 ROW는 제외한 후 산출
      • SELECT에서 사용하는 것과 같은 ALIAS 사용이 불가
      • WHERE 구문 안에 포함되지 않음
      • WHERE 구문은 GROUP BY 보다 먼저 실행되고, 대상이 되는 단일 행을 사전에 선별하는 역할을 함.
  • HAVING 구문
    • WHERE내 사용 할 수 없는 집계함수 구문에 조건을 적용하는데 사용.
    • 일반적으로 GROUP BY 뒤에 기재, GROUP BY 구문의 기준항목이나 소그룹 집계 함수를 활용한 조건 적용시 사용.

1.3.3. 집계 함수의 종류

  • COUNT : 복수행의 줄 수
  • SUM : 복수 행의 해당 컬럼 간의 힙계
  • AVG : 복수 행의 해당 컬럼 간의 평균
  • MAX : 복수 행의 해당 컬럼 중 최댓값
  • MIN : 복수 행의 해당 컬럼 중 최솟값
  • STDDEV : 복수 행의 해당 컬럼 간의 표준편차
  • VARIAN : 복수 행의 해당 컬럼 간의 분산

1.3.4. 집계 함수 활용 예시

# 국어 점수가 80 이상인 학생들의 
SELECT COUNT(*) FROM STUDENT WHERE 국어 >= 80

# 국어 점수의 , 영어 점수의 평균값
SELECT SUM(국어), AVG(영어) FROM STUDENT

# 국어 최고점, 최저점
SELECT MAX(국어), MIN(국어) FROM STUDENT 

# 국어 표준편차, 분산
SELECT STDDEV(국어), VARIAN(국어) FROM STUDENT 


1.4. 그룹 함수 (Group Function)

1.4.1. 그룹 함수의 개념

  • 테이블 전체 행을 하나이상의 컬럼을 기준으로 컬럼 값에 따라 그룹화하여 그룹별 결과를 출력하는 함수.

1.4.2. 그룹함수의 유형

  • ROLLUP 함수
    • ROLLUP에 의해 지정된 컬럼은 소계등 중간 집계 값을 산출하기 위한 그룹 함수.
    • 지정 컬럼의 수보다 하나 더 큰 레벨만큼의 중간 집계 값이 생성.
    • ROLLUP의 지정 컬럼은 계층별로 구성되기때문에 순서가 바뀌면 수행 결과가 바뀜에 주의.
    • ROLLUP 함수 구문
      SELECT 컬럼1 컬럼2 컬럼3 ... 그룹함수
      FROM 테이블명
      [WHERE  ...]
      GROUP BY [컬럼 ...] ROLLUP (컬럼)
      [HAVING ...]
      [ORDER BY ...]
      
    • 소계 집계 대상이 되는 컬럼을 ROLLUP뒤에 기재 소계집계 대상이 아닌 경우 GROUP BY 뒤에 기재.
    • SELECT 뒤에 포함되는 컬럼이 GROUP BY 또는 ROLLUP 뒤에 기재 되어야함을 숙지.
    • ORDER BY 구문을 활용해 계층내 정렬 사용 가능.
    • ROLLUP 예시
      SELECT DEPT, JOB, SUM(SALARY)
      FROM DEPT_SALARY
      GROUP BY ROLLUP (DEPT, JOB)
      
  • CUBE 함수
    • CUBE는 결합 가능한 모든 값에 대해 다차원 집계를 생성하는 그룹함수이다.
    • 세분화된 소계가 구해짐.
    • 연산이 많아 시스템에 부담을 준다.
    • CUBE 함수 구문
      SELECT 컬럼1, ... 그룹함수
      FROM 테이블명
      [WHERE  ...]
      GROUP BY [컬럼1, ...] CUBE (컬럼1, ...)
      [HAVING ...]
      [ORDER BY ...]
      
    • CUBE 예시
      SELECT DEPT, JOB, SUM(SALARY)
      FROM DEPT_SALARY
      GROUP BY CUBE(DEPT, JOPB)
      
  • GROUPING SETS 함수
    • 집계대상 컬럼들에 대한 개별 집계를 구할 수 있으며, CUBE와 같이 컬럼간 순서와 무관한 결과를 얻을 수 있는 그룹함수이다.
    • GROUPING SETS 를 이용해 다양한 소계 집합을 만들 수 있다.
    • ORDER BY를 사용하여 집계 대상 그룹과의 표시 순서를 조정하여 보여 줄 수 있다.
    • GROUPING SETS 함수 구문
      SELECT 컬럼1, ... 그룹함수
      FROM 테이블명
      [WHERE  ...]
      GROUP BY [컬럼1, ...] GROUPING SETS (컬럼1, ...)
      [HAVING ...]
      [ORDER BY ...]
      
    • GROUPING SETS 예시
      SELECT DEPT, JOB, SUM(SALARY)
      FROM DEPT_SALARY
      GROUP BY GROUPING SETS(DEPT, JOPB)
      


1.5. 윈도 함수

1.5.1. 윈도 함수의 개념

  • 데이터 베이스를 사용한 온라인 분석 처리 용도로 사용하기 위해 표준 SQL에 추가된 함수.
  • 윈도함수를 OLAP함수 라고도 한다.
    ✱ OLAP(OnLine Analytical Processing) : 의사결정 지원 시스템으로, 사용자가 동일한 데이터를 여러 기준을 이용하는 다양한 방식으로 바라보면서 다차원 데이터 분석을 할 수 있도록 도와주는 기술.

1.5.2. 윈도 함수의 구문

SELECT 함수명 (파라미터)
       OVER
       ([PARTITION BY 컬럼1, ...])
       [ORDER BY 컬럼A, ...]
FROM 테이블명

# PARTITION BY : 선택항목이며 순위를 정할 대상 범위의 컬럼을 설정
# PARTITION BY구에는 GROUP BY구가 가진 집약 기능이 없으며 이로인해 레코드가 줄어들지 않음.
# PARTITION BY 통해 구분된 레코드 집합을 윈도라 
# ORDER BY 뒤에는 SORT 컬럼을 입력어( 열을 어떤 순서로 순위를 정할지 지정)

1.5.3. 윈도 함수의 분류 ( Tip. 순행비 )

  • 위함수
  • 순서함수
  • 그룹내 율함수


  • 순위함수
    • 레코드의 순위를 계산하는 함수
    • RANK, DENSE_RANK, ROW_NUMBER 함수가 존재
      # RANK 
       > 특정항목(컬럼) 대한 순위를 구하는 함수
       > 동일순위의 레코드 존재시 후순위는 넘어감
       > 2위가 3개인 레코드인 경우  : 2,2,2, 5,6,...
      # DENSE_RANK
       > 레코드의 순위를 계산
       > 동일순위의 레코드 존재시에도 후순위를 넘어가지 않음
       > 2위가 3개인 레코드인 경우 : 2,2,2,3,4,...
      # ROW_NUMBER
       > 레코드의 순위를 계산
       > 동일 순위의 값이 존재해도 이와 무관하게 연속 번호를 부여
       > 2위가 3개인 레코드인 경우 : 2,3,4,5,6,...
      # 순위 함수 예제
      SELECT NAME
        ,SALARY
        ,RANK() OVER (ORDER BY SALARY DESC) A
        ,DENSE_RANK() OVER (ORDER BY SALARY DESC) B
        ,ROW_NUMBER() OVER (ORDER BY SALARY DESC) C 
      FROM EMPLOYEE;
      
  • 행순서함수
    • 레코드에서 가장 먼저 나오거나 가장 뒤에 나오는 값, 이전/이후의 값들을 출력하는 함수
    • FIRST_VALUE, LAST_VALUE, LAG, LEAD 함수가 존재
      # FIRST_VALUE 
       > 파티션별 윈도우에서 가장 먼저 나오는 값을 찾음
       > 집계 함수의 MIN 동일한 결과를 출력
      # LAST_VALUE
       > 파티션별 윈도우에서 가장 늦게 나오는 값을 찾음
       > 집계 함수의 MAX 동일한 결과를 출력
      # LAG
       > 파티션별 윈도우에서 이전 로우의  반환
      # LEAD
       > 파티션별 윈도우에서 이후 로우의  반환
      > # 행순서 함수 예제
      SELECT NAME
        ,SALARY
        ,FIRST_VALUE(NAME) OVER (ORDER BY SALARY DESC) A
        ,LAST_VALUE(NAME) OVER (ORDER BY SALARY DESC) B
        ,LAG(NAME) OVER (ORDER BY SALARY DESC) C 
        ,LEAD(NAME) OVER (ORDER BY SALARY DESC) D
      FROM EMPLOYEE;
      
  • 그룹내 비율 함수
    • 백분율을 보여주거나 행의 순서별 백분율 등 비율과 관련된 통계를 보여주는 함수
    • RATIO_TO_REPORT, PERCENT_RANK 함수가 존재
      # RATIO_TO_REPORT 
       > 주어진 그룹에 대해 합을 기준으로  로우의 상대적 비율을 반환하는 함수
       > 결과값은 0~1 범위 값을 가짐
      # PERCENT_RANK
       > 주어진 그룹에 대해 제일 먼저 나오는 것을 0으로, 제일 늦게 나오는 것을 1 하여, 값이 아닌  순서별 백분위를 구하는 함수
       > 결과값은 0~1 범위 값을 가짐
      # 그룹내 비율 함수 예제
      SELECT NAME
        ,SALARY
        ,RATIO_TO_REPORT(SALARY) OVER (ORDER BY SALARY DESC) A
        ,PERCENT_RANK() OVER (ORDER BY SALARY DESC) B
      FROM EMPLOYEE;
      



2. 특정 기능 수행 SQL문 작성

2.1. 응용 시스템 DBMS 접속 기술

  • 자바 데이터베이스 연결 (JDBC; Java DataBase Connectivity)
    • JDBC 는 SQL을 사용하여 DBMS에 질의하고 데이터를 조작하는 API를 제공 한다
  • MyBatis
    • SQL Mapping 기반 오픈 소스 Access Framework로 , DBMS에 질의하기 위한 SQL쿼리를 별도의 XML파일로 분리하고 Mapping을 통해 SQL을 실행.
    • MyBatis 는 DBMS 의존도가 높고 SQL 질의 언어를 사용하기 때문에 SQL 친화적인 국내 실무 개발 환경에 맞아서 많이 사용 된다.
    • 장단점
      • 복잡한 JDBC 코드를 단순화 할 수 있다.
      • SQL을 거의 그대로 사용 가능하다.
      • Spring 기반 프레임워크와 통합 기능을 제공한다.
      • 우수한 성능을 보여 준다.


2.2. MyBatis 작성 문법

2.2.1. SQL 문장의 입력 파라미터 사용 방법

# 사용자명(user_nm) 생년월일(user_birth_day) 입력받아 USER_ID 표시하는 SQL예제
<mappper> 
  <select id="findId" resultType="map">
      SELECT USER_ID
      FROM USER_INFO
      WHERE USER_NM = #{user_nm} AND BIRTH_DAY = #{user_birth_day}
</mappper>
  • 응용시스템 UI를 통해서 입력 파라미터를 입력받고 이를 SQL문에 적용한 후 실행
  • SQL 문은 미리 작성해 놓고, 사용자가 입력하는 항목에 따라 다른 조건의 SQL을 싱행하는게 목적
  • SELECT 문 뿐만아니라 INSERT, UPDATE, DELETE 문등에서 동일하게 사용 가능

2.2.2. 동적 SQL

  • 동적SQL : MyBatis 는 조건에 따라 SQL 구문 자체를 변경 할 수 있음
# if 구문을 사용하여 user_birthday  있을때만 "AND BIRTH_DAY=" 조건을 실행 예제 
<mappper> 
  <select id="findId" resultType="map">
      SELECT USER_ID
      FROM USER_INFO
      WHERE USER_NM = #{user_nm}
      <if input_para="user_birth_day != null">
        AND BIRTH_DAY = #{user_birth_day}
      </if>
      <if input_para="user_main != null">
        AND EMAIL = #{user_main}
      </if>
</mappper>
  • <if> 외에도 다중 문자열 반복입력시 사용하는 <foreach>, <choose when otherwise> 등이 사용.

2.2.3. 절차형 SQL 호출

  • MyBatis에서 절차형 SQL인 사용자 정의함수, 트리거, 프로시저의 실행이 가능
  • 사용자 정의함수는 DQL이나 DML에 포함하여 사용되기때문에 별도 호출이 의미가 없으며, 트리거 역시 DBMS에서 바로 실행되므로 별도 호출 불필요
  • 주로 프로시저 호출 사용
# 프로시저 호출 예제
<mappper> 
  <select id="execSalesDailyBatch" resultType="map" statementType="CALLLABLE">
     { CALL RUN_SALES_AMT_BATCH( #{TARGET_DATE} )}
</mappper>



3. 데이터 제어어 명령문 작성

3.1. 데이터 제어어(DCL; Data Control Language)의 개념

  • 데이터 베이스 관리자가 데이터 보안, 무결성유지, 병행제어, 회복을 위해 관리자(DBA)가 사용하는 제어용 언어.


3.2. 데이터 제어어(DCL)의 유형

  • GRANT : 사용 권한 부여 : 관리자(DBA)가 사용자에게 데이터베이스에 대한 권한을 부여하는 명령어.
  • REVOKE : 사용 권한 취소 : 관리자(DBA)가 사용자에게 부여했던 권한을 회수하기 위한 명령어.


3.3. 데이터 제어어(DCL) 명령문

  • GRANT(권한부여) 명령문 ( Tip. 그온투위 )
    • GRANT 권한 ON 테이블 TO 사용자 [WITH 권한 옵션];
    • 관리자가 사용자에게 테이블에 대한 권한을 부여
    • WITH GRANT OPTION : 사용자가 권한을 받고난 후 다른 사람들과 권한을 나눠가질 수 있는 옵션
      # 예문 (관리자가 사용자 장길산에게 학생 테이블에 대해 UPDATE권한과  권한을 필요시 다른 사용자에게 부여할  있는 권한 부여)
      GRANT UPDATE ON 학생 TO 장길산 WITH GRANT OPTION;
      
  • REVOKE(권한취소) 명령문 ( Tip. 리온프캐 )
    • REVOKE 권한 ON 테이블 FROM 사용자 [CASCADE CONSTRAINTS];
    • 관리자가 사용자에게 부여했던 테이블에 대한 권한을 회수
    • CASCADE CONSTRAINTS : 연쇄적인 권한을 해제할 때 입력(WITH GRANT OPTION으로 부여된 사용자들의 권한까지 취소)
      # 예문 (관리자가 사용자 장길산에게 학생 테이블에 대해 UPDATE   있는 권한을 회수)
      REVOKE UPDATE ON 학생 FROM 장길산 CASCADE CONSTRAINTS;
      





  • 정보처리기사 필기 합격 후 실기대비 정리 및 책없이 간단히 보기위해 작성하였습니다.
  • 2020년 수제비 정보처리기사 책 기반으로 정리 하였습니다.
  • 저작권 관련 문제가 있다면 hojunbbaek@gmail.com 으로 메일 주시면 바로 삭제 조치 하도록 하겠습니다.