하나의 SQL 문장절에 포함된 또다른 SELECT 문장, 따라서 두번 질의를 해야
얻을수 있는 결과를 한번의 질의로 해결이 가능하게 하는 쿼리
용어
Main-Query 또는 Outer-Query
Sub-Query 또는 Inner-Query 두쌍이 같은 의미이다.
특징
괄호로 반드시 묶어야 한다.
서브쿼리는 메인 쿼리의 다음 부분에 위치할 수 있다.
1)SELECT / DELETE / UPDATE 문의 FROM 절과 WHERE 절
2)SELECT 문의 HAVING 절
3)INSERT 문의 INTO 절
4)UPDATE 문의 SET 절
종류
<1> 단일행 서브쿼리
-서브쿼리의 실행결과가 하나의 칼럼과 하나의 행만을 리턴해주는 쿼리
(하나의 데이터만 리턴해주는 쿼리)
<2> 복수행 서브쿼리
-서브쿼리의 실행결과가 하나의 칼럼과 여러개의 행을 리턴해주는 쿼리
(여러개의 데이터만 리턴해주는 쿼리)
단일행 서브쿼리 작성하기(1 row, 1 column)
* WHERE 뒤에 두 테이블을 연결해 주는(겹치는) 칼럼명 입력하고 괄호 안 서브쿼리에 그것과 일치해야 하는 칼럼명(두개가 서로 다를수도 있음) + 해당 테이블명 적으면서 원하는 조건의 값 도출
테이블이 서로 다른 경우에는 where 뒤에 들어가는 칼럼명이 두 테이블을 연결해주는 칼럼명이 들어가야 한ㄷ ㅏ..?? 이거 확인해보기 ***
Q. 'SMITH' 가 근무하는 부서명을 서브쿼리를 이용해서 출력해 보세요.
서브쿼리를 사용하지 않으면
SQL> SELECT dname
2 FROM dept
3 WHERE deptno=(SELECT deptno FROM emp WHERE ename='SMITH');
Q. 급여를 3000 이상받는 사원이 소속된 부서와 동일한 부서에서 근무하는 사원들의 이름과 급여, 부서번호를 출력해 보세요.
부서를 비교해야 하니까 부서번호로 보기 !
1칼럼 2로우니까 = 못쓰고 in으로 묶기
1 SELECT ename, sal, deptno
2 FROM emp
3* WHERE deptno IN(SELECT deptno FROM emp WHERE sal>=3000)
EX) 자신의 직속 상관이 'KING' 인 사원의 이름과 급여를 출력해 보세요.
>SELECT ename,sal
FROM emp
WHERE mgr = (SELECT empno FROM emp WHERE ename='KING');
where절 뒤에 일치해야 하는 칼럼명
mgr=empno 여야 하니까 mgr이랑 일치해야 하는 empno를 구하는 조건절을 괄호 안에 다시 적어주고 ename이 KING이어야 한다는 조건 적어주기
EX) 'SALES' 부서에서 근무하는 모든 사원의 이름과 급여를 출력해보세요.
>SELECT ename, sal
FROM emp
WHERE deptno = (SELECT deptno FROM dept WHERE dname='SALES');
서브쿼리 안에서 WHERE절 안의 칼럼명이 속해 있는 테이블명 적기 !!!