티스토리 뷰

수업/└Oracle

[CH07]다중행 함수

onlyun 2022. 1. 13. 16:43

※ SQL 실행 순서 ※

구문 순서 필수여부
SELECT 5 필수
FROM 1 필수
WHERE 2 선택
GROUP BY 3 선택
HAVING 4 선택
ORDER BY 6 선택

1. FROM 절에서 테이블의 목록을 가져옴
2. WHERE 절에서 검색 조건에 불일치 하는 행 제외 
3. GROUP BY 절에서 명시된 행의 값을 그룹화
4. HAVING 절이 GROUP BY 절의 결과 행 중 검색 조건에 불일치 하는 행 제외
5. SELECT 절에서 명시된 열을 정리
6. ORDER BY 절에서 열을 기준으로 출력할 대상을 정렬 후 출력

 

 

다중행 함수

SUM, COUNT, MAX·MIN·AVG 등등

여러 행을 바탕으로 하나의 결과 반환

SELECT는 열의 행을 출력하기 때문에 주의.

여러 행을 바탕으로 하나의 결과를 반환하는 것과 데이터 수(?)가 안 맞음.


(1) SUM 함수는 NULL 데이터 제외

--추가 수당 합계 구하기
SELECT SUM(COMM)
  FROM EMP;

 

(2) COUNT : 데이터 개수
--COUNT(*) : NULL값 포함 // COUNT(컬럼명) : NULL값 제외한 데이터 개수

--EMP 테이블 데이터 개수 출력
SELECT COUNT(*)
  FROM EMP;

--부서 번호 30번인 직원 수 구하기
SELECT COUNT(*)
  FROM EMP
 WHERE DEPTNO = 30;
 
--COUNT 함수 사용하여 추가수당(COMM) 열 개수 출력
SELECT COUNT(COMM)
  FROM EMP;

 

(3) 최대값, 최소값, 평균값

--MAX
--부서 번호가 10번인 사원들 중 최대 급여 출력
SELECT MAX(SAL)
  FROM EMP
 WHERE DEPTNO = 10;

SELECT SAL
  FROM EMP
 WHERE DEPTNO = 10
 ORDER BY SAL DESC;
 
--부서 번호가 20번인 사원들의 입사일 중 제일 최근 입사일 출력
SELECT MAX(HIREDATE)
  FROM EMP
 WHERE  DEPTNO = 20;
--MIN
--부서번호가 10번인 사원들의 최소 급여 출력
SELECT MIN(SAL)
  FROM EMP
 WHERE DEPTNO =10;
 
--검증
SELECT SAL
  FROM EMP
 WHERE DEPTNO = 10
 ORDER BY SAL DESC;

--부서 번호가 20인 사원의 입사일 중 제일 오래된 입사일 출력
SELECT MIN(HIREDATE)
 FROM EMP
 WHERE DEPTNO = 20;
--AVG
--부서 번호가 30인 사람들의 평균 급여
SELECT AVG(SAL)
  FROM EMP
 WHERE DEPTNO = 30;

 

(4) GROUP BY

여러 데이터에서 의미 있는 하나의 결과를 특정 열값별로 묶어서 출력.

(*단일그룹함수가 아니라고 오류 떴을 때, SELECT절과 GROUPY BY절의 열이 똑같이 나열됐는지 확인)

--GROUP BY
SELECT    조회할 열 이름 나열
  FROM    조회할 테이블 이름
 WHERE    조회할 행을 선별하는 조건식
GROUP BY  그룹화할 열 지정(여러 개 가능)
ORDER BY  정렬하려는 열 지정

(예제)

-부서번호별 급여 평균 출력 : UNION ALL

SELECT AVG(SAL)
  FROM EMP
 WHERE DEPTNO = 10
UNION ALL
SELECT AVG(SAL)
  FROM EMP
 WHERE DEPTNO = 20
UNION ALL
SELECT AVG(SAL)
  FROM EMP
 WHERE DEPTNO = 30;

-부서번호별 급여 평균 출력 : GROUP BY

SELECT DEPTNO, AVG(SAL)
  FROM EMP
 GROUP BY DEPTNO;

-GROUP BY 주의사항

GROUP BY절에 명시된 열 외의 것을 SELECT절에 명시할 수 없음. 에러 뜸.

SELECT는 전체를 출력하는데 GROUP BY는 하나의 결과로 묶어서 출력하기 때문에 데이터 수(?)가 안 맞음

--GROUP BY절에 없는 열을 SELECT절에 포함했을 경우
SELECT ENAME, DEPTNO, AVG(SAL)
  FROM EMP
 GROUP BY DEPTNO;
 
--GROUP BY절에 명시된 열 외의 것을 SELECT절에 명시할 수 없음. 에러 뜸.
--SELECT절에 추가한 것을 GROUP BY절에도 추가해준다. 혹은 함께 빼거나.
SELECT ENAME, DEPTNO, AVG(SAL)
  FROM EMP
 GROUP BY ENAME, DEPTNO;

 

(5) HAVING

그룹화된 대상을 출력에서 제한

SELECT    조회할 열 이름 나열
  FROM    조회할 테이블 이름
 WHERE    조회할 행을 선별하는 조건식
GROUP BY  그룹화할 열 지정(여러 개 가능)
HAVING    출력 그룹을 제한하는 조건식
ORDER BY  정렬하려는 열 지정

-예제)

--GROUP BY절, HAVING절 사용하여 출력
SELECT DEPTNO, JOB, AVG(SAL)
  FROM EMP
 GROUP BY DEPTNO, JOB
HAVING AVG(SAL) >= 2000
ORDER BY DEPTNO, JOB;

-사용시 주의사항

WHERE절과 GROUP BY절의 차이점!!

WHERE은 조회할 행을 선별하는 조건식, HAVING은 그룹화된 대상 중에서 출력의 제한을 거는 것.

SELECT DEPTNO, JOB, AVG(SAL)
  FROM EMP
 WHERE SAL <= 3000
 GROUP BY DEPTNO, JOB
 HAVING AVG(SAL) >= 2000
 ORDER BY DEPTNO, JOB;
 
--WHERE절 조건인 연봉 3000이하 조건에서 평균값 구하고
--그룹화된 값 중에서 HAVING 조건으로 평균값이 2000이상인 것 출력.

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함