여러 행들을 합쳐서 행수, 합, 평균은 어떠한지 확인, 결과가 한개만 도출됨. 
--B. 다중행함수(집계함수): COUNT(), SUM(), AVG(), MAX(), MIN()
: 테이블의 각 열에 대해 계산을 하는 함수
SELECT COUNT(*) "전체사원수" --107 행수셀 때는 *
	  ,COUNT(commission_pct) "수당받는사원수" --35
	  ,COUNT(department_id) "부서배치받은사원수" 
FROM employees;
--sum() null을 포함하지 않은 합 
null이 아닌 행수를 세고싶으면 null값을 포함하고 있는 컬럼명 쓰기
SELECT SUM(salary) "총급여" --691416
	  ,AVG(salary) "평균급여" --6461.831775700934579439252336448598130841
FROM employees;
--예시 tbl_A가 있다고 가정
| 100 | 
| 200 | 
| NULL | 
SELECT COUNT(*) --3
	  ,COUNT(a) --2
	  ,SUM(a)   --300
	  ,AVG(a)   --150
FROM tbl_a;
SELECT MAX(salary), MIN(salary)
FROM employees;

--C. 그룹화 
SELECT 집계함수 
FROM ①
WHERE 2② 
GROUP BY 3 ③ ~별로 묶음처리 
HAVING ④
ORDER BY ⑤
순서대로 처리됨
--GROUP BY : GROUP BY에서 사용한 컬럼만 집계함수와 함께 SELECT 절에서 사용할 수 있다 
GROUP BY에서 사용안한 컬럼은 집계함수와 함께 SELECT 절에서 사용할 수 없다.
--부서별 부서번호, 사원수를 출력하시오
SELECT department_id
	  ,COUNT(*) "부서별사원수"
	  ,MAX(salary) "부서의 최대급여"
	  ,AVG(salary) "부서의 평균급여"
FROM employees
GROUP BY department_id;

--부서별 부서번호, 부서의 최대급여, 최대급여자 이름을 출력하시오(SUBQUERY로 해결해야함)
SELECT department_id
	  ,MAX(salary)
	  ,first_name
FROM employees
GROUP BY department_id;


--부서별, 직무별 부서번호, 직무번호, 사원수를 출력하시오
SELECT department_id, job_id, COUNT(*)
FROM employees
GROUP BY department_id, job_id
ORDER BY department_id, COUNT(*);
--그룹별 소계, 합계 : ROLLUP(); --집계용 대표함수 
--계산 가능한 모든 소계, 합계: CUBE()
SELECT department_id, job_id, COUNT(*)
FROM employees
--GROUP BY department_id, job_id
GROUP BY ROLLUP(department_id, job_id)
ORDER BY department_id, COUNT(*);
부서에 대한 직무별 소계
20 (null) 2 
30 (null) 6 
50 (null) 45 
마지막행 (null) (null) 107 : 부서에 대한 합계
--1)그룹조건:HAVING - 집계함수사용 가능 
--2)일반조건:WHERE - 집계함수사용 불가능
--30, 50번 부서의 부서별 부서번호, 평균급여, 최대급여를 출력하시오
SELECT department_id, AVG(salary), MAX(salary)
FROM employees
WHERE department_id = 30 or department_id = 50
GROUP BY department_id
ORDER BY department_id;
SELECT department_id, AVG(salary), MAX(salary)
FROM employees
WHERE department_id IN(30, 50)
GROUP BY department_id
ORDER BY department_id;
--부서의 부서별 부서번호, 평균급여, 최대급여를 출력하시오
--부서가 없는 사원들은 출력하지 않는다
SELECT department_id, AVG(salary), MAX(salary)
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
ORDER BY department_id;
SELECT department_id
	  ,TRUNC(AVG(salary), 0) "평균급여"
	  ,TRUNC(MAX(salary), 0) "최대급여"
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
SELECT department_id
	  ,TRUNC(AVG(salary), 0) "평균급여"
	  ,TRUNC(MAX(salary), 0) "최대급여"
FROM employees
GROUP BY department_id
HAVING department_id IS NOT NULL;
--결과는 같지만 일반 조건인 경우에는 WHERE절에 조건 거는게 퍼포먼스가 좋다.
--그룹에 대한 조건은 HAVING절에
--부서의 부서번호, 평균급여, 최대급여, 최소급여를 출력하시오
--평균급여가 10000이상인 부서만 출력하시오
SELECT department_id, AVG(salary), MAX(salary), MIN(salary)
FROM employees
WHERE AVG(salary) >= 10000
GROUP BY department_id;(X)
FROM → WHERE → GROUP BY (KEY) → HAVING → SELECT GROUP BY가 지나가야 집계함수 가능함 
여기서 WHERE AVG(salary) >= 10000 집계함수 사용 불가. 
일반 조건은 WHERE, 그룹에 대한 조건은 HAVING
SELECT department_id, AVG(salary), MAX(salary), MIN(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) >= 10000;(○)
--D. 정렬하기 : ORDER BY 
SELECT 처리순서 : FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
--입사일자가 빠른 순서대로 출력하시오
SELECT employee_id, hire_date, salary
FROM employees
--ORDER BY hire_date;
ORDER BY hire_date ASC; --ASC 오름차순, 생략가능함
--급여가 많은 사원부터 출력하시오
SELECT employee_id, hire_date, salary
FROM employees
ORDER BY salary DESC; --DESC 내림차순
--입사일자가 빠른 순서대로 출력하시오
--입사일자가 같은 경우, 급여가 많은 사원부터 출력하시오
SELECT employee_id, hire_date, salary
FROM employees
ORDER BY hire_date ASC, salary DESC;'데이터베이스 > Oracle' 카테고리의 다른 글
| JOIN 예제 (0) | 2023.08.22 | 
|---|---|
| JOIN (0) | 2023.08.21 | 
| 내장함수(단일행 함수) (1) | 2023.08.21 | 
| 방화벽 오라클만 풀기 (0) | 2023.08.21 | 
| SQL 기본 예제 1 (0) | 2023.08.21 |