여러 행들을 합쳐서 행수, 합, 평균은 어떠한지 확인, 결과가 한개만 도출됨.
--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 |