본문 바로가기

데이터베이스/Oracle

내장함수(다중행 함수, 그룹화, 정렬하기)

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

키에 묶인 값 대상의 count


--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;

GROUP BY를 한다는 것, 행을 이동해가면서 키별로 연산이 진행됨

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

GROUP BY절에서 사용한 컬럼만 집계함수에서 사용 가능하다 그 외의 컬럼은 집계함수에서 사용 불가능하다.
부서별 사원명은 불가, 값이 하나하나씩 관리되는건 상관없지만 여러값이 관리되는건 할 수 없다 집계의 결과는 가능 일반 컬럼은 집계함수와 같이 사용할 수 없고 집계함수와 함께 쓰는건 group by 절만 가능

--부서별, 직무별 부서번호, 직무번호, 사원수를 출력하시오
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