[SQL] 단일행 서브쿼리

·2025년 7월 8일
0

SQL

목록 보기
86/126

예제 답

select ename, sal
 from emp
 where sal > ( select sal
                from emp
                where ename='JONES');

💡 main query = outer query
subquery = inner query


문제1. SCOTT 과 같은 월급을 받는 사원들의 이름과 월급을 출력하시오

select ename, sal
 from emp
 where sal = (select sal
               from emp
               where ename='SCOTT');

문제2. 위의 결과에서 SCOTT 은 제외하고 출력하시오

select ename, sal
 from emp
 where sal = (select sal
               from emp
               where ename='SCOTT')
   and ename != 'SCOTT';

여기서 and ename != 'SCOTT'메인쿼리
서브쿼리는 괄호( ) 안

문제3. 사원 테이블에서 월급이 가장 적은 사원의 이름과 월급을 출력하시오. (ORDER BY 절 쓰지 말고 수행하시오)

select ename, sal
 from emp
 where sal = ( select min(sal)
                from emp );

문제4. ALLEN 보다 늦게 입사한 사원들의 이름과 입사일을 출력하시오

select ename, hiredate
 from emp
 where hiredate > ( select hiredate
                     from emp
                     where ename='ALLEN');

문제5. 서울시에 생필품 가격 테이블을 생성하시오

drop  table  price_2022;

create  table price_2022
(  
P_SEQ number(10),
M_SEQ number(10),
M_NAME  varchar2(80),
A_SEQ number(10),
A_NAME varchar2(60),
A_UNIT varchar2(40),
A_PRICE number(10),
P_YEAR_MONTH varchar2(30),
ADD_COL      varchar2(180),
M_date             date, 
M_TYPE_CODE varchar2(20),
M_TYPE_NAME varchar2(20),
M_GU_CODE varchar2(10),
M_GU_NAME varchar2(30) );

이상치 데이터를 지웁니다.

select a_name, a_price, m_name
 from price_2022
 order by a_price desc;
 
delete from price_2022
where a_name='배추' and a_price=69008625;

commit;

문제6. 서울시에서 가장 비싼 생필품의 상품명과 그 가격을 출력하시오

select  *
from price_2022
where a_price  = ( select max(a_price)
                   from  price_2022 );

문제7. emp21 테이블에서 나이가 제일 많은 학생의 이름과 나이를 출력하시오

select ename, age
 from emp21
 where age = ( select max(age)
                from emp21 );
                
-- 실행계획 보기
SELECT * FROM table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
---------------------------------------------------------------------------------------
| Id  | Operation           | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |       |      1 |        |      1 |00:00:00.01 |      14 |
|*  1 |  TABLE ACCESS FULL  | EMP21 |      1 |      1 |      1 |00:00:00.01 |      14 |
|   2 |   SORT AGGREGATE    |       |      1 |      1 |      1 |00:00:00.01 |       7 |
|   3 |    TABLE ACCESS FULL| EMP21 |      1 |     19 |     19 |00:00:00.01 |       7 |
---------------------------------------------------------------------------------------

문제8. 위의 SQL을 튜닝하시오. emp21 테이블을 1번만 엑세스해도 같은 결과가 나오게하시오

select ename, age
 from emp21
 order by age desc fetch first 1 rows only;
 
SELECT * FROM table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
 
 
-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |       |      1 |        |      1 |00:00:00.01 |       7 |       |       |          |
|*  1 |  VIEW                    |       |      1 |      1 |      1 |00:00:00.01 |       7 |       |       |          |
|*  2 |   WINDOW SORT PUSHED RANK|       |      1 |     19 |      1 |00:00:00.01 |       7 |  2048 |  2048 | 2048  (0)|
|   3 |    TABLE ACCESS FULL     | EMP21 |      1 |     19 |     19 |00:00:00.01 |       7 |       |       |          |
-----------------------------------------------------------------------------------------------------------------------

0개의 댓글