본문 바로가기

DataBase/Oracle

Oracle(7) - 서브쿼리

서브쿼리(Sub Query)

보통 2개이상의 테이블에서 데이터를 추출하고 싶을 때 서브쿼리를 사용합니다. JOIN과 비슷한듯 하지만 비슷하지 않은 개념입니다. 보통 서브쿼리는 JOIN중 Outer JOIN과 같이 동작을 하는데, JOIN에 실패해도 NULL값을 리턴합니다.

서브쿼리는 하나의 SELECT 문장의 절 안에 또하나의 SELECT문을 포함하고 있습니다.여기서 SELECT문장을 포함하고 있는 쿼리를 메인쿼리라부르고, 포함된 또하나의 쿼리를 서브쿼리라고 부릅니다.

SCOTT이라는 사원이 속하는 부서명을 알고싶다면 다음과 같은 쿼리를 작성해야합니다.


  1. SELECT DEPTNO FROM EMP WHERE ENMAE = 'SCOTT'; // 알아낸 부서번호가 20이라고 칩시다.
  2. 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