
select ---> 서브쿼리 가능 ( scalar subquery)
from ---> 서브쿼리 가능 ( in line view )
where ---> 서브쿼리 가능 ( subquery)
group by ---> 서브쿼리 불가능
having ---> 서브쿼리 가능 ( scalar subquery)
order by ---> 서브쿼리 가능 ( scalar subquery)

select ename, sal, dense_rank() over (order by sal desc) 순위
from emp;

select *
from (
select ename, sal, dense_rank() over (order by sal desc) 순위
from emp
)
where 순위 = 1;
-- 또는
select ename, sal, dense_rank() over (order by sal desc) 순위
from emp
order by 순위 fetch first 1 rows only;

select deptno, ename, sal, dense_rank() over ( partition by deptno
order by sal desc ) 순위
from emp;

select *
from (
select deptno, ename, sal, dense_rank() over (partition by deptno
order by sal desc) 순위
from emp
)
where 순위 = 1;
select round(avg(sal))
from emp;

-- 에러발생
-- ename과 sal은 여러 행이 출력되려하고
-- round(avg(sal))은 하나가 출력되려고 하기 때문에 충돌됨
select ename, sal, round(avg(sal))
from emp;
-- 답
select ename, sal, round(avg(sal) over ()) as 평균월급
from emp;

select *
from (
select ename, sal, round(avg(sal) over ()) as 평균월급
from emp
)
where sal > 평균월급;
select 상호명, 시군구명
from market_2022
where 상호명 like '%스타벅스%';
select 시군구명, count(*)
from market_2022
where 상호명 like '%스타벅스%'
group by 시군구명
order by 2 desc;
select *
from (
select 시군구명, count(*), dense_rank() over(order by count(*) desc) 순위
from market_2022
where 상호명 like '%스타벅스%'
group by 시군구명
)
where 순위 <= 5;