[SQL] 서브쿼리 사용하기 - EXISTS, NOT EXISTS

·2025년 7월 9일

SQL

목록 보기
89/126

존재하는 테이블 검색

문제1. 부서 테이블에서 부서번호를 출력하시오

select deptno
 from dept;

문제2. 사원 테이블의 부서번호를 출력하시오

select deptno
 from emp;

ㄴ emp테이블에는 deptno가 40번인 사원이 없음

문제3. 부서 테이블에서 부서번호를 출력하는데 사원 테이블에 존재하는 부서번호에 대한것만 출력하시오

-- 튜닝 전 SQL
select deptno
 from dept
 where deptno in (select deptno
                    from emp);


-- 튜닝 후 SQL
select deptno
 from dept d
 where exists ( select deptno
                 from emp e
                 where e.deptno = d.deptno);

💡 위와 같이 쿼리문이 있으면 메인쿼리부터 작동이 되어서
dept 테이블의 부서번호 10번부터 emp 테이블에 deptno에 존재하는지
를 찾아봅니다. 위에서 찾다가 존재하면 더이상 아래로 내려가면서
찾지 않습니다. 존재하니까 찾지 않습니다. 그래서 exists 문
검색속도가 빠릅니다.

문제4. 아래의 테이블을 생성하시오

drop table  telecom_table; 

create  table  telecom_table
( telecom    varchar2(30),
  t_price    number(10),
  t_cnt      number(10) );
 
insert  into  telecom_table values( 'KT', 13000, 6 );
insert  into  telecom_table values( 'LG', 14000, 5 );
insert  into  telecom_table values( 'SKT', 12000, 7 );
insert  into  telecom_table values( 'KT알뜰', 9000, 1 );
insert  into  telecom_table values( 'LG알뜰', 8000, 1 );
insert  into  telecom_table values( 'SKT알뜰', 7000, 1 );

commit;

문제5. 아래의 SQL을 튜닝하시오

-- 튜닝 전:
select telecom
   from telecom_table
   where  telecom  in  ( select telecom
                            from  emp21 );
                            
-- 실행계획 보기
SELECT * FROM table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));

-- 튜닝 후:
select  telecom
  from  telecom_table  t
  where  exists  (  select  telecom
                       from  emp21  e
                       where  e.telecom = t.telecom ); 

문제6. 부서 테이블에는 존재하는데 사원 테이블에는 존재하지 않는 부서번호를 출력하시오

select deptno
 from dept d
 where not exists (select deptno
                    from emp e
                    where e.deptno = d.deptno);

문제7. telecom_table 에는 존재하는 telecom 인데 emp21 테이블에는 존재하지 않는 telecom 을 출력하시오

select telecom
 from telecom_table t
 where not exists (select telecom
                    from emp21 e
                    where e.telecom = t.telecom);

문제8. 현업과 비슷하게 구현한 교육용 대용량 테이블을 생성하시오

링크

-- 잘 만들어졌는지 확인코드
select *
 from  hr.employees;
 
select *
 from hr.departments;

0개의 댓글