데이터베이스

DATABASE STEP 18 - Having 절

2023. 3. 20. 16:26
728x90

★ Having 절

  • 조건절
  • group by로 부터 나온 셋에 대한 조건
  • 집합에 대한 질문 > 집계 함수값을 조건으로 사용
  • 조합
[WITH <Sub Query>]                                  - WITH 절
SELECT column_list                                     - SELECT 절 
FROM table_name                                     - FROM 절
[WHERE search_condition]                            - WHERE 절
[GROUP BY group_by_expression]                  - GROUP BY 절
[HAVING search_condition]                          - HAVING 절
[ORDER BY order_expresstion [ASC|DESC]];      - ORDER BY 절

select 컬럼리스트  -- 5. 컬럼을 선택
from 테이블         -- 1. 테이블로부터
where 조건          -- 2. 원하는 레코드를
group by 기준      -- 3. 그룹을 나눠서
having 절            -- 4. 그룹에 대한 조건
order by 정렬조건 -- 6. 정렬한다.

 

■ having 절 사용 ex)

  • 1. group by절만 사용
select 
    buseo,
    round(avg(basicpay))      -- 3. 나눠진 그룹별로 집계함수를 각각 구한다.
from tblInsa                     -- 1. 60명의 데이터를 가져온다.
    group by buseo;           -- 2. 60명을 대상으로 > 부서로 그룹을 나눈다.
  • 2. where 절 복합사용
select 
    buseo,
    round(avg(basicpay)) as "평균 급여"         -- 4. 나눠진 그룹별로 집계함수를 각각 구한다.
from tblInsa                                           -- 1. 60명의 데이터를 가져온다.
    where basicpay >= 1500000                 -- 2. 60명을 대상으로 조건에 맞는 직원만 남긴다.
        group by buseo;                             -- 3. where절을 만족한 대상으로 > 부서로 그룹을 나눈다.
  • 3. Having 절
select
    buseo,
    round(avg(basicpay)) as "평균 급여"      -- 4. 나눠진 그룹별로 집계함수를 각각 구한다.
from tblInsa                                        -- 1. 60명의 데이터를  가져온다.
    group by buseo                               -- 2. 60명을 대상으로 > 부서별 그룹을 나눈다.
        having avg(basicpay) >= 1500000   -- 3. 부서별 150만원 이상인 그룹만 남긴다.(그룹별 집계함수값을 조건으로 필터링)
            order by avg(basicpay) desc;


select
    buseo,
    round(avg(basicpay)) as "평균 급여"              -- 5.
from tblInsa                                                -- 1. from 절 
    where basicpay >= 1500000                      -- 2. where 절
        group by buseo                                   -- 3. 
            having avg(basicpay) >= 2200000        -- 4.
                order by avg(basicpay) desc;           -- 6.

 

■ 요구사항에 따른 ex)

-- tblZoo. 체온이 변온인 종류 중 아가미 호흡과 폐 호흡을 하는 종들의 갯수를 가져오시오.
SELECT 
    count(case
        when breath in ('lung') then 1
    end) as "변온,폐 호흡",
    count(case
        when breath in ('gill') then 1
    end) as "변온,아가미 호흡"
FROM tblzoo
    GROUP BY thermo
        HAVING thermo = 'variable';


-- tblAddressBook. 관리자의 실수로 몇몇 사람들의 이메일 주소가 중복되었다. 중복된 이메일 주소만 가져오시오.
select *
from tblAddressBook;
select 
    Email,
    count(email)
from tblAddressBook
    Group by email
    having count(email)>1;
-- tblAddressBook. 성씨별 인원수가 100명 이상 되는 성씨들을 가져오시오.
select 
    substr(name, 1, 1) as "성",
    count(substr(name, 1, 1))
from tblAddressBook
    Group by substr(name, 1, 1)
    having count(substr(name, 1, 1)) >= 100;
-- tblAddressBook. '건물주'와 '건물주자제분'들의 거주지가 서울과 지방의 비율이 어떻게 되느냐?
select
    job,
    count(*) as "총인원수",
    count(case
            when substr(address, 1, 2) = '서울' then 1
    end) as "서울 거주",
    count(case
            when substr(address, 1, 2) <> '서울' then 1
    end) as "서울 비거주",
    
    round(count(case
            when substr(address, 1, 2) = '서울' then 1
    end) / count(*) * 100, 2) as "서울 거주(%)",
    
    round(count(case
            when substr(address, 1, 2) <> '서울' then 1
    end) / count(*) * 100, 2) as "서울 비거주(%)"
    
from tblAddressBook
    group by job
        having job in ('건물주', '건물주자제분');

 

★ Group by 함수

  • 1. roll up()
  • 2. cube()

 

■ 1. roll up()

  • group by 결과에서 집계 결과를 더 자세하게 반환
  • 사용 ex)
select
    buseo,
    count(*),
    round(avg(basicpay))
from tblInsa
    group by rollup(buseo); -- rollup은 총계를 내줌.
    
select
    buseo,
    jikwi,
    count(*),
    round(avg(basicpay))
from tblInsa
    group by rollup(buseo, jikwi);
      --  order by buseo asc, jikwi asc;
      

select
    buseo,
    jikwi,
    city,
    count(*),
    round(avg(basicpay))
from tblInsa
    group by rollup(buseo, jikwi, city);

 

■ 2. cube()

  • group by 결과에서 집계 결과를 더 자세하게 반환
  • roll up() 보다 조금 더 자세하게 표현
  • 사용 ex)
select
    buseo,
    jikwi,
    count(*),
    round(avg(basicpay))
from tblInsa
    group by cube(buseo, jikwi);
    
select
    buseo,
    jikwi,
    city,
    count(*),
    round(avg(basicpay))
from tblInsa
    group by cube(buseo, jikwi,city);
728x90
저작자표시 비영리 변경금지 (새창열림)

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

DATABASE STEP 20 - RDBMS&Foreign key  (0) 2023.03.21
DATABASE STEP 19 - SubQuery  (0) 2023.03.21
DATABASE STEP 17 - Group By  (0) 2023.03.18
DATABASE STEP 16 - Update&Delete  (0) 2023.03.18
DATABASE STEP 15 - Insert  (0) 2023.03.18
'데이터베이스' 카테고리의 다른 글
  • DATABASE STEP 20 - RDBMS&Foreign key
  • DATABASE STEP 19 - SubQuery
  • DATABASE STEP 17 - Group By
  • DATABASE STEP 16 - Update&Delete
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
  • 정보처리기사
  • IT개발자
  • 자바
  • DB
  • jsp
  • html
  • 데이터베이스
  • 정보보안전문가
  • JavaScript
  • 웹페이지
  • 백준
  • 백엔드
  • 프론트엔드
  • 앱개발자
  • ajax
  • css
  • IT자격증
  • 정보처리기사필기
  • 개발자
  • 웹개발자
  • java
  • it
  • IT자격증공부
  • 개발블로그
  • jquery
  • 웹개발
  • React

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
DATABASE STEP 18 - Having 절
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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