subquery.sql

성혜·2024년 2월 18일
0

Oracle

목록 보기
16/26
post-thumbnail

Main Query, 쿼리

: 하나의 문장안에 하나의 select(insert, update, delete)로 되어 있는 쿼리


Sub Query, 서브 쿼리, 부속 질의

: 하나의 문장안에 또 다른 문장(무조건 select)이 들어있는 쿼리
: select <- select
: insert <- select
: update <- select
: delete <- select
: 삽입 위치 > 거의 대부분에 절에서 사용 가능
: 값을 넣을 수 있는 장소면 서브쿼리가 들어갈 수 있다.


  • 실습 코드
-- tblCountry. 인구수가 가장 많은 나라의 이름? 중국

select max(population) from tblCountry; --120660
select name from tblCountry where population = (select max(population) from tblCountry);


서브쿼리 삽입 위치

1. 조건절 > 비교값으로 사용

a. 반환값이 1행 1열 > 단일값 반환 > 상수 취급 > 값 1개
b. 반환값이 N행 1열 > 다중값 반환 > 열거형 비교 > in 사용
c. 반환값이 1행 N열 > 다중값 반환 > 그룹 비교 > N컬럼:N컬럼
d. 반환값이 N행 N열 > 다중값 반환 > 2 + 3 > in + 그룹 비교

  • 실습 코드

b. 반환값이 N행 1열 > 다중값 반환 > 열거형 비교 > in 사용

-- 급여가 260만원 이상 받는 직원이 근무하는 부서의 직원 명단?
-- ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.
select * from tblInsa 
    where buseo = (select buseo from tblInsa where basicpay >= 2600000);
    
select * from tblInsa
    where buseo in (select buseo from tblInsa where basicpay >= 2600000);


c. 반환값이 1행 N열 > 다중값 반환 > 그룹 비교 > N컬럼:N컬럼

-- '홍길동'과 같은 지역, 같은 부서인 직원 명단을 가져오시오. > 서울, 기획부

select * from tblInsa 
    where city = (select city from tblInsa where name ='홍길동')
        and buseo = (select buseo from tblInsa where name ='홍길동');
-- where 1:1 and 1:1

-- where 2:2
select * from tblInsa 
    where (city,buseo) = (select city,buseo from tblInsa where name ='홍길동');


d. 반환값이 N행 N열 > 다중값 반환 > 2 + 3 > in + 그룹 비교

-- 반환값이 N행 N열 > 다중값 반환 > 그룹 비교 > N컬럼:N컬럼
-- 급여가 260만원 이상 받는 직원과 같은 부서, 같은 지역 > 명단?
select * from tblInsa
    where (buseo, city) in (select buseo, city from tblInsa where basicpay >= 2600000);



서브쿼리 삽입 위치

1. 조건절 > 비교값으로 사용

a. 반환값이 1행 1열 > 단일값 반환 > 상수 취급 > 값 1개
b. 반환값이 N행 1열 > 다중값 반환 > 열거형 비교 > in 사용
c. 반환값이 1행 N열 > 다중값 반환 > 그룹 비교 > N컬럼:N컬럼
d. 반환값이 N행 N열 > 다중값 반환 > 2 + 3 > in + 그룹 비교

2. 컬럼리스트 > 컬럼값으로 사용

: 반드시 결과값이 1행 1열이어야 한다. > 스칼라 쿼리 (원자갑 반환)

a. 정적 쿼리 > 모든 행에 동일한 값을 반환
b. 상관 서브 쿼리(********) > 메인 쿼리의 일부 컬럼값을 서브쿼리에 사용 

3. FROM절에서 사용

: 서브쿼리의 결과 테이블을 또 하나의 테이블이라고 생각하고 메인 쿼리를 실행
: 인라인 뷰(Inline View)


  • 실습 코드
-- from절에서 사용
select * from (select name from tblInsa where name ='홍길동'); --1행 1열이지만 테이블임

--ORA-00904: "BASICPAY": 부적합한 식별자 
select 
    *
from (select name , buseo as department, basicpay as salary from tblInsa where city ='경기')
    where basicpay >= 2000000;

-- 별칭은 무조건 명칭을 바꾸기 때문에
select 
    *
from (select name , buseo as department, basicpay as salary from tblInsa where city ='경기')
    where salary >= 2000000;
profile
하루를 정리하고 기록합니다.

0개의 댓글