서브쿼리(Sub Query)
보통 2개이상의 테이블에서 데이터를 추출하고 싶을 때 서브쿼리를 사용합니다. JOIN과 비슷한듯 하지만 비슷하지 않은 개념입니다. 보통 서브쿼리는 JOIN중 Outer JOIN과 같이 동작을 하는데, JOIN에 실패해도 NULL값을 리턴합니다.
서브쿼리는 하나의 SELECT 문장의 절 안에 또하나의 SELECT문을 포함하고 있습니다.여기서 SELECT문장을 포함하고 있는 쿼리를 메인쿼리라부르고, 포함된 또하나의 쿼리를 서브쿼리라고 부릅니다.
SCOTT이라는 사원이 속하는 부서명을 알고싶다면 다음과 같은 쿼리를 작성해야합니다.
- SELECT DEPTNO FROM EMP WHERE ENMAE = 'SCOTT'; // 알아낸 부서번호가 20이라고 칩시다.
- SELECT DNAME FROM DEPT WHERE DEPTNO = 20;
이렇게하면 SCOTT이 소속된 부서명을 알 수 있습니다. 이렇게 2번써야될 쿼리를 한버에 쓸 수 있게 도와주는것이 바로 서브쿼리 입니다. 위의 쿼리를 서브쿼리로 바꿔보겠습니다.
SELECT DNAME FROM DEPT WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME = 'SCOTT')
이런식으로 2번쿼리안에 1번쿼리를 집어넣어서 작성하면 1번쿼리는 2번쿼리의 서브쿼리가 됩니다.
또다른 예시로 평균급여보다 더많은 급여를 받는 사원을 검색한다고 해봅시다.
SELECT ENAME, SALARY FROM EMP WHERE SALARY > (SELECCT AVG(SALARY) FROM EMP);
다중 행 서브쿼리
서브쿼리를 사용할 때 2개이상의 행이 검색될 때는 다중행 서브쿼리를 사용합니다. 다중 행 서브쿼리는 다음의 연산자들과 함께 사용해야 합니다.
- IN - 메인 쿼리의 비교조건이 서브쿼리의 결과 중에서 하나라도일치하면 참
- ALL - 메인 쿼리의 비교조건이 서브쿼리의 검색 결과와 모든 값이 일치하면 참
- EXIST
1. IN연산자 사용
급여를 3000이상받는 사원이 소속된 부서와 동일한 부서에 근무하는 사원을 검색할 때
SELECT ENAME, SAL, DEPTNO FROM EMP WHERE DEPTNO IN (SELECT DISTINCT DEPTNO FROM EMP WHERE SAL >= 3000) // 서브쿼리로 검색된 부서번호들 중 하나라도 일치하면 출력된다.
2. ALL연산자 사용
부서번호가 30번인 소속 사원들 중 급여를 가장 많이 받는 사원보다 더많은 급여를 받는 사람의 이름, 급여를 검색할 때
SELECT ENAME, SALARY FROM EMP WHERE SALARY > ALL(SELECT SALARY FROM EMP WHERE DEPTNO = 30)
'DataBase > Oracle' 카테고리의 다른 글
Oracle(6) - JOIN (0) | 2019.04.17 |
---|---|
Oracle(5) - 무결성제약조건 (0) | 2019.04.17 |
Oracle(4) - DML, 트랜잭션 (0) | 2019.04.16 |
Oracle(3) - DDL (0) | 2019.04.16 |
Oracle(2) - SQL함수 (0) | 2019.04.15 |