그룹 함수
- 그룹 단위로 데이터를 입력받아 연산하는 종류의 함수
- 그룹함수는 입력받은 그룹의 수만큼 결과가 출력된다.
MAX(최대) / MIN(최소)
- 아래의 예제에서는 그룹 관련 작업을 하지 않아 테이블의 모든 행이 하나의 그룹으로 취급되며, 따라서 1개의 행 결과가 출력되었음.
MAX(expr) : 각 그룹에서 입력값에 대한 최대값을 돌려주는 함수
SELECT MIN(salary) AS "최소 급여", MAX(salary) AS "최대 급여"
FROM employees;
최소 급여 |최대 급여 |
-----------+------------+
2310.00 |26510.00 |
MIN(expr) : 각 그룹에서 입력값에 대한 최소값을 돌려주는 함수
SELECT MIN(hire_date) AS "가장 오래된 입사일", MAX(hire_date) "가장 최근 입사일"
FROM employees;
가장 오래된 입사일|가장 최근 입사일 |
------------------+-----------------+
1987-06-17 |2000-04-21 |
MIN, MAX
SELECT MIN(last_name) AS "name1", MAX(last_name) AS "name2"
FROM employees;
name1|name2 |
-----+-------+
Abel |Zlotkey|
- 전 사원에 대한 LENGTH(last_name)의 결과값을 MAX, MIN 함수에 입력하여 가장 크고, 가장 작은 값을 돌려받음.
SELECT MIN(LENGTH(last_name)) AS "name1", MAX(LENGTH(last_name)) AS "name2"
FROM employees;
name1|name2|
-----+-----+
3| 11|
SUM(합계) / AVG(평균)
- SUM(n) : 그룹 단위로 입력받은 숫자값들의 총합을 계산한다.
- AVG(n) : 그룹 단위로 입력받은 숫자값들의 평균을 계산한다.
- 전 사원의 급여값을 입력하여 각각 합계와 평균을 계산
SELECT SUM(salary) AS "급여 합계", AVG(salary) AS "평균 급여"
FROM employees;
급여 합계 |평균 급여 |
-------------+---------------+
760650.00 |7108.878505 |
SELECT SUM(salary) AS "급여 합계", AVG(salary) AS "평균 급여"
FROM employees
WHERE job_id LIKE '%REP%';
급여 합계 |평균 급여 |
---------+-----------+
300300.00|9100.000000|
COUNT(*) / COUNT([DISTINCT] expr)
- COUNT : 입력값의 수를 카운트하는 함수
SELECT COUNT(last_name), COUNT(department_id), COUNT(manager_id), COUNT(commission_pct)
FROM employees;
COUNT(last_name)|COUNT(department_id)|COUNT(manager_id)|COUNT(commission_pct)|
----------------+--------------------+-----------------+---------------------+
107| 106| 106| 35|
COUNT(*)
- 행의 수를 카운트하기 때문에 NULL값을 고려하지 않아도 된다. '*' 은 COUNT 함수에서만 사용가능한 방법이다.
SELECT COUNT(*)
FROM employees;
COUNT(*)|
--------+
107|
COUNT(DISTINCT expr)
- 입력받은 값들에서 중복값을 제거한 값을 카운트한다.
- 실제 중복값을 제거한 행의 수는 12개 행이 출력된다.
SELECT DISTINCT department_id
FROM employees;
department_id|
-------------+
|
10|
20|
30|
40|
50|
60|
70|
80|
90|
100|
110|
• DISTINCT를 적용한 결과는 중복값제거와 NULL값의 데이터가 빠지면서 11개의 행에 대해서만 카운트하였기 때문.
SELECT COUNT(DISTINCT department_id)
FROM employees;
COUNT(DISTINCT department_id)|
-----------------------------+
11|
GROUP BY절
- 그룹의 단위를 만드는 기준을 설정하는 절
- GROUP BY절에 명시된 기준으로 동일한 값을 가진 행끼리 동일한 그룹으로 묶이게 된다. 또한 묶을 때 사용한 값은 그룹의 이름으로 사용된다.
- 그룹 함수를 사용하는 경우 SELECT절에는 GROUP BY절의 기준값만 그룹 이름 목적으로 출력이 가능하다.
- group by에 사용했던 컬럼을 사용하면 select절에는 이름을 표시하는 목적으로 department_id로 바뀜
group by에 있는 컬럼만 select에 사용가능
group by에는 select에 없는 컬럼 사용 가능
기준 값이 여럿인 경우
- 여러 기준값을 사용하여 그룹을 만드는 경우 기준의 모든 값들이 동일해야지만 같은 그룹으로 묶이게되며 기준값들 중 하나라도 다른 값이 있다면 다른 그룹으로 취급된다.
- 이때도 마찬가지로 GROUP BY절에 사용된 컬럼들만 SELECT절에 작성이 가능하며 의무적으로 사용할 필요는 없으며, 부분적으로 사용하거나 사용하지 않아도 상관없다.
- 아래와 같이 department_id, job_id 두가지 기준으로 그룹을 묶는 경우 동일 부서, 동일 직무를 동시에 만족해야 같은 그룹으로 묶이게 된다.
department_id와 job_id가 동시에 일치해야 같은 값으로 분류됨
부서가 같아도 직무가 다르기 때문에 다른 값으로 나눠짐
HAVING절
- GROUP BY절에 의해서 생성된 그룹들을 제한(필터링)하는 옵션절
- HAVING절에는 조건의 기준으로 그룹함수를 사용한다.
- 연산자는 WHERE과 동일하다.
SELECT문의 논리적인 수행 순서
'DB > MySQL' 카테고리의 다른 글
[Mysql] 인라인뷰, 조건의 쌍비교 방식 (2) | 2023.09.16 |
---|---|
[Mysql] 서브쿼리 (0) | 2023.09.16 |
[Mysql] 그룹함수와 그룹화 (0) | 2023.09.16 |
[Mysql] 제어 흐름 함수 (0) | 2023.09.16 |
[Mysql] 자주 쓰이는 변환함수 모음 (1) | 2023.09.16 |