Web develop/SQL

[SQL/ORACLE] 서브쿼리 , 다중행 서브쿼리 연산자

ForA 2019. 6. 15. 20:35
728x90

SUB QUERY

: 특정 테이블에서 검색된 결과를 다른 테이블에 전달하여
새로운 결과를 검색할 때 사용

-- JAMES 사원이 근무하는 부서이름 출력
SELECT deptno FROM emp WHERE ename='JAMES'; --> 30번 부서 근무
SELECT dname FROM dept WHERE deptno = 30; --> 부서명 SALES
서브쿼리 사용
SELECT dname FROM dept WHERE deptno = --> 메인쿼리
(SELECT deptno FROM emp WHERE ename='JAMES'); -->서브쿼리

SELECT dname FROM (SELECT dname,loc FROM dept); 
-- 테이블명에도 객체로 사용가능. 인라인뷰라고 불림

다중행 서브쿼리

  • 서브쿼리의 결과행이 여러개(2개 행 이상)
  • 반드시 다중 행 연산자 (Multiple Row Operator)와 함께 사용

다중 행 연산자

IN : 메인쿼리의 비교조건이 서브쿼리의 결과중에서 하나라도 일치하면

ANY,SOME : 메인쿼리의 비교조건이 서브쿼리의 결과와 하나이상 일치하면

ALL : 메인쿼리의 비교조건이 서브쿼리의 결과와 모든 값이 일치하면 참.

EXISTS : 메인쿼리의 비교조건이 서브쿼리의 결과중에서 만족하는 값이 하나라도 존재하면 참.

-- IN
SELECT ename, sal, deptno FROM emp
WHERE deptno IN(SELECT deptno FROM emp WHERE sal >= 3000);

-- 급여를 3000 이상 받는 사원이 소속된 부서와 동일한 부서에 근무하는 
-- 사원들의 사원명, 급여, 부서번호를 출력하시오.
-- ALL 

SELECT ename, sal FROM emp 
WHERE sal > ALL(SELECT sal FROM emp WHERE deptno = 30);

=> ALL 대신 MAX함수 사용
SELECT ename, sal FROM emp 
WHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno = 30);

-- 문제) SCOTT와 급여가 동일하거나 더 많이 받는 사원의 이름과 급여출력
SELECT ename, sal FROM emp 
WHERE sal >= (SELECT sal FROM emp WHERE ename='SCOTT') AND ename != 'SCOTT';

--2500 sal의 SCOTT 추가 이후
insert into emp (empno, ename, sal)values (8888, 'SCOTT', 2500);

--2500 이상의 사원정보 / ANY사용
SELECT ename, sal FROM emp WHERE sal >= ANY(SELECT sal FROM emp WHERE ename='SCOTT');

--3000 이상의 사원정보 / ALL사용
SELECT ename, sal FROM emp WHERE sal >= ALL(SELECT sal FROM emp WHERE ename='SCOTT');


SELECT * FROM dept WHERE exists(SELECT * FROM emp where 1=1);
/*
데이터 존재유무에 따라 SELECT, DELETE, UPDATE, INSERT시 
제어하는 역할로 사용
1=0 이면 거짓이기에 출력하지않음
*/