(1) 전체 직원의 급여 평균:
SELECT AVG(sal) FROM emp;
(2) 전체 직원의 급여 평균보다 더 많은 급여를 받는 직원의 레코드:
SELECT *
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp);
ALLEN보다 적은 급여를 받는 직원들의 사번, 이름, 급여를 검색.
SELECT empno, ename, sal FROM emp WHERE sal < (SELECT sal FROM emp WHERE ename = 'ALLEN');
ALLEN과 같은 직무의 직원들의 사번, 이름, 부서번호, 직무, 급여를 검색.
SELECT empno, ename, deptno, job, sal FROM emp WHERE job = (SELECT job FROM emp WHERE ename = 'ALLEN');
SALESMAN의 급여 최댓값보다 더 많은 급여를 받는 직원들의 이름, 급여, 직무를 검색
SELECT ename, sal, job
FROM emp
WHERE sal > (SELECT MAX(sal) FROM emp WHERE job = 'SALESMAN');
WARD의 연봉보다 더 많은 연봉을 받는 직원들의 이름, 급여, 수당, 연봉을 검색.
연봉 = sal * 12 + comm. comm이 null인 경우는 0으로 계산
연봉 내림차순으로 정렬
SELECT ename, sal, comm, (sal * 12 + nvl(comm, 0)) AS "ANNUAL"
FROM emp
WHERE (sal * 12 + nvl(comm, 0)) > (SELECT (sal * 12 + nvl(comm, 0)) FROM emp WHERE ename = 'WARD')
ORDER BY ANNUAL DESC;
SCOTT과 같은 급여를 받는 직원들의 이름과 급여를 검색.
SELECT ename, sal FROM emp WHERE sal = (SELECT sal FROM emp WHERE ename = 'SCOTT');
위 결과에서 SCOTT은 제외하고 검색
SELECT ename, sal FROM emp WHERE ename != 'SCOTT' AND sal = (SELECT sal FROM emp WHERE ename = 'SCOTT');
ALLEN보다 늦게 입사한 직원들의 이름, 입사 날짜를 최근 입사일부터 출력
SELECT ename, hiredate FROM emp WHERE hiredate > (SELECT hiredate FROM emp WHERE ename = 'ALLEN') ORDER BY hiredate DESC;
매니저가 KING인 직원들의 사번, 이름, 매니저 사번을 검색
SELECT empno,ename,mgr FROM emp WHERE mgr = (SELECT empno FROM emp WHERE ename = 'KING');
accounting 부서에서 일하는 직원들의 이름, 급여, 부서번호를 검색.
SELECT ename, sal, deptno FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE dname = 'ACCOUNTING');
CHICAGO에서 근무하는 직원들의 이름, 급여, 부서 번호를 검색.
SELECT ename, sal, deptno FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE loc = 'CHICAGO');
단일행 서브쿼리: 서브쿼리의 결과가 행이 1개 이하인 경우.
다중행 서브쿼리: 서브쿼리의 결과가 2개 이상의 행인 경우
다중행 서브쿼리에서는 한 개의 값과 단순 비교(=, !=, >, < ...)를 할 수 없음
다중행 서브쿼리에서는 in, any, all과 같은 키워드를 함께 사용해야함!
각 부서에서 급여를 가장 많이 받는 직원의 모든 정보(사번, 이름, 금여, ...)을 검색.
SELECT * FROM emp WHERE (deptno, sal) IN (SELECT deptno, MAX(sal) FROM emp GROUP BY deptno) ORDER BY deptno;
각 부서에서 급여가 가장 적은 직원들의 모든 정보 출력
SELECT * FROM emp WHERE (deptno, sal) IN (SELECT deptno, MIN(sal) FROM emp GROUP BY deptno) ORDER BY deptno;
any: 여러개 중 적어도 하나
all: 여러개 모두
SELECT * FROM emp WHERE sal < ALL(SELECT sal FROM emp WHERE deptno = 10);
SELECT * FROM emp WHERE sal < ANY(SELECT sal FROM emp WHERE deptno = 10);