[DB] Oracle SQL 함수 (그룹함수_최소, 최대, 평균, GROUP BY, HAVING 등)
사용자가 필요한 기능을 만드는 함수가 아닌 오라클 자체적으로 제공하는 함수
단일행 함수 : 1개의 행 값이 함수에 적용되어 1개의 을 반환 (문자, 숫자, 날짜 등)
그룹함수 : 2개 이상의 행 값이 함수에 적용되어 1개의 행을 반환 (최소, 최대, 평균 등)
**MySQL 함수 참고
[DBMS] 함수(제어흐름, 문자열, 수학, 날짜 및 시간, 시스템 정보)
[제어흐름 함수] 프로그램의 흐름을 제어한다. if 함수 : 수식의 진리값에 따른 값 반환 select 컬럼, if(조건, '참일때반환값', '거짓일때반환값') from 테이블; select bookno, if(bookno>=3,'A','B') as if_result fr
studywithjw.tistory.com
그룹함수
여러 행의 연산결과를 하나의 행으로 반환
𖤐NULL이 있는 행은 카운트 하지 않는다.𖤐
COUNT : 행의 개수 반환
MAX : 최대값
MIN : 최소값
SUM : 합계
AVG : 평균
STDDEV : 표준편차
VARIANCE : 분산
--사원테이블에서 부서의 개수를 출력하기
SELECT COUNT(DEPARTMENT_ID) FROM EMPLOYEES; --106개? 중복때문!
SELECT COUNT(DISTINCT DEPARTMENT_ID) FROM EMPLOYEES; --11개
--DISTINCT : 중복제외
** DISTINCT : MySQL 함수 참고
[DBMS] order by, limit, distinct, group by, 서브쿼리, 다중조건문
[order by] select * from 테이블명 order by 컬럼명 desc/asc; select문 사용 시 테이블에 입력된 순서대로 출력되는 것이 기본 내림차순(desc), 오름차순(asc) 정렬 필요할 때 사용 기본사용 select * from city order b
studywithjw.tistory.com
--부서번호가 80인 부서 사원들의 급여 평균을 출력
SELECT ROUND(AVG(SALARY),1) FROM EMPLOYEES WHERE DEPARTMENT_ID = 80;
--사원테이블에서 부서번호가 50인 사원들의 급여 최대값과 최소값 출력
SELECT MAX(SALARY), MIN(SALARY) FROM EMPLOYEES WHERE DEPARTMENT_ID = 50;
GROUP BY 와 HAVING
** MySQL 함수 참고
[DBMS] order by, limit, distinct, group by, 서브쿼리, 다중조건문
[order by] select * from 테이블명 order by 컬럼명 desc/asc; select문 사용 시 테이블에 입력된 순서대로 출력되는 것이 기본 내림차순(desc), 오름차순(asc) 정렬 필요할 때 사용 기본사용 select * from city order b
studywithjw.tistory.com
GROUP BY : 특정 테이블에서 소그룹을 만들어 결과를 분산시켜 얻고자 할 때 ex.부서별, 직종별 등
--부서별 급여 평균과 총합
SELECT DEPARTMENT_ID, AVG(SALARY), SUM(SALARY) FROM EMPLOYEES GROUP BY DEPARTMENT_ID;
GROUP BY로 소그룹 지정한 속성은 SELECT 절에서도 사용이 가능하다.
--각 직종별 인원수 출력
SELECT JOB_ID, COUNT(*) FROM EMPLOYEES GROUP BY JOB_ID;
--각 직종별 급여의 합 출력
SELECT JOB_ID, SUM(SALARY) FROM EMPLOYEES GROUP BY JOB_ID;
HAVING : GROUP BY로 집계된 값 중에서 where처럼 특정조건 추가 𖤐집계함수는 HAVING 절을 쓸 수 없음 𖤐
--각 부서 급여의 최대값 최소값 인원수를 조회하되 급여의 최대값이 8000이상인 결과만 출력 SELECT DEPARTMENT_ID, MAX(SALARY), MIN(SALARY), COUNT(*) FROM EMPLOYEES
GROUP BY DEPARTMENT_ID HAVING MAX(SALARY) >= 8000;
--각 부서별 인원수가 20명 이상인 부서를 부서번호, 급여합, 급여평균, 인원수 순으로 출력하되
급여의 평균은 소수점 2번째 자리까지 출력하기 (셋째자리에서 반올림)
SELECT DEPARTMENT_ID, SUM(SALARY), ROUND(AVG(SALARY),2), COUNT(*) FROM EMPLOYEES
GROUP BY DEPARTMENT_ID HAVING COUNT(*) >= 20;

--부서별, 직종별로 그룹화 하여 부서번호, 직종, 인원수 순으로 출력하되
직종이 'Man'으로 끝나는 경우에만 출력
SELECT DEPARTMENT_ID, JOB_ID, COUNT(*) FROM EMPLOYEES
WHERE JOB_ID LIKE '%MAN'
GROUP BY DEPARTMENT_ID, JOB_ID;

--각 부서별 평균급여를 소수점 한자리까지 버림으로 출력하되
평균급여가 10000미만인 그룹만 조회해야하고 부서번호가 50번 이하인 부서만 조회
SELECT DEPARTMENT_ID, TRUNC(AVG(SALARY),1) FROM EMPLOYEES
WHERE DEPARTMENT_ID <50
GROUP BY DEPARTMENT_ID HAVING TRUNC(AVG(SALARY),1)<10000;

--각 부서별 부서번호, 급여합, 평균, 인원수 순으로 출력하되
급여의 합이 30000이상인 경우만 출력하고 급여의 평균은 소수점 2번째 자리에서 반올림
SELECT DEPARTMENT_ID, SUM(SALARY), ROUND(AVG(SALARY),1), COUNT(*) FROM EMPLOYEES
GROUP BY DEPARTMENT_ID HAVING SUM(SALARY)>=30000;
