***subQuery
1. 다른 query문에 포함된 query문에 포함된 query
2. 반드시 ()를 사용
3. 연산자의 오른쪽에 와야한다.
4. order by 사용금지
5. 종류
(1) General Subquery
(2) Relation Subquery
6. 유형
(1) 단일행
(2) 다중행
(3) 다중열
7. 연산자
(1) 단일열
=, >, <, >=, <=, <>....
(2) 다중행
in, any, all, exists, not
안에 있는 서브쿼리가 먼저 실행 밖에 있는 쿼리가 나중에 실행된다,
쿼리를 구별할 수 있는 방법 서브쿼리만 실행될 때 Relation Subquery
다중열
위치와 순서 같아야한다.
*MILLER의 데이터 수정
select sal, comm from emp where ename='MILLER';
update emp set sal=1500, comm=300 where ename='MILLER';
=====================================================================================
실습
1. SCOTT 의 급여보다 더 많이 받는 직원의 이름, 업무, 급여 를 조회
SELECT sal FROM emp WHERE ename = 'SCOTT' ; --3000
SELECT ename, job, sal FROM emp WHERE sal>3000;
SELECT ename, job sal FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename='SCOTT');
2. 사번이 7521의 업무와 같고, 급여가 7934 보다 많은 직원의 사번, 이름, 업무, 급여를 조회
SELECT job FROM emp WHERE empno=7521; //SALESMAN
SELECT sal FROM emp WHERE empno=7934; //1300
select empno, ename, job, sal, from emp where job='SALESMAN' and sal>1300;
select empno, ename, job, sal, from emp where job=(select job from emp where empno=7521;) and sal>(select sal from emp where empno=7934);
3. 업무별로 최소급여를 받는 직원의 사번, 이름, 급여, 부서번호 조회
select empno, ename, sal, deptno from emp where sal in(select min(sal) from emp group by job)
select empno, ename, sal, deptno from emp where sal=800 OR sal=1250 OR sal=5000 OR sal=2450 OR sal=3000;
select min(sal) from emp group by job;
select empno, ename, sal, deptno from emp where sal in(select min(sal) from emp group by job);
4. 업무별로 최소급여보다 많은 급여를 받는 직원의 사번, 이름, 업무, 부서번호를 조회
select empno, ename, job, sal, deptno from emp where sal > any(select min(sal) from emp group by job);
select min(sal) from emp group by job;
5. 업무별로 최대급여를 받는 직원의 사번, 이름, 업무, 부서번호를 조회
select max(sal) from emp group by job;
select empno, ename, deptno from emp where sal >= all(select max(sal) from emp group by job);
6.급여와 보너스가 30번 부서에 있는 직원의 급여와 보너스가 같은 직원에 대해 사번, 이름,., 부서번호, 급여, 보너스 조회
select empno, ename, deptno, sal, comm from emp where (sal, comm) in(select sal, comm from emp where deptno=30);
select sal, from emp where deptno=30 ;
select comm from emp where deptno=30;
7. 상관 서브 쿼리
*적어도 한명의 직원으로부터 보고를 받을 수 있는 직원의 이름, 업무, 입사일자, 급여를 조회
select ename, job, hiredate, sal from emp where empno in(select distinct mgr from emp) order by ename;
select ename, job, hiredate, sal from emp e where empno exists(select distinct mgr from emp where e.empno=mgr) order by ename;
select distinct mgr from emp;
댓글 없음:
댓글 쓰기