본문으로 바로가기

[DataBase] Oracle SQL 서브쿼리

category Programming/ DataBase 2018. 4. 21. 17:45


서브쿼리






하나의 테이블에서 검색한 결과를 다른 테이블에 전달하여 새로운 결과를 검색하는 경우 사용하는 서브쿼리




메인쿼리 서브쿼리

※ 수정 : SELECT DEPNO => DEPTNO



1
SELECT DNAME FROM DEPT WHERE DEPTNO = 20;
cs



1
2
SELECT DNAME FROM DEPT WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME='SCOTT');
 
cs


EMP 테이블에는 부서번호만 있지, 부서명은 없다, 부서명은 DEPT에 있다.




● 서브쿼리는 하나의 SELECT 문장의 절 안에 포함 된 또 하나의 SELECT 문장이다.

그렇기에 서브쿼리를 포함하고 있는 쿼리문을 메인 쿼리, 포함 된 또 하나의 쿼리를 서브쿼리라 한다.


● 서브쿼리는 비교 연산자의 오른쪽에 기술 해야 하고 반드시 괄호로 둘러 쌓아야 한다.

● 서브쿼리는 메인쿼리가 실행되기 이전에 한 번만 실행이 된다.

서브쿼리문을 먼저 실행하고, 메인쿼리가 실행하게 된다.





단일행 서브쿼리


 하나의 로우만을 반환되는 서브 쿼리의 결과를 메인 쿼리에 보내지게 되는데 메인 쿼리의 WHERE 절에서는 단일행 비교 연산자인 =,>,>=,<.<=,<>를 사용한다.




예제) 

● DALLAS에서 근무하는 사원의 이름, 부서 번호를 출력 해보자.

사원의 이름과 부서 번호는 EMP 테이블에서 가지고 올 수 있으며 근무지 DALLAS는 DEPT 테이블에 있다.


1
SELECT ename, deptno  from emp where deptno = (select deptno from dept where loc='DALLAS');
cs



● SALES(영업) 부서에 근무하는 모든 사원의 이름과 급여를 출력 해보자.

마찬가지로 사원의 이름과 급여는 EMP 테이블에서 가지고 올 수 있으며 영업부는 DEPT 테이블에서 확인 할 수 있다.


1
select ename, sal from emp where deptno = (select deptno from dept where dname='SALES')

cs



● 직속 상관이 KING인 사원의 이름과 급여를 출력 해보자

1
select ename , sal from emp where mgr = (select empno from emp where ename = 'KING');
cs




다중행 서브쿼리

서브쿼리에서 반환 되는 결과가 하나 이상의 행일 때 사용하는 서브쿼리

결과가 2개 이상 구해지는 쿼리문을 서브쿼리로 기술 할 경우에는 다중행 연산자와 함께 사용


----------------------------------------------------------보류---

● 10번 부서에 근무하는 사원의 이름과 10번 부서의 부서명을 출력 해보자


다중행 서브쿼리, ( )의 서브 쿼리 결과를 d라고 부른다.

그 후 JOIN이 들어간다

1
2
3
select e.ename , d.dname from emp e,
(select deptno, dname from dept where deptno = 10) d
where e.deptno = d.deptno;
cs


JOIN만을 통해서 구할 수도 있다.

1
2
select e.ename, d.dname from emp e, dept d
where e.deptno = d.deptno and d.deptno = 10;
cs


-------------------------------------------------------------------



예제)

● 부서별로 가장 급여를 많이 받는 사원으 ㅣ정보(사원 번호, 사원 이름, 급여, 부서번호)를 출력 해보자


1
2
select ename, deptno, sal from emp
where sal IN ( select max(sal) from emp group by deptno );
cs



● 직급(JOB)이 MANAGER인 사람의 속한 부서의 부서 번호와 부서명과 지역을 출력 해보자



1
2
select deptno, dname, loc from dept 
where deptno in ( select deptno from emp where job = 'MANAGER');




출처 : http://samdo0812.tistory.com/66?category=701129

'Programming > DataBase' 카테고리의 다른 글

[DataBase] 스키마  (0) 2018.04.23
[DataBase] SYNONYM - 동의어  (0) 2018.04.23
[DataBase] 인덱스  (1) 2018.04.21
[DataBase] Transaction  (0) 2018.04.19
[DataBase] DDL / DML / 서브쿼리  (1) 2018.04.19