DBMS (MySQL)/DBMS (Oracle)

[DB] Oracle SQL 함수 (그룹함수_최소, 최대, 평균, GROUP BY, HAVING 등)

(งᐛ)ว 2023. 10. 17. 22:11
728x90

사용자가 필요한 기능을 만드는 함수가 아닌 오라클 자체적으로 제공하는 함수

단일행 함수 : 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(SALARYFROM 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_IDAVG(SALARY), SUM(SALARYFROM EMPLOYEES GROUP BY DEPARTMENT_ID;

 

GROUP BY로 소그룹 지정한 속성은 SELECT 절에서도 사용이 가능하다.

--각 직종별 인원수 출력

SELECT JOB_IDCOUNT(*) FROM EMPLOYEES GROUP BY JOB_ID;

--각 직종별 급여의 합 출력

SELECT JOB_IDSUM(SALARYFROM 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;

 

 

 

 

728x90