-
[SQL] SUB QUERY ( 서브 쿼리)Database/SQL (oracle, mysql) 2019. 5. 28. 16:18
SUB QUERY (서브 쿼리)
SELECT DNAME <-메인쿼리 , 1행 1열
FROM DEPT <- DEPT에서 서브쿼리가 들어갈 수 있다. 다행다열 = VIEW ( 왜? 테이블이니까 )
WHERE DEPTNO = (SELECT 절) <- 서브 쿼리
서브 쿼리가 들어가는 조건은: 1개의 열 1개의 행이다.
다중행 서브쿼리도 존재한다. (Multi Row Operator)
- 서브쿼리에서 반환되는 결과가 두개 이상의 행일 때 사용하는 서브 쿼리
- 반드시 다중 행 연산자와 함께 사용.
IN ANY, SOME ALL EXISTS
IN: 메인 쿼리의 비교 조건이 서브 쿼리의 결과중에서 하나라도 일치하면 참
WHERE DEPTNO IN ( SELECT DEPTNO FROM DEPT WHERE DEPTNO<30 ) <- 결과가 여러개일때
ANY, SOME: 메인 쿼리의 비교조건 (WHERE절) 서브쿼리의 결과와 하나 이상 일치하면 참 ( =OR )
WHERE SAL < ANY (SELECT SAL FROM EMP WHERE DEPTNO =20 ) -- 20 번 부서의 최소급여보다 많은 급여 받는
ALL: 메인 쿼리의 비교조건이 서브쿼리의 결과와 모든 값이 일치 하면 참 (= AND)
WHERE SAL < ALL (SELECT SAL FROM EMP WHERE DEPTNO =20 ) -- 20번부서 최대 급여보다 많이 받는
ALL과 ANY의 차이점
select ename, sal
from emp
where sal >= all(select sal
from emp
where ename='SCOTT'); ---> 3000 이상의 사원정보
-------------------------ANY---------------------------
만약 서브쿼리 결과 : 2500 2800 3000
where sal >= any (2500, 2800, 3000)
==> sal >= 2500 OR sal >= 2800 OR sal >= 3000
-------------------------ALL---------------------------
만약 서브쿼리 결과 : 2500 2800 3000
where sal >= all (2500, 2800, 3000)
==> sal >= 2500 AND sal >= 2800 AND sal >= 3000
------------------------- IN --------------------------
만약 서브쿼리 결과 : 2500 2800 3000
where sal IN (2500, 2800, 3000)
==> sal = 2500 OR sal = 2800 OR sal = 3000
-------------------------------------------------------
EXISTS: 메인 쿼리의 비교조건이 서브쿼리의 결과중에서 만족하는 값이 하나라도 존재하면 참.
데이터 존재 유무에 따라 SELECT, DELETE, UPDATE, INSERT시 제어하는 역할로 사용된다.
사용법) WHERE EXISTS (서브쿼리)
WHERE NOT EXISTS (서브쿼리)
ex. SELECT * FROM DEPT WHERE EXISTS (SELECT * FROM EMP) <-서브 쿼리 결과가 1행 이상이면 TRUE
SELECT * FROM DEPT WHERE EXISTS (SELECT * FROM EMP WHERE 1=0); <- 결과가 FALSE면 실행을 안한다.
반응형'Database > SQL (oracle, mysql)' 카테고리의 다른 글
[SQL] DML - INSERT, DELETE, UPDATE (데이터 조작어) (0) 2019.05.29 [SQL] DDL - CREATE, DROP, ALTER, RENAME, TRUNCATE (0) 2019.05.28 [ SQL ] JOIN 의 종류 (0) 2019.05.27 [DB] SQL 숫자, 날짜, 문자 함수 (0) 2019.05.24 [DB] SQL 연산자 종류 (0) 2019.05.23