DB - Sub Query

BroJang·2022년 9월 16일
1

DB

목록 보기
11/14
post-custom-banner
  1. 서브 쿼리 (SubQuery)
    -> 하나의 SQL 문안에 포함되어 있는 또 다른 SQL 문
    -> 알려지지 않은 조건에 근거한 값들을 검색하는 SELECT 문장을 작성하는데 유용
    -> 메인 쿼리가 서브 쿼리를 포함하는 종속적인 관계
    -> 단일 행 Sub Query와 다중 행 Sub Query에 따라 연산자를 잘 선택해야 한다.
    -> 특별한 Top-n 등의 분석을 제외하고는 Sub Query 절에 Order by절이 올 수 없다.
    -> 서브쿼리는 반드시 소괄호로 묶어야 한다.
    - (SELECT .... FROM ...) 형태
    -> 서브쿼리는 연산자의 오른쪽에 위치 해야 한다

문법

select 선택목록
from 테이블이나 view
where 조건 연산자 (select 선택목록
from 테이블
where 조건);

예제)

select salary
from employees
where first_name ='Donald'
-- 해당 결과는 SALARY 2600

select employee_id,first_name,salary
from employees
where salary < (select salary
from employees
where first_name ='Donald');
-- 즉 salary가 2600보다 작은 데이터 출력
  1. 서브쿼리 (SUBQUERY)의 유형
    -> 단일행 서브쿼리
    -> 다중행 서브쿼리
    -> 다중 컬럼 서브 쿼리
    -> 다중행 다중열 서브쿼리
    -> 상관 서브 쿼리
    -> 스칼라 서브쿼리
  1. 단일행 서브쿼리
    -> 서브쿼리의 조회 결과 값(행 혹은 튜플)의 개수가 1개 일때
  1. 다중행 서브쿼리
    -> 서브쿼리의 조회 결과 값(행 또는 튜플)이 여러개 일 때
    -> 다중 서브쿼리 앞에는 일반 비교연산자는 사용 불가
    - 사용 가능 연산자 : IN / NOT IN, ANY, ALL, EXISTS

IN : 쿼리의 비교 조건이 결과 중에서 하나라도 일치하는 것

SELECT * FROM EMPLOYEE WHERE DEPT_CODE IN('D8','D4');
※ DEPT_CODE가 'D8' 이거나 'D4'인 것 ( OR와 같음 )

NOT IN : 쿼리의 비교 조건이 결과 중에서 하나라도 일치하지 않는 것

SELECT * FROM EMPLOYEE WHERE DEPT_CODE NOT IN ('D8','D4');
※ DEPT_CODE가 'D8'가 아니거나 'D4'가 아닌 것 

ANY : 서브 쿼리의 결과 중에서 하나라도 참이면 참

> ANY : 최소값 보다 크면
>= ANY : 최소값보다 크거나 같으면
< ANY : 최대값보다 작으면
<= ANY : 최대값보다 작거나 같으면
= ANY : IN과 같은 효과
!= ANY : NOT IN과 같은 효과

ALL : 서브 쿼리의 결과 중에서 모두 참이면 참

> ALL : 최대값 보다 크면
>= ALL : 최대값보다 크거나 같으면
< ALL : 최소값보다 작으면
<= ALL : 최소값보다 작거나 같으면
= ALL : 같다면
(SUBSELECT의 결과가 1건이면 상관없지만 여러건이면 정상 처리 되지 않음)
!= ALL : 같지 않다면
(위와 마찬가지로 결과가 여러건이면 오류)

EXISTS : 서브쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참

※ 중요한것은 단순 참,거짓을 판단하는 기준이 되는 서브쿼리 연산자


다중 컬럼 서브 쿼리
-> 서브쿼리의 조회 결과 컬럼의 개수가 여러개 일 때
(다중행과는 다르게 결과 값이 아닌 컬럼이 여러개 일 때)


다중행 다중열 서브쿼리
-> 서브쿼리의 조회 결과 컬럼의 개수와 행의 개수가 여러개 일 때

상관 서브쿼리 (상호 연관 서브쿼리)
-> 메인쿼리의 값을 서브쿼리에 주고 서브쿼리를 수행한 다음 그 결과를 다시 메인 쿼리로 반환해서 수행하는 쿼리

-> 성능이 좋진 않다.

-> 이전까지는 서브쿼리가 독단적으로 행동하고 내놓은 결과값을 사용하였고 상관 서브쿼리는 메인쿼리의 테이블을 서브쿼리에서 가져다가 사용하는 쿼리문



스칼라 서브쿼리
-> 상관쿼리 이면서 결과값이 1개인 서브쿼리
-> select 절에 오는 Sub Query
-> 스칼라 서브쿼리는 다양하게 사용

스칼라 서브쿼리 - SELECT 절

SELECT E.EMP_ID, E.EMP_NAME, E.MANAGER_ID,
	NVL((SELECT E2.EMP_NAME 
		FROM EMPLOYEE E2
		WHERE E.MANAGER_ID = E2.EMP_ID),'없음') AS "관리자명"
FROM EMPLOYEE E
ORDER BY 1;

스칼라 서브쿼리 - WHERE 절

SELECT EMP_NAME, JOB_CODE, SALARY
FROM EMPLOYEE E1
WHERE SALARY >= (SELECT AVG(SALARY) 
		 FROM EMPLOYEE E2
		WHERE E2.JOB_CODE = E1.JOB_CODE)
ORDER BY 2;

인라인 뷰 (FROM 절에서의 서브쿼리)

-> FROM 절에 서브쿼리를 사용한 것을 인라인뷰(INLINE-VIEW) 라고 한다.

WITH
-> 서브쿼리에 이름을 붙여주고, 인라인뷰로 사용시 서브쿼리의 이름으로 FROM 절에 기술 가능
-> 같은 서브쿼리가 여러번 사용될 경우 중복 작성을 피할 수 있고, 실행 속도도 빨라지는 장점이 있다.

profile
끊임없이 배우고 진보하는 백엔드 개발자입니다. 배움에 있어서 최선을 다하자!
post-custom-banner

0개의 댓글