select ---> 서브쿼리 가능 ( scalar subquery)
from ---> 서브쿼리 가능 ( in line view )
where ---> 서브쿼리 가능 ( subquery)
group by ---> 서브쿼리 불가능
having ---> 서브쿼리 가능 ( scalar subquery)
order by ---> 서브쿼리 가능 ( scalar subquery)
select sum(sal)
from emp;
-- 방법 1
select ename, sal, sum(sal) over() 토탈월급
from emp;
-- 방법 2
-- 현업에서는 아래 방법을 더 선호함
select ename, sal, (select sum(sal)
from emp) as 토탈월급
from emp;
💡 select절의 서브쿼리를 이용해서 출력하고 있음
select ename, sal, (select sum(sal) from emp) 토탈월급,
(select max(sal) from emp) 최대월급,
(select min(sal) from emp) 최소월급
from emp;
-- 또는
select ename, sal, sum(sal) over() 토탈월급,
max(sal) over() 최대월급,
min(sal) over() 최소월급
from emp;
-- 결과는 나오지만 악성 SQL임
select ename, sal, (select sum(sal) from emp where job='SALESMAN') 토탈월급,
(select max(sal) from emp where job='SALESMAN') 최대월급,
(select min(sal) from emp where job='SALESMAN') 최소월급
from emp;
하나의 값만 리턴할 수 있음
-- 에러발생: 값의 수가 너무 많습니다
-- 리턴값이 3개라서 에러발생 (sum(sal), max(sal), min(sal))
select ename, sal, (select sum(sal), max(sal), min(sal)
from emp
where job='SALESMAN') total
from emp;
✔️ 답
select ename, sal, substr(total, 1, 10) as 토탈월급,
substr(total, 11, 10) as 최대월급,
substr(total, 21, 10) as 최소월급
from (
select ename, sal,
( select rpad(sum(sal),10,' ') || rpad(max(sal),10,' ') || rpad(min(sal),10,' ')
from emp
where job='SALESMAN') as total
from emp
);
select deptno, ename, sal, round(avg(sal) over(partition by deptno ) ) 부서_평균월급
from emp;