코딩헤딩

MariaDB 데이터베이스[database, DB] 그룹함수 본문

데이터베이스

MariaDB 데이터베이스[database, DB] 그룹함수

멈머이 2023. 11. 22. 23:35
728x90

* 그룹함수

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

 

* 종류

 - count() : 행의 갯수 (컬럼명을 사용하는 경우 null은 제외)
 - avg() : 평균 (null인 경우 처리필요)
 - max() : 최대값 (null인 경우 처리필요)
 - min() : 최소값 (null인 경우 처리필요)
 - sum() : 합계 (null인 경우 처리필요)

 

SELECT COUNT(nvl(prod_mileage,0)) AS all_cnt,
		 COUNT(*) AS all_cnt2,
		 AVG(nvl(prod_mileage,0)) AS all_avg,
		 SUM(nvl(prod_mileage,0)) AS all_sum,
		 MAX(nvl(prod_mileage,0)) AS all_max,
		 MIN(nvl(prod_mileage,0)) AS all_min
FROM prod;

 count         count         avg           sum          max          min

 

 

* Group By ~ Having절

일반조건일 때 : where절 사용
그룹함수에 대한 조건일 때 : Group By ~ Having절 사용
          => Group By절 : 그룹으로 묶고자 하는 컬렴명 or 일반함수를 처리한 컬럼 지정
          => Having절 : 1. 그룹함수를 이용한 조건(비교연산자) 사용
                                 2.그룹 조건이 없으면 Having절은 사용 안 해도 됨 (Group By절만 사용가능)

*****그룹에 대한 문제로 인식하는 방법 : ~ 별로 조회라는 개념적 용어가 사용되면 Group By로 사용

 

<컴파일순서>                                                      <sql 작성>

  1. select                                   ->                        select 컬럼들
  2. from 테이블                          ->                        from 테이블
  3. where ~ and                         ->                        where 일반조건 / and 일반조건
  4. group by                               ->                        group by 그룹컬럼
  5. having                                   ->                        having 그룹조건
  6. select 뒤에 컬럼들
  7. order by                                ->                        order by 정렬할 컬럼들

*변하지 않음 국제규칙

 

<group by를 사용한 경우 규칙>
  - group by절에 제시된 컬럼들은 원형그대로, 조회할 컬럼에 제시.
  - select절 뒤에 컬럼 또는 일반함수를 이용해서 조회하고자 하는 컬럼들은 
     group by절에 원형 그대로 제시되어 있어야 오류가 안남.
  - 컬럼뒤에 별칭(as)은 group by절에는 사용하면 오류남.

 

 

회원 취미별로 count 하기
group by에 지정한 컬럼 또는 일반함수를 이용한 경우 : select절에 예의상 넣어주기

SELECT mem_like, COUNT(nvl(mem_like,0)) AS cnt_like
FROM member
GROUP BY mem_like;

group by에 지정한 컬럼 또는 일반함수를 이용한 경우 : select절에 예의상 넣어주기. 안 넣어주면 뭐가 뭔지 모른다.

 

 

 

예제)

1. [GROUP BY사용]

     회원의 성별 count값 조회하기
     조회컬럼 : 회원성별, count값

SELECT (case substring(mem_regno2,1,1)
									when 1 then '남'
									when 3 then '남'
									ELSE '여'
									END) AS mem_gen,
		 COUNT(nvl((case substring(mem_regno2,1,1)
									when 1 then '남'
									when 3 then '남'
									ELSE '여'
									END),0)) AS gen_count
FROM member
GROUP BY substring(mem_regno2,1,1);

 

 

2. cart테이블을 이용해서 회원별로 count 하기

SELECT cart_member, COUNT(nvl(cart_member,0)) AS mem_num, 
    MAX(nvl(cart_qty,0)) AS max_qty,
    SUM(nvl(cart_qty,0)) AS sum_qty
FROM cart
GROUP BY cart_member;

 

 

3. 임의 회원이 2005년 4월 1일에 상품하나를 구매했다. 주문번호 발급하기
      조회컬럼 : 주문번호만

SELECT MAX(nvl(cart_no,0))+1 AS new_cart_no
FROM cart
WHERE cart_no LIKE '20050401%';

가장 큰 값에서 +1 해주면 된다.

728x90