데이터베이스

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 일지
Developer Story HouseIT계의 큰손이 되고 싶은 개린이의 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

인기 글

태그

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

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