[ORACLE] SQL DEVELOPER 2일차 - 그룹함수

jeong·2021년 6월 6일
0

Oracle(SQL) 오라클

목록 보기
5/16

지난 포스팅 : 함수, 단일함수

그룹함수

그룹함수

: 값을 여러 개 전달받아 처리하여 결과값을 반환하는 함수
COUNT(컬럼명) : 컬럼값의 갯수를 반환하는 함수 - 검색행의 갯수 반환

--EMPNO 갯수 
SELECT COUNT(EMPNO) FROM EMP;

질의 결과

*그룹함수는 다른 검색대상과 같이 사용 불가능 - 검색대상의 검색행의 갯수가 서로 다르므로 에러 발생

SELECT EMPNO,ENAME,COUNT(EMPNO) FROM EMP; 
--에러 발생 : COUNT(EMPNO) 하나의 행, EMPNO,ENAME 여러개의 행

*그룹함수는 NULL를 값으로 인식하지 않아 미처리

SELECT COUNT(EMPNO),COUNT(COMM) FROM EMP;

질의 결과

SELECT COUNT(*)FROM EMP;

질의 결과

MAX(컬럼명) : 컬럼값 중 최대값을 반환하는 함수

SELECT MAX(SAL) FROM EMP;
SELECT MAX(ENAME) FROM EMP;
SELECT MAX(HIREDATE) FROM EMP;

질의 결과

MIN(컬럼명) : 컬럼값 중 최소값을 반환하는 함수

SELECT MIN(SAL) FROM EMP;
SELECT MIN(ENAME) FROM EMP;
SELECT MIN(HIREDATE) FROM EMP;

질의 결과

SUM(컬럼명) : 숫자형 컬럼의 값을 전달받아 합계를 계산하여 반환하는 함수

SELECT SUM(SAL) FROM EMP

AVG(컬럼명) : 숫자형 컬럼의 값을 전달받아 평균을 계산하여 반환하는 함수

--소수점 막 나옴 
SELECT AVG(SAL) FROM EMP; 
--소수점 둘째자리까지 나오도록 계산 (EX 2073.21)
SELECT ROUND(AVG(SAL),2) FROM EMP; --달러면 ROUND 사용 가능 
--EMP 테이블에서 모든 사원의 평균 성과급을 계산하여 검색
--성과급이 NULL이 아닌 사원들에 대한 평균 급여 검색 
SELECT AVG(COMM) FROM EMP; --잘못된 값, 커미션이 NULL인 사원은 계산되지 않았다

질의 결과 -- 잘못된 값

--EMP 테이블에서 모든 사원의 평균 성과급을 계산하여 검색
--성과급이 NULL이 아닌 사원들에 대한 평균 급여 검색 

--NVL 함수를 사용하여 성과급이 NULL인 경우 0으로 변환하여 평균 성과급을 계산하여 검색
SELECT CEIL(AVG(NVL(COMM,0))) "평균 성과급" FROM EMP;

질의 결과 -- NULL을 0으로 바꿔 더해준 올바른 값 

--EMP 테이블에 저장된 모든 사원에 대한 인원수 검색 
SELECT COUNT(*) FROM EMP;

질의 결과값 

--EMP 테이블에 저장된 부서별 사원 인원수 검색
SELECT DISTINCT DEPTNO FROM EMP;
SELECT COUNT(*) FROM EMP WHERE DEPTNO=10;
SELECT COUNT(*) FROM EMP WHERE DEPTNO=20;
SELECT COUNT(*) FROM EMP WHERE DEPTNO=30;

질의 결과값


GROUP BY : 그룹함수를 사용할 경우 컬럼값으로 그룹을 구분하여 검색하는 기능*
-> 컬럼값이 같은 경우 같은 그룹으로 처리
--형식)SELECT 그룹함수[,검색대상...] FROM 테이블명,테이블명,... [WHERE 조건식]
-- GROUP BY {컬럼명|연산식|함수},... [ORDER BY {컬럼명|연산식|별칭|첨자} {ASC|DESC},...]

--EMP 테이블에 저장된 부서별 사원 인원수 검색 
SELECT COUNT(*) FROM EMP GROUP BY DEPTNO;

질의 결과

*GROUP BY 구문에서 사용된 그룹 표현식은 그룹함수와 같이 검색대상으로 사용 가능

SELECT DEPTNO,COUNT(*) FROM EMP GROUP BY DEPTNO ORDER BY DEPTNO;

질의 결과

--검색대상의 별칭은 GROUP BY 구문의 그룹 표현식으로 사용할 경우 에러 발생 
SELECT DEPTNO DNO,COUNT(*) FROM EMP GROUP BY DNO;--에러 발생
--EMP 테이블에서 모든 사원의 업무별 평균 급여 검색 
SELECT JOB,CEIL(AVG(SAL)) AVG_SAL FROM EMP GROUP BY JOB; 

질의 결과

--EMP 테이블에서 업무가 [PRESIDENT]인 사원을 제외한 모든 사원의 업무별 평균 급여 검색 
SELECT JOB,CEIL(AVG(SAL)) AVG_SAL FROM EMP WHERE JOB<>'PRESIDENT' GROUP BY JOB; --WHERE 값을 쓰는게 더 맞음
SELECT JOB,CEIL(AVG(SAL)) AVG_SAL FROM EMP GROUP BY JOB HAVING JOB<>'PRESIDENT'; 

질의 결과

ASC|DESC : 오름차순|내림차순

--EMP 테이블에서 업무가 [PRESIDENT]인 사원을 제외한 모든 사원의 업무별 평균 급여를 평균 급여로 내림차순 정렬하여 검색 
SELECT JOB,CEIL(AVG(SAL)) AVG_SAL FROM EMP WHERE JOB<>'PRESIDENT' GROUP BY JOB ORDER BY AVG_SAL DESC;

질의 결과

HAVING : GROUP BY 구문으로 그룹화된 검색 결과의 그룹조건을 제공하여 검색하는 기능
--형식)SELECT 그룹함수[,검색대상...] FROM 테이블명,테이블명,... [WHERE 조건식]
-- GROUP BY {컬럼명|연산식|함수},... HAVING 그룹조건식 [ORDER BY {컬럼명|연산식|별칭|첨자} {ASC|DESC},...]

--EMP 테이블에서 모든 사원의 부서별 급여 합계 중 급여 합계가 9000이상인 부서 검색 
SELECT DEPTNO,SUM(SAL) FROM EMP GROUP BY DEPTNO HAVING SUM(SAL)>=9000;

질의 결과

profile
배우는 초보개발자

0개의 댓글