데이터베이스 - 단일행 서브 쿼리
서브 쿼리
두 가지 쿼리를 동시에 쓰는 것을 서브 쿼리라고 한다.
여기서 첫 번째 sql문으로 우리는 800이라는 값을 얻었고, 이 값을 이용하여 두 번째 쿼리문을 통해서 800보다 많은 월급을 받는 사람들을 구했다.
이 두 가지 과정을 통해서 smith보다 월급이 많은 사람들을 구했는데, 이를 하나의 sql문으로 수행하고 싶다.
이를 위해서 서브 쿼리를 사용할 것이다. 먼저 우리가 가져오고 싶은 데이터는 smith보다 월급을 많이 받는 사람을 구하는 것이기 때문에 위에서 메인 쿼리는 두 번째 쿼리가 된다. 그리고 800이 들어가는 자리에 첫 번째 쿼리문을 넣는다. 이를 통해서 한번에 구해준다.
서브쿼리에는 두 가지 종류가 존재한다.
단일행 서브 쿼리
복수행 서브 쿼리
먼저 단일행부터 살펴보자
단일행 서브쿼리는 = < > <= >= <>만 사용할 수 있다.
최고 급여를 받는 사원의 이름과 봉급 구하기
우리가 앞서서 max함수를 배울 때 그룹함수를 적용하면 개별 데이터에 대한 정보를 잃어버리기 때문에 max함수를 통해서 해당 직원의 이름까지 출력할 수 없었다.
이 문제를 서브쿼리를 사용하여 해결해보겠다.
먼저 서브 쿼리 작성에 앞서 서브 쿼리와 메인 쿼리에 해당하는 부분을 구분하자.
서브 쿼리 - 최고 급여 구하기
메인 쿼리 - 이름과 봉급 구하기
이에 맞게 코드를 작성하고 출력 정보를 확인하자.
참고로 서브 쿼리는 꼭 where절에 나올 필요는 없다.
사번이 7844인 사원의 직책과 동일한 사원들의 사원번호, 이름, 직책을 출력하자.
서브쿼리 - 사번이 7844인 사원의 직책
메인쿼리 - 서브쿼리에서 반환하는 직책과 동일한 사원들의 사원번호, 이름, 직책
서브쿼리 두 개 선언하기
사원 테이블에서 사번이 7521번인 사원과 같은 업무를 수행하고 있으며, 사번이 7900번인 사원의 급여보다 많은 급여를 받는 사원의 이름, 업무, 급여는 다음과 같다.
서브쿼리 1: 7521 사원의 직책
서브쿼리 2: 7900 사원의 월급
메인쿼리: 서브쿼리1의 직책과 동일하면서 서브쿼리2의 월급보다 많이 받는 사원의 이름, 직책, 월급
Having 절 안에 서브쿼리 넣기
부서 번호가 20인 부서의 최소 월급보다 부서 최소 월급이 큰 부서의 부서 번호와 최소 월급을 출력하라
서브 쿼리: 20부서에서 최소 월급
메인 쿼리: 부서 최소 월급이 서브 쿼리 반환값보다 큰 부서의 부서 번호와 최소 월급
지금까지는 서브쿼리의 결과값이 한개 이어야만 한다. 이는 단일 서브쿼리에서의 조건을 충족해야 하기 때문.
이처럼 단일 행 하위 질의에서는 한 개의 데이터만 반환해야 한다. 하지만 여기서 우리는 그룹의 개수 만큼의 max(sal)을 반환하기 때문에 오류가 발생한다.
그렇다면 이를 어떻게 해결해야하나???
이제 복수행 서브 쿼리에 대해서 들어가보도록 하자
댓글
댓글 쓰기