[Oracle/SQL] Sub Quary

JunHyeok Seo·2023년 8월 21일

database

목록 보기
5/5

서브쿼리

하나의 SELECT 문장의 절 안에 포함된 또 하나의 SELECT 문장. 서브 쿼리를 포함하고 있는 쿼리문을 메인쿼리, 포함된 또하나의 쿼리를 서브 쿼리라 한다.

단일 행 서브쿼리

리턴값이 1개 이하인 서브쿼리

단일행 비교연산자와 사용 (=, <, <=, >=, >, <>)

SELECT ENAME , SAL , MGR FROM EMP WHERE mgr = 
	( SELECT EMPNO FROM emp WHERE ENAME ='KING' );

다중 행 서브쿼리

리턴값이 여러행

다중행 비교연산자와 사용 (IN, ALL, ANY, SOME, EXISTS)


--<in 연산자>
--서브쿼리의 검색 결과 중에서 하나라도 일치되면 참이된다.

--Q. 급여를 3000 이상 받는 사원이 소속된 부서와 동일한 부서에서 근무하는 
--   사원들의 정보를 출력하는 SQL문 작성?
select ename, sal, deptno from emp where deptno in
  (select distinct deptno from emp where sal >= 3000);  -- 10, 20

--<all 연산자>
--메인쿼리의 비교조건이 서브쿼리의 검색 결과와 모든 값이 일치되면 참이된다.

--Q. 30번 부서에 소속된 사원 중에서 급여를 가장 많이 받는 사원보다 더 많은 
--   급여를 받는 사원의 이름과 급여를 출력하는 SQL문 작성?

--1) 단일행 서브쿼리로 구하기
select ename, sal from emp where sal >
    (select max(sal) from emp where deptno = 30);  -- 2850

--2) 다중행 서브쿼리로 구하기
select ename, sal from emp where sal >all
    (select sal from emp where deptno = 30); -- 다중행 서브쿼리
    
--<any 연산자>
--메인쿼리의 비교 조건이 서브쿼리의 검색 결과와 하나 이상 일치되면 참이된다.

--Q. 부서번호가 30번인 사원들의 급여중 가장 낮은 급여(950)보다 더높은 급여를
--   받는 사원명과 급여를 출력하는 SQL문 작성?

--1) 단일행 서브쿼리로 구하기
select ename, sal from emp where sal >
    (select min(sal) from emp where deptno=30);  -- 950
 
--2) 다중행 서브쿼리로 구하기
select ename, sal from emp where sal >any
    (select sal from emp where deptno=30);   -- 다중행 서브쿼리

IN

조건절에서 사용하며 다수의 비교값과 비교하여 그 중 하나라도 같은 값이 있다면 True

ANY

다수의 비교값 중 한개라도 만족하면 True. IN과 다른점은 비교 연산자를 사용한다는 것이다.

IN vs ANY

IN은 각 요소에 대해 == 연산, ANY는 앞에 주어진 비교 연산자를 수행한다.

ANY : 최소값 보다 크면

= ANY : 최소값보다 크거나 같으면

< ANY : 최대값보다 작으면

<= ANY : 최대값보다 작거나 같으면

= ANY : IN과 같은 효과

!= ANY : NOT IN과 같은 효과

ALL

전체 값을 비교하여 모두 만족해야만 True

ALL : 최대값 보다 크면

= ALL : 최대값보다 크거나 같으면

< ALL : 최소값보다 작으면

<= ALL : 최소값보다 작거나 같으면

= ALL : SUBSELECT의 결과가 1건이면 상관없지만 여러 건이면 오류가 발생합니다.

!= ALL : 위와 마찬가지로 SUBSELECT의 결과가 여러 건이면 오류가 발생합니다.


Reference

IN, ANY, ALL 설명

0개의 댓글