SQL - GROUPING

김규린·2024년 8월 23일
0

Data Base

목록 보기
8/20

1. Grouping

  • group by절은 결과 집합을 특정 열의 값에 따라 그룹화하는데 사용된다.
  • HAVING은 GROUP BY 절과 함께 사용해야 하며 그룹에 대한 조건을 적용하는데 사용

1. Group by

  • GROUP BY 쿼리 진행 순서

  • where절 있을 경우 쿼리 진행 순서

  • order by까지 있을 경우 쿼리 진행 순서

-- group by

SELECT
		category_code
		, COUNT(*)
		, SUM(menu_price)
		, AVG(menu_price)
	FROM tbl_menu
	WHERE category_code IS NOT null
	GROUP BY category_code
	ORDER BY 2;

함수의 종류
단일행 함수: nvl 또는 ifnull과 같이 단일 행마다 적용되어 행의 개수만큼 결과가 나오는 경우
그룹 함수: count, sum, avg와 같이 그룹마다 적용되어 그룹의 개수만큼 결과가 나오는 경우
(단, group by절이 없는 조회는 그룹 함수의 결과가 단일행(행 하나)이다.)

조회의 6가지 절을 모두 활용한 예제

  1. select: group by 절에서 group을 묶는 조건으로 활용한 컬럼만 조회 또는 그룹 함수를 통해 조회한다.
  2. from: 테이블 또는 join을 활용한 result set을 작성한다.
  3. where: from절의 각 행마다 적용될 조건을 작성한다.
  4. group by: where절까지 만족하는 행들에 대해 그룹이 될 컬럼을 작성한다.
  5. having: 그룹별로 적용할 조건을 group by에서 작성한 컬럼 또는 그룹 함수를 통해 조회한다.
  6. order by: 제일 마지막에 해석되며 select의 결과(result set)의 순번, 별칭, 컬럼명 등으로 오름차순 또는 내림차순 한다.

2. Having

  • GROUP에 대한 조건이라고 생각하면 됨

  • HAVING과 WHERE의 차이

    WHERE

    • SELECT * FROM 테이블명 WHERE 조건절
      - ‘항상 FROM절 뒤’에 위치하고 조건에는 다양한 비교연산자들이 사용되어 구체적인 조건 줄 수 있음

      HAVING

    • SELECT * FROM 테이블명 GROUP BY 필드명 HAVING 조건절

      • ‘항상 GROUP BY 뒤’에 위치하고 WHERE 조건절과 마찬가지로 조건에는 다양한 비교연산자들이 사용되어 구체적인 조건을 줄 수 있음
  • HAVING의 진행 순서

-- having

SELECT
		category_code
		, COUNT(*) -- 모든 행 개수 세기
		, COUNT(category_code) -- category_code가 null이 아닌 행만 개수 세기
		, SUM(menu_price)
		, AVG(menu_price)
	FROM tbl_menu
	WHERE category_code IS NOT null
	GROUP BY category_code
	HAVING SUM(menu_price) >= 24000
	ORDER BY 2;
	
-- ---------------------------------------------------------------	
-- 메뉴가 없는 카테고리까지 셀건지, 구분해서 count 해보기
SELECT
 		COUNT(*)
 		, COUNT(a.menu_name)
	FROM tbl_menu a
	RIGHT JOIN tbl_category b ON (a.category_code = b.category_code);

2-1. COUNT

  • count(*): null값 포함한 모든 값

  • count(컬럼명): null 값을 제외한 값

3. RollUP

  • 중간 합계 및 최종 합계 도출
  • group by에서 두 개 이상의 컬럼으로 그룹 형성 시 ROLLUP을 통해 먼저 나온 컬럼의 총합을 구하고 이후 나오는 컬럼의 총합도 구하는 방식
-- roll up

-- 앞에 적은 걸 기준으로 중간 합계가 나오게 된다. 
SELECT
		menu_price
		, category_code
		, SUM(menu_price)
	FROM tbl_menu
	GROUP BY menu_price, category_code 
	WITH ROLLUP;
	
	

CREATE TABLE sales (
    code INT AUTO_INCREMENT, -- auto_increment: 1씩 증가하고 기억해주는 것
    year VARCHAR(4),
    month VARCHAR(2),
    product VARCHAR(50),
    amount DECIMAL(10,2),
    PRIMARY KEY(code)
);

INSERT
  INTO sales
(
  CODE, YEAR, MONTH
, product, amount
)
VALUES
(
   NULL,  '2023',  LPAD('1', 2, '0')
,  'Product A', 1000.00
),
(
   NULL,  '2023',  LPAD('1', 2, '0')
,  'Product A', 1500.00
),
(
   NULL,  '2023',  LPAD('2', 2, '0')
,  'Product A', 2000.00
),
(
   NULL,  '2023',  LPAD('2', 2, '0')
,  'Product A', 2500.00
),
(
   NULL,  '2023',  LPAD('3', 2, '0')
,  'Product A', 1200.00
),
(
   NULL,  '2023',  LPAD('3', 2, '0')
,  'Product A', 1700.00
);
-- LPAD 함수

SELECT * FROM sales;	

-- 연, 월, 상품명을 모두 하나의 그룹으로 묶어
-- 연 월, 중간 합계 및 전체 합계를 rollup으로 구해 보자.

SELECT
		year
		, month
		, product
		, SUM(amount) AS total_sales
	FROM sales
	GROUP BY YEAR, MONTH, product
	WITH ROLLUP;

  • menu_price 합계로 중간 합계가 나옴
profile
나는 할 수 있다...!

0개의 댓글