728x90
반응형
SMALL
서브쿼리
* 서브쿼리 : 다른 SELECT 문장의 절에 내장된 SELECT문장이다.
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
* 서브쿼리 사용시 규칙
- 서브쿼리는 괄호로 둘러싸여야 함(CTAS 제외)
- 비교 연산자의 오른쪽에 위치
- 두 종류의 비교연산자 사용(단일행, 다중행)
select first_name, salary
from employees
where salary > (select salary from employees where first_name='Nancy');
단일행 서브쿼리
- 내부 select 문장으로부터 하나의 행을 반환하는 질의
연산자 | 설명 |
= | 같다 |
> | 보다 크다 |
>= | 보다 크거나 같다 |
< | 작다 |
<= | 작거나 같다 |
<>, != | 같지 않다 |
select first_name, job_id, hire_date
from employees
where job_id = (select job_id from employees where employee_id=103);
다중행 서브쿼리
- 서브쿼리의 결과가 2개 행 이상일 경우
연산자 | 설명 |
IN | 목록의 어떤 값과 같은지 확인 |
EXISTS | 값이 있는지 확인. + 서브쿼리만 가능 |
ANY, SOME | 비교 연산자. 하나만 만족 |
ALL | 비교 연산자. 모든 값과 비교해서 만족 |
ALL / ANY 차이점 | < ANY : 가장 큰 값보다 작으면 됨 > ANY : 가장 작은 값보다 크면 됨 < ALL : 가장 작은 값보다 작으면 됨 > ALL : 가장 큰 값보다 크면 됨 = ANY : IN과 같은 역할 |
select first_name, salary
from employees
where salary > (select salary from employees where first_name='David');
ORA-01427: single-row subquery returns more than one row
01427. 00000 - "single-row subquery returns more than one row"
*Cause:
*Action
select first_name, salary
from employees
where salary > any (select salary from employees where first_name='David');
select first_name, department_id, job_id
from employees
where department_id in (select department_id
from employees
where first_name = 'David');
--in(60,80)과 같음
상호연관 서브쿼리
- 한 개의 행을 비교할 때마다 결과가 메인쿼리로 반환됨
- 한 행을 처리할 때마다 서브쿼리로 주고 값을 처리한 후 결과를 다시 메인쿼리로 전달=> 성능 저하
- 메인쿼리와 서브쿼리 사이에 결과를 교한하기 위해 서브쿼리의 where 조건절에서 메인쿼리 테이블과 연결
select first_name, salary
from employees a
where salary > (select avg(salary)
from employees b
where b.department_id = a.department_id);
스칼라 서브쿼리
- SELECT 절에 사용하는 서브쿼리
select first_name, (select department_name from departments d where d.department_id = e.department_id) department_name
from employees e
order by first_name;
select first_name, department_name
from employees e
join departments d on (e.department_id = d.department_id)
order by first_name;
인라인 뷰
- FROM절에 서브쿼리가 온 것
select row_number, first_name, salary
from (select first_name, salary,
row_number() over(order by salary desc) as row_number
from employees)
where row_number between 1 and 10;
3중 쿼리와 Top-N 쿼리
- 서브쿼리 안에 또 다른 서브쿼리를 갖는 것
select rownum, first_name, salary
from (select first_name, salary from employees
order by salary desc)
where rownum between 1 and 10;
계층형 쿼리
- 수직적 관게를 맺고 있는 행들의 계층형 정보를 조회할 때 사용
SELECT select_list
FROM table
WHERE conditions
START WITH top_level_cindition
CONNECT BY [NOCYCLE] [PRIOR] connect_condition
ORDER SIBLING BY order_condition;
select employee_id,
lpad(' ',3*(level-1)) || first_name || ' ' ||last_name,
level
from employees
start with manager_id is null
connect by prior employee_id = manager_id;
select employee_id,
lpad(' ',3*(level-1)) || first_name || ' ' ||last_name,
level
from employees
start with employee_id=113
connect by prior manager_id=employee_id ;
728x90
반응형
LIST
'IT > SQL' 카테고리의 다른 글
[SQL] 9. 트랜잭션(Transaction) (0) | 2023.05.15 |
---|---|
[SQL] 8. 데이터 조작(DML) (0) | 2023.05.15 |
[SQL] 6. 조인을 이용한 다중 테이블 검색 (0) | 2023.05.11 |
[SQL] 5. 분석 함수 (0) | 2023.05.11 |
[SQL] 4. 그룹 함수를 이용한 데이터 집계 (0) | 2023.05.10 |