본문 바로가기
DB/Oracle

[Oracle] 오라클 테이블 조회 11(완) - 오라클 서브쿼리, any, all, rownum

by hongdor 2020. 6. 1.
728x90

- 오라클 11g XE 버전입니다

- 오라클 샘플 계정 HR에 접속한 후 진행했습니다 ( 아래 참고 )

https://hongdori2.tistory.com/4

 

 

1. 서브쿼리 ( sub query )

 

( select .. from... ) 의 출력 컬럼 값을 select, from, where 등의 문장에 다시 활용 하는 것입니다

 

 

2. where 서브쿼리

 

- 다중행과 단일행을 비교할 때 any와 all이 유용하다

- < or > any( a, b, c, ... ) : a, b, c, ... 중 어떤 값보다 작은, 큰

- < or > all( a, b, c, ... ) : a, b, c, ... 중 모든 값보다 작은, 큰

- = in( a, b, c, ... ) : a, b, c, ... 의 값들에 속하는

예시)

select first_name, salary
from employees
where salary < any(select salary from employees where first_name='Peter');

> Peter라는 사람들이 동명이인으로 여러명 있을때, Peter 이름을 가진 사람들의 급여보다 높은 급여를 가진 사람들의 이름과 급여를 출력

 

 

3. from 서브쿼리

 

- rownum : 출력 열에 번호를 생성합니다 

 

예시)

select r, first_name, hire_date

from (select rownum r, a.* from (select * from employees order by hire_date desc) a ) 

where r>=11 and r<=20;

> 사원 입사일 기준으로 최근 입사자 11등~20등 출력

 

select에 rownum을 사용하면 

from → where group by having select order by

순서로 실행되는데 where가 먼저 실행되고 select가 실행되므로 

select rownum, first_name, hire_date

from employees

where rownum >=11 and rownum <=20; 

이라고 쓰면 행이 뒤죽박죽 되어 버린다

위 예시처럼 서브쿼리를 이용해 where보다 먼저 실행되는 from절에서 정렬 + rownum 을 생성한 테이블로 바꿔준다

 

 

4. select 서브 쿼리

 

- select 서브쿼리의 활용

 

예시)

select first_name, min(salary) from employees;

> 에러가 난다. 왜냐하면 first_name은 다중행이고 min(salary)는 단일행이기 때문이다.

 

select first_name, (select min(salary) from employees);

> 라고 써주면 error가 나지않고 min(salary) 값이 first_name 행만큼 나온다.

 

 

 

728x90

댓글