MAX 값들 중에 최대값을 반환
MIN 값들 중에 최소값을 반환
AVG 평균값을 계산
COUNT 반환된 행의 수를 계산
SUM 총합을 계산
STDDEV 표준편차를 계산
VARIANCE 분산을 계산
1) null 값은 무시된다
2) 반드시 1개의 값만을 반환한다
3) GROUP BY 없이 일반 컬럼과 기술될 수 없다
SELECT AVG(sal) 평균급여, ROUND(AVG(sal)) 평균급여
FROM emp;
SELECT SUM(comm) "보너스 총합",
ROUND(AVG(comm)) "보너스 평균",
COUNT(comm) "수령 인원",
ROUND(AVG(NVL(comm,0))) "환산 평균",
COUNT(*) "전체 인원"
FROM emp;
SELECT COUNT(*)
FROM emp
WHERE comm IS NOT NULL;
3) 업무별 평균 급여, 평균 연봉을 검색한다
SELECT job 업무, ROUND(AVG(sal)) 평균급여,
ROUND(AVG(sal*12+NVL(comm,0))) 평균연봉
FROM emp;
SELECT job 업무
FROM emp;
SELECT ROUND(AVG(sal)) 평균급여,
ROUND(AVG(sal*12+NVL(comm,0))) 평균연봉
FROM emp;
SELECT job 업무,
ROUND(AVG(sal)) 평균급여,
ROUND(AVG(sal*12+NVL(comm,0))) 평균연봉
FROM emp
GROUP BY job;
SELECT d.dno 부서번호, dname 부서명,
ROUND(AVG(sal)) 평균급여,
ROUND(AVG(sal*12+NVL(comm,0))) 평균연봉
FROM dept d, emp e
WHERE d.dno=e.dno
GROUP BY d.dno, dname;
내용을 입력하세요.
*그룹 함수와 HAVING 절
그룹 함수와 Having 절
; 그룹 함수를 포함한 조건은 일반 조건과 계산하는 시점이 다르다.
일반 조건의 경우 컬럼의 값을 단지 조건과 비교하면 되지만
그룹 함수의 결과를 조건으로 하는 경우 GROUP BY 절의
사용 유무에 따라 결과 값이 달라지므로 조건에 그룹 함수가
포함된 경우 이것은 일반 조건과 동일한 시점에 처리할 수 없다
SQL 은 이를 위해 HAVING 절을 제공한다.
HAVING 절은 조건 중에 그룹 함수가 포함된 것만을 모아서
기술하는 구문이다.
SELECT 컬럼 or 그룹함수...
FROM 테이블
WHERE 일반 조건
GROUP BY 그룹대상
HAVING 그룹함수포함조건
ORDER BY 정렬 대상;
1) HAVING : 조건 중에 그룹함수를 포함하는 조건 기술 (그룹함수의 조건)
2) HAVING 절은 GROUP BY 절 뒤에 기술한다
3) HAVING 절의 해석은 WHERE 절과 동일하다
다만 그룹 함수를 포함하는 조건은
HAVING 절에 해야만 한다
SELECT eno, ename
FROM emp
WHERE dno='20';
SELECT dno, ROUND(AVG(sal))
FROM emp
GROUP BY dno;
SELECT dno, ROUND(AVG(sal))
FROM emp
GROUP BY dno
HAVING AVG(sal) >= 3000;
SELECT dno, ROUND(AVG(sal))
FROM emp e
WHERE dno != 20
GROUP BY dno
HAVING ROUND(AVG(sal))>=3000;
SELECT dno, ROUND(AVG(sal))
FROM emp
GROUP BY dno
HAVING AVG(sal) < 3000;
SELECT dno, job, COUNT(*) 인원수
FROM emp
WHERE job != '개발'
GROUP BY dno, job;
4) 그룹함수의 조건인 아닌 것은 WHERE 절에 기술한다
5) HAVING 절은 그룹함수의 조건이나
GROUP BY 에 기술한 컬럼의 조건이 가능하다
그러나 HAVING 절은 그룹함수의 조건만 사용하고
GROUP BY 에 있는 컬럼이라도 WHERE 절에 사용하는 것을
권장한다.
내용을 입력하세요.
*서브쿼리
서브 쿼리 - 단일 행 서브쿼리
; 서브 쿼리는 두 개의 쿼리를 결합하여 하나의 문장으로
표현하는 것이다
1) 단일 행 서브쿼리
; 서브쿼리가 하나의 컬럼에서 하나의 행을 검색한다
2) 다중 행 서브쿼리
; 서브쿼리가 하나의 컬럼에서 여러 개의 행을 검색한다
3) 다중 열 서브쿼리
; 서브쿼리가 여러 개의 컬럼을 검색한다
4) 서브 쿼리는 WHERE 절, HAVING 절과 같이 조건절에 주로
쓰인다. FROM 절에 쓰이는 경우도 있다.
FROM 절에 서브쿼리를 쓰는 경우를 인라인뷰(Inline View)
라고 한다
SELECT 컬럼, ...
FROM 테이블
WHERE 컬럼 <단일 행 연산자> (SELECT 문: Sub Query);
1) 단일 행 연산자가 사용됨으로 반드시 서브쿼리의 결과
값은 1개만 검색돼야 한다
2) 서브 쿼리는 반드시 괄호로 묶는다
3) 서브 쿼리는 메인 쿼리 실행 전에 실행된다
4) 서브 쿼리의 검색된 결과값은 메인 쿼리에 사용된다
5) 단일 행 연산자 오른쪽에 기술한다
(=, <, >, <=, >=, !=)
6) WHERE 절에 기술된 열의 숫자와 타입은
SELECT 절과 1:1 대응관계가 되어야 한다.
1)김연아보다 급여를 많이 받는 사원을 검색한다
SELECT eno, ename "김연아급여보다 많아"
FROM emp
WHERE sal > (SELECT sal
FROM emp
WHERE ename='김연아');
2)노육과 평점이 동일한 학생의 정보를 검색하라
SELECT sno, sname, avr
FROM student
WHERE avr = (SELECT avr
FROM student
WHERE sname='노육');
SELECT sno, sname, avr
SELECT sno, sname, avr
FROM student
WHERE avr IN (SELECT avr
FROM student
WHERE sname='노육');
SELECT eno, ename, dno, job
FROM emp
WHERE dno != (SELECT dno
FROM emp
WHERE ename='김연아')
AND job = (SELECT job
FROM emp
WHERE ename='김연아');
4) 부서 중 가장 급여를 많이 받는 부서를 검색하라
SELECT dno "급여 최대 부서" , ROUND(AVG(sal))
FROM emp
GROUP BY dno
HAVING AVG(sal) = (SELECT MAX(AVG(sal))
FROM emp
GROUP BY dno);
5) 부산에서 근무하는 사원의 정보를 검색한다
a) 부산에 근무하는 부서번호
b) 해당 부서 번호와 일치하는 사원의 정보 검색
SELECT eno, ename "부산 근무 사원"
FROM emp
WHERE dno= (SELECT dno
FROM dept
WHERE loc='부산');
SELECT eno, ename "부산 근무 사원"
FROM emp e, dept d
WHERE d.dno=e.dno
AND loc='부산';
내용을 입력하세요.
*서브쿼리 다중행,다중열
1) 20번 부서원들과 동일한 관리자로부터 관리받는 사원을 검색한다
SELECT eno, ename, mgr "관리자 번호", dno
FROM emp
WHERE mgr IN (SELECT mgr
FROM emp
WHERE dno='20')
AND dno!='20';
2) 10번 부서원들보다 급여가 낮은 사원을 검색한다
SELECT eno, ename, dno, sal
FROM emp
WHERE sal < ALL(SELECT sal
FROM emp
WHERE dno='10')
AND dno!='10';
SELECT eno, ename, dno, sal
FROM emp
WHERE sal < ( SELECT MIN(sal)
FROM emp
WHERE dno='10')
AND dno!='10';
SELECT dno, eno, ename, comm
FROM emp
WHERE comm IN (SELECT NVL(comm,0)
FROM emp
WHERE dno='20')
AND dno!='20';
SELECT eno, comm
FROM emp
WHERE dno='20';
4) 손하늘과 동일한 관리자의 관리를 받으면서 업무도 같은 사원을
검색한다.
SELECT eno, ename, mgr, job
FROM emp
WHERE (mgr, job) IN (SELECT mgr, job
FROM emp
WHERE ename='손하늘')
AND ename!='손하늘';
SELECT eno, ename, mgr, job
FROM emp
WHERE mgr = (SELECT mgr
FROM emp
WHERE ename='손하늘')
AND job = (SELECT job
FROM emp
WHERE ename='손하늘')
AND ename!='손하늘';
SELECT dno, eno, ename, sal "부서별 최소급여"
FROM emp
WHERE (dno, sal) IN (SELECT dno, MIN(sal)
FROM emp
GROUP BY dno);