TABLEDEPT -
DEPTNO, DNAME, LOC
EMP -
EMPNO, ENAME, JOB, MGR(상사NO), HIREDATE, SAL, COMM, DEPTNO
SALGRADE - GRADE, LOSAL, HISAL
=> nvl함수는 해당값이 null 이면 지정된 값을 리턴해주는 역할을 한다.
- emp 테이블에서 comm 이 0 또는 null 인 값을 출력하는데 null 인값은 0으로 출력해보자...
SELECT ename, nvl(comm,0) comm
FROM emp
WHERE comm = 0 or comm is null;
=> 그룹을 지정하기 전에 조건을 줄수 있는 것은 Where에 조건을 명시해주게 된다.
=> 그룹을 한 후에 조건을 줄려면 HAVING에서 조건을 명시해 준다.
- 10번 20번 부서에 속한 사원들 대상으로 직종별 급여합이 5000이상인 직종에 대해 직종별 평균급여..
SELECT job, AVG(sal) PAYROLL
FROM emp
WHERE deptno IN(10, 20)
GROUP BY job
HAVING SUM(sal) > 5000
ORDER BY AVG(sal);
- 부서별로 2명 이상 근무하고 있는 직종 만을 출력하시오.
SELECT dept_id, title
FROM s_emp
GROUP BY dept_id, title
HAVING COUNT(*) > 1;
=> 서로 다른 테이블의 조인과 그룹화를 통한 정보 보여주기
- 'MANAGER' 직종에 속한 사원들의
부서별 급여합이 2500 이상인 부서의 부서번호, 부서별 평균 급여, 부서 이름
SELECT d.deptno, avg(e.sal) , d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno and e.job='MANAGER'
GROUP BY d.deptno, d.dname
HAVING sum(sal) >= 2500;
=>Subquery 를 사용한 Nested, Inline View
- 직종별로 제일 적은 봉급을 받는 사람의 이름 표시
1) 각 정보를 비교하면서 출력하므로 성능이 떨어짐
SELECT job, ename, sal
FROM emp
WHERE (job, sal) in ( select job, min(sal)
from emp
group by job);
2) 새로운 테이블을 생성하여 거기서 부터 정보를 얻어온다.
SELECT e.job, e.ename, e.sal
FROM emp e, (select job, min(sal) msal
from emp
group by job) g
WHERE e.job = g.job and e.sal = g.msal;