문법
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보다 작은 데이터 출력
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 절에 기술 가능
-> 같은 서브쿼리가 여러번 사용될 경우 중복 작성을 피할 수 있고, 실행 속도도 빨라지는 장점이 있다.