09. 통계함수

Last updated - 2024년 11월 21일 Edit Source

    유튜버 쉬운코드 님의 데이터베이스 강의를 정리한 내용


    # 정렬

    # ORDER BY

    ORDER BY : 조회 결과를 특정 attribute(s) 기준으로 정렬하여 가져올 때 사용

    • default 정렬 방식은 오름차순
    • 오름차순 정렬은 ASC
    • 내림차순 정렬은 DESC

    ex) 임직원들의 정보를 연봉 순서대로 정렬해서 알고싶음 - 오름차순


    ex) 임직원들의 정보를 연봉 순서대로 정렬해서 알고싶음 - 내림차순



    ex) 임직원들의 정보를 같은 부서 안에서 연봉 순서대로 정렬해서 알고싶음

    • 앞에 적힌 dept_id로 먼저 정렬
      • MySQL에서는 NULL을 가장 작게 인식해서 먼저 나옴
    • 부서 내에서 연봉 순서대로 정렬됨


    # 집계

    집계 함수 (Aggregate function) : 여러 tuple 들의 정보를 요약해서 하나의 값으로 추출하는 함수

    • 대표적으로 COUNT, SUM, MAX, MIN, AVG 함수
    • (주로) 관심있는 attribute에 사용
      • ex) AVG(salary) , MAX(birth_date)
    • NULL 값들을 제외하고 요약 값 추출



    # COUNT

    COUNT로 수를 셀 때는 애스터리스크(*)를 사용하는 것을 추천


    ex) 임직원의 수를 알고싶음

    • 애스터리스크(*)는 튜플의 수를 의미



    ex) 포지션을 가지는 임직원의 수를 알고싶음

    • 결과가 위와 동일한 것을 볼 수 있음
    • attribute의 값에 중복이 있다고 하더라도 중복을 포함해서 COUNT함



    ex) 부서를 가지는 임직원의 수를 알고싶음

    • NULL을 제외하고 중복을 포함하여 나머지 COUNT



    ex) 프로젝트 2002에 참여한 임직원의 수와 최대 연봉과 최소 연봉과 평균 연봉을 알고싶음

    • works_on 테이블은 누가 어떤 프로젝트에 참여했는지에 대한 정보가 있으니까 참조해야함
    • employee 테이블은 연봉 정보가 있으니까 참조해야함


    # 그룹

    # GROUP BY

    GROUP BY : 관심있는 attribute(s) 기준으로 그룹을 나눠서 그룹별로 aggregate function을 적용하고 싶을 때 사용

    • grouping attribute(s) : 그룹을 나누는 기준이 되는 attribute(s)
    • grouping attribute(s)에 NULL 값이 있을 때는 NULL 값을 가지는 tuple끼리 묶임
    • 그룹을 기준으로 했으면 SELECT에 그 그룹 가져와야지 !



    ex) 각 프로젝트에 참여한 임직원의 수와 최대 연봉과 최소 연봉과 평균 연봉을 알고싶음



    # HAVING

    HAVING : aggregate function의 결과값을 바탕으로 그룹을 필터링하고 싶을 때 사용

    • GROUP BY와 함께 사용
    • HAVING 절에 명시된 조건을 만족하는 그룹만 결과에 포함됨



    ex) 프로젝트 참여 인원이 7명 이상인 프로젝트들에 대하여 각 프로젝트에 참여한 임직원의 수와 최대 연봉과 최소 연봉과 평균 연봉을 알고싶음



    # 예제

    ex) 각 부서별 인원 수를 인원 수가 많은 순서대로 정렬해서 알고싶음



    ex) 각 부서별 - 성별 인원 수를 인원 수가 많은 순서대로 정렬해서 알고싶음



    ex) 회사 전체 평균 연봉보다 평균 연봉이 적은 부서들의 평균 연봉을 알고싶음



    ex) 각 프로젝트 별로 프로젝트에 참여한 90년대생들의 수와 이들의 평균 연봉을 알고싶음

    • ROUND()는 소숫점 이하 반올림

    • 이 결과를 proj_id 기준으로 정렬한 것



    ex) 프로젝트 참여 인원이 7명 이상인 프로젝트에 한정해서 각 프로젝트 별로 프로젝트에 참여한 90년대생들의 수와 이들의 평균을 알고싶음

    • 내가 걸어주려는 조건이 어떤 조건인지에 따라 WHERE 절에 명시할건지, HAVING절에 조건을 명시할 건지 파악해야함


    만약 위 예제에서 HAVING절에 조건을 걸었다면?

    • HAVING절에 사용된 COUNT는 그룹핑을 한 뒤에 그 그룹에 대해 카운트를 한 값이다.
      • 이 COUNT의 의미는 각 부서별로 90년대생에 대한 카운트이다.
      • 각 부서별 90년대 생에 대한 참여를 카운트 한 것



    # SELECT 최종 정리

    SELECT 조회 요약

    1
    2
    3
    4
    5
    6
    
    SELECT 속성() 혹은 집계함수()
    FROM 테이블()
    [WHERE 조건()]
    [GROUP BY 그룹속성()]
    [HAVING 그룹속성()]
    [ORDER BY 속성()];
    

    SELECT 개념적인 실행 순서

    • select 쿼리에서 각 절(phase)의 실행 순서는 개념적인 순서이다.
    • select 쿼리의 실제 실행 순서는 각 RDBMS에서 어떻게 구현했는지에 따라 다름
    1. FROM : 어떤 테이블로부터 조회할 것인지 혹은 join이 된 테이블들
    2. WHERE : 가지고 오는 튜플들에 대해서 조건을 통해 필터링 해야한다면
    3. GROUP BY : 그룹핑을 하고싶다면
    4. HAVING : 그룹핑 이후 특정 그룹만 필터링 해서 가지고 오고싶다면
    5. ORDER BY : 최종적인 select로 가져오기 직전에 정렬해서 가져오고싶다면
    6. SELECT : 관심있는 속성이나 통계에 관하여 최종적인 조회

    Comment