# subquery--알려지지않은 데이터값을 알기위해 사용(나중에 변할수있는값)
두 종류의 비교 연산자들이 서브쿼리에 사용된다
서브쿼리는 연산자의 오른측에 나타나야한다.
서브쿼리는 여러 sql문장에 사용가능하다
서브쿼리는 order by절을 포함할수없다
select e.empno,e.ename,m.empno
from (select * from emp)e, emp m-->괄호안의 데이터 부터 처리후 괄호밖의 데이터에 대입함!
where e.mgr=m.empno
# 위치에 따른 명칭
스칼라 서브쿼리 - SELECT문에 있는 서브쿼리
인라인뷰 - FROM절에 있는 서브쿼리
서브쿼리(필터서브쿼리) - WHERE절에 있는 서브쿼리
# 반환값에 따른 서브쿼리종류
단일행서브쿼리 - 서브쿼리결과가 1행
다중행서브쿼리 - 서브쿼리결과가 여러행
다중컬럼서브쿼리 - 서브쿼리의결과가 여러컬럼
정리하자면
SUBQUERY의 형태는 4가지 : ( )가 전부 서브쿼리
1. WHERE A = ( 단일값 )
2. WHERE X IN ( 단일칼럼(여러개값일수도있음) )
3. SELECT (단일값 )
4. FROM (테이블)
3번인 SELECT에 사용되는 서브쿼리
스칼라서브쿼리라고함
반환행의 개수도 0또는 1이어야함
마치 SELECT절에서 함수처럼 사용됨( 일치하는데이터가 없더라도 NULL값을 리턴할 수 있음)
보통 코드에 맞는 명칭을 검색할때 주로사용
4번인 FROM절에 사용되는 서브쿼리
인라인뷰라고함
보통 쿼리의 재정의라고함( 기존테이블을 재가공하기때문 )
1,2번인 WHERE절에 사용되는 서브쿼리
필터서브쿼리라고함
상수값이 아닌 그룹에 속하는 2이상의정보를 조건으로 활용하고자할때 사용
조건식에 IN등을 주로 활용
주의사항은 불필요한 스캔으로 I/0속도저하를 가져올 수 있음
* 단일행 서브쿼리
ex) 44번 부서의 평균 급여보다 많은 급여를 받는 직원들의 직원아이디, 직원명, 급여를 출력하시오.
SELECT
E.ID, E.NAME, E.SALARY
FROM S_EMP E
WHERE E.SALARY > ( SELECT AVG(SALARY) FROM S_EMP WHERE DEPT_ID=44 )
ex) 'scott'이라는 직원이 근무하는 부서의 직원값조회
SELECT *
FROM EMP
WHERE DEPT_ID = (SELECT DEPT_ID FROM EMP WHERE NAME = 'SCOTT' )
* 다중행 서브쿼리
위의 예문들은 모두 단일행 서브쿼리이다
둘 이상의 데이터가 반환될때 연산자를( <, > , <> , = 등..)사용하면 에러남
둘 이상의 데이터가 반환될 때에는 in , >, 같은 복수행 연산자를 사용해야함
IN 연산자 : 하나의컬럼이 여러개의 '='조건을 가지는 경우사용
ANY연산자
ALL연산자 :
SELECT NAME, SALARY, DEPT_ID
FROM S_EMP
WHERE NAME IN ( SELECT
* 다중컬럼 서브쿼리
서브쿼리결과가 여러칼럼인 경우
컬럼개수 동일해야함
괄호 필수
부서별 최소연봉을 받는 사람의 정보
SELECT DEPTNO, ENAME, SAL
FROM EMP
WHERE (DEPTNO, SAL) IN ( SELECT DEPTNO, MIN(SAL)
FROM EMP
GROUP BY DEPTNO
)