데이터베이스

DATABASE STEP 8 - Aggregation_Function

2023. 3. 17. 15:15
728x90

★ 함수

  • 1. 내장형 함수(Built-in Function)
  • 2. 사용자 정의 함수(User Function)

★ 집계 함수(Aggregation Function)

  • 1. count()
  • 2. sum()
  • 3. avg()
  • 4. max()
  • 5. min()

■ 1. Count()

  • 결과 테이블의 레코드 수를 반환한다.
  • number count(컬럼명)
  • null 레코드는 제외된다.
  • 사용 ex)
select name
    from tblCountry; 
    
-- 테이블의 레코드 개수
select count(name)
    from tblCountry; 

-- 'AS' 에 속한 나라 갯수? 
select count(name)
    from tblCountry
        where continent = 'AS';
        
select capital 
    from tblCountry

select count(capital)
    from tblCountry

--population 에는 null값이 있기 떄문에 null 값이 반환되지 않아 값이 다르게 나옴
select count(population)
    from tblCountry;

-- tblCountry에 나라가 총 몇개? 14
select count(name) from tblCountry;
select count(capital) from tblCountry;
select count(population) from tblCountry;

---- 해결책
select count(*) from tblCountry; --null과 상관없이 테이블의 행 갯수를 정확하게 파악

--모든 직원수
select count(*) from tblInsa;
--연락처가 있는 직원수?
select count(tel) from tblInsa;
--연락처가 없는 직원수?
select count(*) - count(tel) from tblInsa;
-- 연락처가 있는 직원수? 방법2
select count(*) 
    from tblInsa
    where tel is not null
-- 연락처가 없는 직원수? 방법2
select count(*) 
    from tblInsa
    where tel is null
    
-- tblInsa. 어떤 부서들 있나요?
select distinct buseo from tblInsa;

-- tblInsa. 부서가 몇개 있나요?
select count( distinct buseo) from tblInsa;

-- tblComedian. 남자수? 여자수?
select count(*) from tblComedian where gender ='m'; --남자수 --8
select count(*) from tblComedian where gender ='f'; --여자수 --2

-- *** 자주 사용되는 패턴
select 
    count(*) as 전체인원수,
    count(case
        when gender = 'm' then 'A'
    end) as 남자인원수,
    count(case
        when gender = 'f' then 'B' 
    end) as 여자인원수
    from tblComedian;

-- tblInsa. 기획부 몇명? 총무부 몇명? 개발부 몇명?
select
    count(*) as 전체인원수,
    count(case
        when buseo = '기획부' then 'A'
    end) as 기획부인원수,
    count(case
        when buseo = '총무부' then 'B'
    end) as 총무부인원수,
    count(case
        when buseo = '개발부' then 'C'
    end) as 개발부인원수
from tblInsa;

-- 단일컬럼 or * : 이렇게 하면 불가능함. 에러 발생
select
    count(name, buseo)
from tblInsa;

 

■ 2. sum()

  • 해당 컬럼의 합을 구한다.
  • number sum(컬럼명)
  • 숫자형만 적용 가능
  • 사용 ex)
select *
    from tblComedian;
select sum(height),  sum(weight)
    from tblComedian;
-- 에러 발생 : 숫자가 아닌 컬럼을 sum하여서 에러.
select sum(first) 
    from tblComedian;

select 
    sum(basicpay) as "지출 급여 합",
    sum(sudang) as "지출 수당 합",
    sum(basicpay) + sum(sudang) as "총 지출",
    sum(basicpay+sudang) as "총 지출"
from tblInsa;

 

■ 3. avg()

  • 해당 컬럼의 평균값을 구한다.
  • number avg(컬럼명)
  • 숫자형만 적용 가능
  • null 값은 버림(***********)
  • 사용 ex)
-- tblInsa. 평균 급여?
select sum(basicpay) / 60 
    from tblInsa;
select sum(basicpay) / count(*)
    from tblInsa;
select avg(basicpay) 
    from tblInsa;

-- 평균 인구수?
select
    avg(population),    
    sum(population) / count(*),
    sum(population) / count(population)
from tblCountry;

select
    count(*), -- 인구수가 null 값이 케냐가 포함
    count(population) -- 인구수가 null값인 케냐가 비포함
from tblCountry;

 

■ max() or min()

  • object max(컬럼명)
  • 최댓값 반환
  • object min(컬럼명)
  • 최솟값 반환
  • 숫자형, 문자형, 날짜형 모두 적용 가능함.
  • 사용 ex)
-- 1. 숫자형 ex)
select 
    max(height),
    min(height)
from tblComedian;

-- 2. 문자형 ex)
select
    max(name),
    min(name)
from tblInsa;

-- 3. 날짜형 ex)
select 
    max(ibsadate),
    min(ibsadate)
from tblInsa;

 

■ 종합 요구사항 모음

  • count() 요구사항
-- 1. tblCountry. 아시아(AS)와 유럽(EU)에 속한 나라의 개수?? -> 7개
select
    count(case
        when Continent = 'AS' then 'A'
   end) as 아시아개수,
    count(case 
        when Continent = 'EU' then 'B'
   end) as 유럽개수
from tblCountry;

-- 2. 인구수가 7000 ~ 20000 사이인 나라의 개수?? -> 2개
select
    count(case
        when population between 7000 and 20000 then 'A'
    end) as 개수
from tblCountry;

-- 3. hr.employees. job_id > 'IT_PROG' 중에서 급여가 5000불이 넘는 직원이 몇명? -> 2명
select * from employees;
select
    count(case
        when job_id = 'IT_PROG' and salary > 5000 then 'A'
    end) as 인원
from employees;

-- 4. tblInsa. tel. 010을 안쓰는 사람은 몇명?(연락처가 없는 사람은 제외) -> 42명
select * from tblInsa;
select 
    count(case
        when tel not like  '010-%-%' then 'A'
    end) as 인원
from tblInsa;

-- 5. city. 서울, 경기, 인천 -> 그 외의 지역 인원수? -> 18명
select
    count(case
        when city not in ('서울', '경기', '인천') then 'A'
    end) as 인원
from tblInsa;

-- 6. 여름태생(7~9월) + 여자 직원 총 몇명? -> 7명
select
    count(case
        when ssn like '__07%-2%' or  ssn like '__08%-2%' or  ssn like '__09%-2%' then 'A'
    end) as 인원
from tblInsa;

-- 7. 개발부 + 직위별 인원수? -> 부장 ?명, 과장 ?명, 대리 ?명, 사원 ?명
select
    count(case
            when buseo = '개발부' and jikwi = '부장' then 'A'
     end) as 부장,
     count(case
            when buseo = '개발부' and jikwi = '과장' then 'A'
     end) as 과장,  
     count(case
            when buseo = '개발부' and jikwi = '대리' then 'A'
     end) as 대리, 
     count(case
            when buseo = '개발부' and jikwi = '사원' then 'A'
     end) as 사원   
from tblInsa;

 

  • sum() 요구사항
--1. 유럽과 아프리카에 속한 나라의 인구 수 합? tblCountry > 14,198
select * from tblCountry;
select sum(Population)
    from tblCountry
    where continent in ('EU' , 'AF');
    
--2. 매니저(108)이 관리하고 있는 직원들의 급여 총합? hr.employees > 39,600
select * from employees
select sum(salary)
    from hr.employees
    where manager_id = 108;
    
--3. 직업(ST_CLERK, SH_CLERK)을 가지는 직원들의 급여 합? hr.employees > 120,000
select sum(salary)
    from hr.employees
    where job_id in ('ST_CLERK', 'SH_CLERK');
    
--4. 서울에 있는 직원들의 급여 합(급여 + 수당)? tblInsa > 33,812,400
select * from tblInsa
select sum(basicpay + sudang)
    from tblInsa
    where city = '서울'
    
--5. 장급(부장+과장)들의 급여 합? tblInsa > 36,289,000
select sum(basicpay)
    from tblInsa
    where jikwi in ('부장', '과장');

 

  • avg() 요구사항
--1. 아시아에 속한 국가의 평균 인구수? tblCountry > 39,165
select avg(population)
    from tblCountry
    where continent = 'AS'
    
--2. 이름(first_name)에 'AN'이 포함된 직원들의 평균 급여?(대소문자 구분없이) hr.employees > 6,270.4
select avg(salary)
    from employees
    where first_name like '%an%';
    
--3. 장급(부장+과장)의 평균 급여? tblInsa > 2,419,266.66
select avg(basicpay)
    from tblInsa
    where jikwi in ('부장' , '과장');
    
--4. 사원급(대리+사원)의 평균 급여? tblInsa > 1,268,946.66
select avg(basicpay)
    from tblInsa
    where jikwi in ('대리' , '사원');
    
--5. 장급(부장,과장)의 평균 급여와 사원급(대리,사원)의 평균 급여의 차액? tblInsa > 1,150,320
select
    avg(case
        when jikwi in ('부장' , '과장') then basicpay
    end)
    - avg(case
        when jikwi in ('대리' , '사원') then basicpay
    end) as "평균 급여의 차액"
    from tblInsa;

 

  • max(), min() 요구사항
--1. 면적이 가장 넓은 나라의 면적은? tblCountry > 959
select max(Area)
from tblCountry;

--2. 급여(급여+수당)가 가장 적은 직원은 총 얼마를 받고 있는가? tblInsa > 988,000
select min(basicpay+sudang)
from tblInsa;
728x90
저작자표시 비영리 변경금지 (새창열림)

'데이터베이스' 카테고리의 다른 글

DATABASE STEP 10 - String_Function  (0) 2023.03.17
DATABASE STEP 9 - Numerical_Function  (0) 2023.03.17
DATABASE STEP 7 - Order  (0) 2023.03.17
DATABASE STEP 6 - Column  (0) 2023.03.17
DATABASE STEP 5 - Where  (0) 2023.03.16
'데이터베이스' 카테고리의 다른 글
  • DATABASE STEP 10 - String_Function
  • DATABASE STEP 9 - Numerical_Function
  • DATABASE STEP 7 - Order
  • DATABASE STEP 6 - Column
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • DBA
  • 정보처리기사
  • 개발자
  • 백엔드
  • java
  • 자바
  • React
  • it
  • 앱개발자
  • jsp
  • JavaScript
  • DB
  • css
  • IT자격증공부
  • ajax
  • 웹개발자
  • 프론트엔드
  • 백준
  • 정보처리기사필기
  • 알고리즘
  • jquery
  • 웹페이지
  • 데이터베이스
  • IT자격증
  • 코딩테스트
  • 정보보안전문가
  • 웹개발
  • 개발블로그
  • html
  • IT개발자

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
DATABASE STEP 8 - Aggregation_Function
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.