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

·2025년 7월 9일
0

SQL

목록 보기
92/126

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

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


문제1. 사원 테이블에서 토탈월급을 출력하시오

select sum(sal)
 from emp;

문제2. 이름, 월급, 사원 테이블의 토탈월급을 출력하시오

-- 방법 1
select ename, sal, sum(sal) over() 토탈월급
 from emp;
 
 
-- 방법 2
-- 현업에서는 아래 방법을 더 선호함
select ename, sal, (select sum(sal) 
                     from emp) as 토탈월급
 from emp;

💡 select절의 서브쿼리를 이용해서 출력하고 있음

문제3. 이름, 월급, 사원 테이블의 토탈월급, 사원 테이블의 최대월급, 사원 테이블의 최소월급을 출력하시오

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;

문제4. 이름, 월급, 직업이 SALESMAN 인 사원들의 토탈월급을 출력하고 직업이 SALESMAN 인 사원들의 최대월급을 출력하고 직업이 SALESMAN 인 사원들의 최소월급을 출력하시오

-- 결과는 나오지만 악성 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;

💡 스칼라 서브쿼리(select절의 서브쿼리)의 특징

하나의 값만 리턴할 수 있음

-- 에러발생: 값의 수가 너무 많습니다
-- 리턴값이 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;
  • 위의 sql의 결과에서 total이라는 컬럼의 데이터를 substr으로 잘 잘라내서
    토탈값, 최댓값, 최솟값을 출력하게 하는 쿼리작성이 SQLP 시험에 출제되었음
  • 중요한 것은 잘라낼 때 토탈값, 최댓값, 최솟값의 업데이트가 생겨도 일관되게 잘라내야함

✔️

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;

0개의 댓글