Sub Query

JIHYUN·2023년 8월 14일
0

sql

목록 보기
4/9

Sub Query: 쿼리의 일부로 다른 쿼리문이 사용되는 것

(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:

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);
profile
🍋

0개의 댓글