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 이면 거짓이기에 출력하지않음
*/
'Web develop > SQL' 카테고리의 다른 글
[SQL/ORACLE] VIEW 형식 및 사용법 (0) | 2019.06.15 |
---|---|
[SQL/ORACLE] CASCADE 사용법 및 예제 (0) | 2019.06.15 |
[SQL/ORACLE] ORACLE JOIN & ANCI JOIN (0) | 2019.06.15 |
[SQL/ORACLE] CASE 함수 사용예제 (Simple / Searched) (0) | 2019.05.29 |
[SQL/ORACLE] 그룹함수, DECODE 함수 (1) | 2019.05.29 |