▶ 모든 서브 쿼리는 괄호를 싸여 있으며 메인 쿼리 안에 SELECT문이 들어가는 것을 서브 쿼리

▶ 서브쿼리의 결과 값이 하나일 경우에는 =,!=,<,<=,>,>= 연산자를 사용해야 합니다.

▶ 서브쿼리의 결과 값이 여러개일 경우에는 IN,SOME,ALL,ANY 연산자를 사용해야 합니다.

▶ 연산자 IN은 서브쿼리에서 돌려주는 리턴 값과 동등하게 비교합니다.

▶ ANY는 같은 의미이며, 서브 쿼리에서 돌려주는 값이 하나라도 비교 조건을 만족하면 참이 됩니다.

▶ALL은 서브쿼리에서 돌려주는 모든 값이 비교조건을 만족할때, 참이 됩니다.

▶메인 쿼리의 SELECT문에서 SELECT_LIST에 해당하는 값으로 서브 쿼리를 사용할수 있는데,

  이때 반드시 단일 값만을 리턴해야함

▶ 메인 쿼리와의 연관성에 따라 

- 연관성 없는 서브쿼리

-연관성 있는 서브 쿼리

 

 

▶ 연관성이 없는 서브쿼리 : 메인테이블과 조인조건이 걸리지 않는 서브쿼리

 

SELECT COUNT(*) FROM EMPLOYEES 
WHERE SALARY >= (SELECT AVG(SALARY) FROM EMPLOYEES );

// 전사원의 평균급여 이상을 받는 사원의 수를 조회하는 쿼리

SELECT EMPLOYEE_ID,FIRST_NAME,JOB_ID FROM EMPLOYEES WHERE (EMPLOYEE_ID,JOB_ID) 

IN (SELECT EMPLOYEE_ID,JOB_ID FROM JOB_HISTORY);

 

//JOB_HISTORY 테이블에 있는 EMPLOYEE_ID,JOB_ID 두 값을 같은 건을 사원테이블에서 찾는 쿼리로 서브쿼리는 메인 쿼리와 연관성이 없다. 

//동시에 2개이상의 컬럼 값이 같은 건을 찾고있다. 

//서브 쿼리는 SELECT문 뿐만 아니라 다음과 같이 UPDATE문,DELETE문에서도 사용할수 있다.

▶ 연관성 있는 서브쿼리

메인테이블과 조인조건이 걸리 서브쿼리

EXISTS 연산자를 사용해서 서브쿼리내에 조인 조건이 포함되었다.

 

SELECT A.DEPARTMENT_ID,A.DEPARTMENT_NAME FROM DEPARTMENTS A WHERE EXISTS 

(SELECT 1 FROM JOB_HISTORY B WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID );

서브쿼리 안에서 메인쿼리에서 사용된 부서 테이블의 부서번호와 JOB_HISTORY테이블의 부서번호가 같은 건을 조회하고있다.

 

 

 

 

▶ 형태에 따라

-일반 서브쿼리(Select 절)

-인라인 뷰 (from절)

-중첩쿼리 (where절)

+ Recent posts