[SQL] 서브쿼리 사용하기 - FROM절

·2025년 7월 9일

SQL

목록 보기
91/126

💡 select 문의 6가지절에서 서브쿼리를 사용할 수 있는절

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


문제1. 이름, 월급, 월급에 대한 순위를 출력하는데 dense_rank를 이용해서 순위를 출력하시오

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

문제2. 위의 결과에서 순위가 1등만 출력하시오

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;

문제3. 부서번호, 이름, 월급, 월급의 순위를 출력하는데 순위가 부서번호별로 각각 월급이 높은 사원순으로 순위를 부여하시오

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

문제4. 위의 결과에서 부서번호별로 1등들만 출력하시오

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

문제5. 사원 테이블에서 평균월급을 출력하시오

select round(avg(sal))
 from emp;

문제6. 이름, 월급, 사원 테이블의 평균월급을 출력하시오

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


-- 답
select ename, sal, round(avg(sal) over ()) as 평균월급
 from emp;

문제7. 위의 결과를 다시 출력하는데 자기의 월급이 사원 테이블의 평균월급보다 더 큰 것만 나오게하시오

select *
 from ( 
        select ename, sal, round(avg(sal) over  ()) as 평균월급
         from emp
      )
 where sal > 평균월급;

문제8. market_2022 테이블을 조회해서 상호명에 스타벅스를 포함하는 상호명과 시군구명을 출력하시오

select 상호명, 시군구명
 from market_2022
 where 상호명 like '%스타벅스%';

문제9. 상호명에 스타벅스를 포함하는 시군구명, 시군구별 건수를 출력하는데 시군구별 건수가 높은것부터 출력하시오

select 시군구명, count(*)
 from market_2022
 where 상호명 like '%스타벅스%'
 group by 시군구명
 order by 2 desc;

문제10. 위의 결과를 다시 출력하는데 시군구명, 건수, 순위를 출력하는데 순위가 1~5등까지만 출력하시오

select *
 from (
        select 시군구명, count(*), dense_rank() over(order by count(*) desc) 순위
         from market_2022
         where 상호명 like '%스타벅스%'
         group by 시군구명
 )
 where 순위 <= 5;

0개의 댓글