본문 바로가기
MYSQL

GROUP BY

by 융디's 2024. 5. 5.
728x90
GROUP BY

GROUP BY

@2024.05.02

단일행 함수

💡
하나의 행에 대해 연산을 수행하고 결과를 반환하는 함수로, 주로 WHERE 절이나 SELECT 문의 칼럼 목록에서 사용
  • 종류
    • ABS, CEILING, FLOOR, ROUND, UPPER, TRIM, CONCAT, SUBSTRING, REPLACE ,NOW 등

그룹 함수

💡
여러 행을 그룹화하고 그룹 단위로 연산을 수행한 후 결과를 반환하는 함수로,
일반적으로
GROUP BY 절과 함께 사용된다
  • 종류
    • 집계함수 COUNT, SUM, AVG, MIN, MAX , GROUP_CONCAT, VARIANCE, STDDEV
-- 부서별(groupby) 평균 급여를 구해주세요, 단 평균 급여가 2000이하인 부서는 제외하고 조회하세요
select deptno, avg(sal) from emp group by deptno having avg(sal) > 2000;

-- 급여사 4500이상 1000이하의 사원은 제외하고 ---  where절에서 거르고
-- 부서별(groupby) 평균 급여를 구하세요, 단 평균 급여가 2000이하인 부서는 제외하고 조회
select deptno, avg(sal)
from emp
where sal < 4500 and sal > 1000
group by deptno
having avg(sal) > 2000;

GROUP BY 절

💡
특정 열을 기준으로 결과를 그룹화하고, 그룹 단위로 집계 함수를 적용하여 요약된 결과를 얻을 때 사용
  • 구성
    • 그룹화
      • GROUP BY 절은 결과를 특정 열의 값에 따라 그룹으로 나눈다.
      • EX) 부서별로 직원을 그룹화하거나, 도시별로 주문을 그룹화
    • 집계 함수와 함께 사용
      • 그룹별로 데이터를 집계하고 요약하는 데 사용
      • EX) 각 부서별로 직원의 수 계산, 각 도시별로 주문 총액 계산
  • 예시
    -- 각 부서별로 직원수가 출력
    SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department;
    
    -- 부서별 연봉 평균 출력 
    SELECT department_id , AVG(salary) FROM employees GROUP BY department_id;
  • 주의 사항
    1. SELECT 절에 그룹 함수가 오면 나머지 칼럼은 GROUP BY 절에 기술되어야 한다.
      • SELECT 절그룹 함수가 오거나, GROUP BY 절 이하에 기술된 칼럼이 오면
        나머지 칼럼은
        SELECT절 뒤에 기술할 수 없다.
    -- 잘못된 코드  : 그룹화하지 않은 salary가 SELECT 구절에 있기 때문
    SELECT department, salary, COUNT(*) AS employee_count
    FROM employees
    GROUP BY department;
    
    -- 수정된 올바른 코드  1. salary를 GROUP BY 절에 추가한다. 
    SELECT department, salary, COUNT(*) AS employee_count
    FROM employees
    GROUP BY department, salary;
    
    -- 수정된 올바른 코드 2. salary에 집계함수를 사용한다. 
    SELECT department, AVG(salary) AS avg_salary, COUNT(*) AS employee_count
    FROM employees
    GROUP BY department;
    1. GROUP에 대한 조건은 WHERE 절에 기술할 수 없고, HAVING 절에 기술되어야 한다.
    -- 잘못된 코드 
    -- 그룹 함수인 AVG(salary)를 사용하여 생성된 avg_salary열은 WHERE절에서 사용할 수 없다.
    SELECT department, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department
    WHERE avg_salary > 5500;
    
    -- 수정된 코드 
    SELECT department, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department
    HAVING avg_salary > 5500;
728x90

'MYSQL' 카테고리의 다른 글

SUBQUERY  (0) 2024.05.07
조인  (0) 2024.05.07
형 변환  (0) 2024.05.05
[내장 함수] 집계 함수  (0) 2024.05.05
[내장 함수] 날짜형 함수  (0) 2024.05.05