Backend/SQL

[SQL] GROUP BY (집계함수, HAVING)

해로몬 2024. 10. 28. 10:31

DML(Data manipulation Language) : select, insert, update, delete

DDL(Data Definition Language) : create, alter, drop

DCL(Data Control Language)

TCL(Transaction Contriol Language)

 

show databases;

use [database_name];

show tables;

desc(ribe) [table_name];


터미널 또는 명령 프롬프트에서 MariaDB 또는 MySQL 서버에 접속하는 방법
mysql -u [사용자명] -p -h [호스트명 또는 IP 주소] -P [포트 번호] [데이터베이스 이름]
  • 예시:
    • mysql -u root -p sample
    • mysql -u root -p -h localhost -P 3306 database
      • -u: 사용자 이름을 지정합니다.
      • -p: 비밀번호 입력을 요구합니다. -p[your_password] 형식으로 비밀번호를 바로 입력할 수도 있지만 보안에 취약할 수 있습니다.
      • -h: 서버의 호스트명 또는 IP 주소입니다. localhost는 로컬 서버를 의미합니다.
      • -P: 데이터베이스 서버의 포트 번호입니다. 기본 포트는 3306입니다.
      • [데이터베이스 이름]: 특정 데이터베이스에 바로 접속하고 싶을 때 지정할 수 있습니다.

GROUP BY

쿼리 결과를 특정 열 기준으로 그룹화 하여,각 그룹에 대해 집계 연산을 수행할 수 있습니다.

ex) 부서별 직원수나 부서별 급여 합계를 구할 때 유용함

 

  • 단일 열을 기준으로 GROUP BY 사용하기
SELECT deptno, COUNT(*) AS 직원수
FROM emp
GROUP BY deptno;

//실행 결과
+--------+-----------+
| deptno | 직원수    |
+--------+-----------+
|     10 |         3 |
|     20 |         5 |
|     30 |         6 |
+--------+-----------+
3 rows in set (0.001 sec)

 

  • 여러 열을 기준으로 GROUP BY 사용하기
//부서별, 직책별 직원 수 구하기
SELECT deptno, job, COUNT(*) AS 직원_수
FROM emp
GROUP BY deptno, job;

//결과
+--------+-----------+------------+
| deptno | job       | 직원_수    |
+--------+-----------+------------+
|     10 | CLERK     |          1 |
|     10 | MANAGER   |          1 |
|     10 | PRESIDENT |          1 |
|     20 | ANALYST   |          2 |
|     20 | CLERK     |          2 |
|     20 | MANAGER   |          1 |
|     30 | CLERK     |          1 |
|     30 | MANAGER   |          1 |
|     30 | SALESMAN  |          4 |
+--------+-----------+------------+
9 rows in set (0.000 sec)
  • GROUP BY와 집계 함수 조합
SELECT job, truncate(AVG(sal), 1) AS 평균_급여 FROM emp GROUP BY job;
+-----------+---------------+
| job       | 평균_급여     |
+-----------+---------------+
| ANALYST   |        3000.0 |
| CLERK     |        1037.5 |
| MANAGER   |        2758.3 |
| PRESIDENT |        5000.0 |
| SALESMAN  |        1400.0 |
+-----------+---------------+

//job을 기준으로 각 직업의 평균 급여를 계산
//AVG() 함수는 그룹별 평균을 구하는 집계 함수.
  •  HAVING절로 그룹화된 결과 필터링하기. 
    • 그룹화 후 필터링 할때 사용. ➡️ 그룹화된 결과에 조건을 걸 수 있음.
//직원 수가 3명 이상인 부서만 필터링
SELECT deptno, COUNT(*) AS 직원수
FROM emp
GROUP BY deptno
HAVING COUNT(*) >=3;

//결과값
+--------+-----------+
| deptno | 직원수    |
+--------+-----------+
|     10 |         3 |
|     20 |         5 |
|     30 |         6 |
+--------+-----------+
3 rows in set (0.002 sec)

 

'Backend > SQL' 카테고리의 다른 글

[SQL] 참조키 : 기본키, 외래키  (0) 2024.10.29
[SQL] DDL(Data Definition Language)  (0) 2024.10.28
[SQL]JOIN  (0) 2024.10.28
[SQL]서브쿼리(Subquery)  (0) 2024.10.28
[SQL] MariaDB 연산자/내장함수  (0) 2024.10.25