서브 쿼리는 SELECT 문 안에 또 SELECT 문이 기재된 쿼리를 서브 쿼리라고 한다.
단일 SELECT문으로는 조회하기 어려운 복잡한 조건식을 만들때 사용되며, 다른 테이블에서 데이터를 먼저 SELECT 해온후 그걸 Where절에 조건절로 사용할때 사용한다.
서브 쿼리에 종류에는
단일행 서브쿼리 - 1개의 행을 검색하는 서브쿼리
다중행 서브쿼리 - 2개 이상의 행을 검색하는 서브쿼리
다중열 서브쿼리 - 1개 이상의 열을 검색하는 서브쿼리가 있다.
EMP 테이블에서 MARTIN과 같은 직업을 가진 직원들을 조회해보자.
Where절에 직접적으로 MARTIN의 직업을 문자열로 조건을 줄수도 있다. 하지만 이는 너무 단순하며, 고정적인 값이다.
직업들은 변할수 있고, 유동적으로 코드를 작성해야 앞으로에 있을 수정과 추가값에 유기적으로 조회가 가능하다
--Sub query
select empno, ename, sal, job
from emp
where job = (select job
from emp
where ename = 'MARTIN');
이렇게 Where절에 또하나의 Select문을 이용하여 조건절을 완성해주었다.
이렇게 MARTIN의 직업과 같은 직군의 나머지 사원들의 이름과 급여를 조회할수 있다.
다음은 MARTIN의 급여보다 이상인 사원들을 조회해보겠다.
select empno, ename, sal, job
from emp
where sal >= (select sal
from emp
where ename = 'MARTIN')
order by sal asc;
MARTIN의 급여인 1250 이상인 사원들이 잘 조회가 된다.
다음은 TURNER와 같은 일을 하는 사원들의 평균 급여 이상을 받는 사번, 사원명, 업무를 조회해보겠다.
먼저 TURNER는 SALEMAN이다. 위의 결과에서 확인할수 있다싶이 SALEMAN은 총 4명이고
4명의 평균 급여는 1400이다. 이를 서브쿼리로 표현해보면
--다음은 TURNER와 같은 일을 하는 사원들의 평균 급여 이상을 받는 사번, 사원명, 업무를 조회해보겠다.
select empno, ename, job, sal
from emp
where sal >= (select avg(sal)
from emp
where job = (select job
from emp
where ename = 'TURNER'))
order by sal asc;
Select를 총 3번 사용하면서 먼저 TURNER의 직업을 구하고, 그리고 그 직업의 평균급여를 구하고
그리고 최종적으로 나머지 직원들과의 급여 비교 연산자로 조회해주었다.
정상적으로 1400 이상의 직원들이 잘 표현이 된다.
마지막으로 Join을 이용하여 위의 결과에서 부서명을 함께 출력해줘보겠다.
--다음은 TURNER와 같은 일을 하는 사원들의 평균 급여 이상을 받는 사번, 사원명, 업무를 조회해보겠다.
--join을 이용하여 부서명 추가로 출력
select e.empno, e.ename, e.job, e.sal, d.dname
from emp e join dept d on e.deptno = d.deptno
where sal >= (select avg(sal)
from emp
where job = (select job
from emp
where ename = 'TURNER'))
order by sal asc;
--다른 표현 방식
select e.empno, e.ename, e.job, e.sal, d.dname
from emp e, dept d
where sal >= (select avg(sal)
from emp
where job = (select job
from emp
where ename = 'TURNER')) and e.deptno = d.deptno
order by sal asc;
JOIN의 표현방식 2가지를 이용했다. Foreigh KEY를 Where절에 주거나 Join ON 표기를 이용하여 From절에 Foreigh KEY를 줬다
두가지 다 표현만 다를뿐 결과는 동일하다
'Study > 중앙정보처리학원과정' 카테고리의 다른 글
26일차(2). 뷰(View)와 시퀀스(Sequence) (0) | 2022.11.30 |
---|---|
26일차(1). 다중행 서브쿼리(Multiple SubQuery) (0) | 2022.11.29 |
25일차(1). SQL 조인(Join) (0) | 2022.11.28 |
24일차(2). 이클립스(Eclipse)에서 DDL,DML 수행하기 Feat.메소드(Method) (0) | 2022.11.27 |
24일차(1). 이클립스(Eclipse)에서 DDL, DML 수행하기 (0) | 2022.11.25 |