Learning/SQL
7. SUBQUERY
눈떠보니 월요일
2021. 7. 11. 18:09
© qimono, 출처 Pixabay
Subquery
개념 : 하나의 SQL 쿼리문 속에 다른 SQL 쿼리문이 포함되어 있는 형태
실습1. 'SCOTT'보다 월급이 많은 사람의 이름은?
1. SCOTT의 월급 찾기
2. SCOTT의 월급보다 월급이 많은 사람 찾기
SELECT ename FROM emp
WHERE sal > ( SELECT sal FROM emp WHERE ename = 'SCOTT');
Single-Row Subquery
개념 : Subquery의 결과가 한 행인 경우
실습2.
SELECT ename, sal FROM emp
WHERE sal < (SELECT AVG(sal)FROM emp);
실습 3.
SELECT ename, deptno FROM emp
WHERE deptno = (SELECT deptno FROM dept WHERE dname = 'SALES');
Multi-Row Subquery
개념 : Subquery의 결과가 둘 이상의 행인 경우
(주의) Multo-Row에 대한 연산을 사용해야함(ANY, ALL, IN, EXIST...)
실습 4.
SELECT ename, sal, deptno FROM emp
WHERE ename IN (SELECT MIN(ename)
FROM emp GROUP BY deptno);
실습 5. 각 부서별로 최고급여를 받는 사원을 출력하시오
SELECT deptno , empno , ename , sal FROM emp
WHERE (deptno,sal) IN (SELECT deptno , MAX(sal)
FROM emp GROUP BY deptno);
SELECT e.deptno , e.empno , e.ename , e.sal FROM emp e
,(SELECT s.deptno, MAX(s.sal) msal FROM emp s GROUP BY deptno ) m
WHERE e.deptno = m.deptno AND e.sal = m.msal;
SELECT deptno , empno , ename , sal FROM emp e
WHERE e.sal = (SELECT max(sal)
FROM emp WHERE deptno = e.deptno);
Top-K Query
개념 : 조건을 만족하는 상위 K개의 결과를 빨리 얻을 수 있는 방법
실습 6. 85년도에 입사한 사람들 중 월급이 가장 많은 3명은 누구인가?
SELECT rownum , ename , sal
FROM (SELECT * FROM emp
WHERE hiredate like '85%'
ORDER BY sal DESC)
WHERE rownum < 4;
(WHERE rownum < 4) = (FETCH FIRST 3 ROW ONLY) / OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY)
SET Operator(집합 연산)
실습 6.
SELECT ename FROM emp
UNION
SELECT dname FROM dept;
RANK 관련 함수
· 종류
- RANK
- DENSE_RANK
- ROW_NUMBER
SELECT sal, ename,
RANK() OVER (ORDER BY sal DESC) AS rank,
DENSE_RANK() OVER (ORDER BY sal DESC) AS dense_rank,
ROW_NUMBER() OVER (ORDER BY sal DESC) AS row_number,
rownum AS "rownum" FROM emp;