PLOD

[SQL] SUB QUERY 본문

개발 공부/Database

[SQL] SUB QUERY

훌룽이 2023. 2. 21. 22:27

 

SUB QUERY (서브 쿼리)

하나의 SQL문 안에 포함되는 또 다른 SQL 문을 의미한다.  

SELECT ENAME, SAL							-- MAIN QUERY(OUTER QUERY)
FROM EMP
WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME = 'JONES')		-- SUB QUERY(INNER QUERY)

SQL문을 실행하는 데 필요한 데이터를 추가로 조회하기 위해 SQL문 내부에서 사용하는 SELECT 문을 의미하며 INNER QUERY라고도 부른다. 반대로 서브 쿼리의 결과 값을 사용하여 기능을 수행하는 맨 바깥쪽에 있는 쿼리를 MAIN QUERY라고 부른다. 

 

서브쿼리는 연산자와 같은 비교 또는 조회 대상의 오른쪽에 놓이며 소괄호 ()로 묶여 사용한다. 또 where 절이나 having 같은 조건절에서 서브쿼리를 사용할 때 비교 대상과 같은 자료형과 같은 개수로 지정해야 한다. 서브쿼리는 일반저긍로 기본 질의 실행 전에 한번 실행된다. 

 

서브쿼리는 single row subquery와 multiple row subquery가 있다.  single row subquery는 >,>=,=,<=,<> 같은 row operator와 함께 사용한다. multiple row subquery는 any , all, in,EXISTS과 같은 row operator와 함께 사용하는 특징이 있다.

 

1) 단일 행 서브 쿼리(single-row-subquery)

-- 사원번호가 7566인 사원의 급여보다 높은 사원의 데이터 출력
select ename, sal
from emp
where sal > (select sal from emp where empno = 7566);


-- EMP 테이블에서 사원번호가 7521인 사원과 업무가 같고 급여가 7934인 사원보다 많은 사원의 사원번호, 이름, 담당업무, 입사일자, 급여를 조회하라
select empno,ename,job,hiredate,sal
from emp
where job = (select job from emp where empno = 7521) and
sal > (select sal from emp where empno = 7934);

 

2) 다중 행 서브 쿼리(multiple-row-subquery)

다중행 연산자 설명
IN 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면  TRUE
ANY,SOME 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나이상이면  TRUE
ALL  메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 TRUE
EXISTS 서브쿼리의 결과가 존재하면(즉, 행이 1개 이상일 경우) TRUE
---multiple row subquery
SELECT empno ,ename ,sal, deptno
 FROM emp
 WHERE sal in  ( SELECT MAX(sal)
 	             FROM emp
	             GROUP BY deptno)

-- 업무가 SALESMAN인 최소 한 명 이상의 사원보다 급여를 많이 받는 SALESMAN이 아닌 사원 정보 출력
select ENAME,SAL,JOB
from emp
where job != 'SALESMAN'
AND SAL > ANY(SELECT SAL FROM EMP WHERE JOB = 'SALESMAN');


-- 업무가 SALESMAN인 모든 사원보다 급여를 많이 받고 SALESMAN이 아닌 사원 정보 출력
SELECT ENAME,SAL,JOB
FROM EMP
WHERE JOB != 'SALESMAN'
AND SAL > ALL(SELECT SAL FROM EMP WHERE JOB = 'SALESMAN');

subquery에는 그룹함수를 사용할 수 있다.

-- 평균보다 급여가 높은 회사원 정보 출력
SELECT empno, ename, job, sal, deptno
 FROM emp
 WHERE sal < (SELECT avg(sal) 
                   FROM emp);
                   
-- EMP 테이블에서 부서별 최소급여가 20번 부서의 최소 급여보다 많은 부서를 조회하라                   
select deptno, min(sal)
from emp
group by deptno
having min(sal) > (select min(sal) from emp where deptno = 20);

 

'개발 공부 > Database' 카테고리의 다른 글

[DB] Redis  (0) 2024.08.20
[SQL] GROUP 함수  (0) 2023.02.13
[SQL] SQL 함수  (0) 2023.02.05
[DB]Concurrency Control  (0) 2022.12.11
[DB]Transaction  (0) 2022.12.11
Comments