-- 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가지 절을 모두 활용한 예제
GROUP에 대한 조건이라고 생각하면 됨
HAVING과 WHERE의 차이
WHERE
SELECT * FROM 테이블명 WHERE 조건절
- ‘항상 FROM절 뒤’에 위치하고 조건에는 다양한 비교연산자들이 사용되어 구체적인 조건 줄 수 있음
HAVING
SELECT * FROM 테이블명 GROUP BY 필드명 HAVING 조건절
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);
-- 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;