[Oracle] SUBQUERY

chael_lo·2021년 7월 2일
0

Oracle

목록 보기
15/17

서브쿼리(SUBQUERY)

SQL 명령에 포함되어 실행되는 SELECT 명령
여러 번의 SQL 명령으로 얻을 수 있는 결과를 하나의 SQL 명령으로 얻기 위해 사용하는 기능이다.

서브쿼리의 특징

  • SELECT 명령(MAINQUERY)에 포함되어 실행되는 SELECT 명령(SUBQUERY)이다.
  • 서브쿼리 명령이 먼저 실행된 후 메인쿼리 명령을 실행한다.
  • 서브쿼리의 명령은 메인쿼리의 FROM,WHERE, HAVING 구문에서 ()안에 작성한다.
  • 서브쿼리를 이용하면 하나의 SELECT 명령을 사용하여 원하는 결과를 검색할 수 있다.

WHERE 구문에서 서브쿼리의 검색 결과값을 사용

조건식의 비교대상과 같은 자료형의 값이 하나만 검색되도록 서브쿼리 작성해야 한다.
단일행(SINGLE ROW)의 단일 컬럼값(SINGLE COLUMN) 검색을 할 수 있다.

SELECT EMPNO,ENAME,SAL FROM EMP
WHERE SAL>=(SELECT SAL FROM EMP WHERE ENAME='SCOTT');

서브쿼리의 검색 결과값이 다중행인 경우

IN 연산자를 사용하여 컬럼값 비교하기

서브쿼리의 검색 결과값이 다중행(MULTI-ROW SUBQUERY)인 경우 = 연산자를 사용하여 비교하면 에러가 발생한다.

SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP
WHERE SAL IN(SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO);

또는 < 연산자는 ANY 또는 ALL 키워드와 같이 사용하여 검색하기

--EMP 테이블에서 부서번호가 20인 부서에 근무하는 모든 사원보다 급여가 많은 사원의
--사원번호,사원이름,급여,부서번호 검색
SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP
WHERE SAL>ALL(SELECT SAL FROM EMP WHERE DEPTNO=20);

단일행 서브쿼리의 MIN 또는 MAX 함수 사용

컬럼명<(단일행 서브쿼리 - MIN 함수) 사용

SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP
WHERE SAL<(SELECT MIN(SAL) FROM EMP WHERE DEPTNO=10);

컬럼명<(단일행 서브쿼리 - MAX 함수) 사용


--EMP 테이블에서 부서번호가 10인 부서에 근무하는 어떤 사원보다 급여가 적은 사원의
--사원번호,사원이름,급여,부서번호 검색하기
SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP
WHERE SAL<(SELECT MAX(SAL) FROM EMP WHERE DEPTNO=10) AND DEPTNO<>10;

컬럼명>(단일행 서브쿼리 - MAX 함수) 사용

--EMP 테이블에서 부서번호가 20인 부서에 근무하는 모든 사원보다 급여가 많은 사원의
--사원번호,사원이름,급여,부서번호 검색하기
SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP
WHERE SAL>(SELECT MAX(SAL) FROM EMP WHERE DEPTNO=20);

컬럼명>(단일행 서브쿼리 - MIN 함수) 사용

--EMP 테이블에서 부서번호가 20인 부서에 근무하는 어떤 사원보다 급여가 많은 사원의
--사원번호,사원이름,급여,부서번호 검색하기
SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP
WHERE SAL>(SELECT MIN(SAL) FROM EMP WHERE DEPTNO=20) AND DEPTNO<>20;

서브쿼리의 검색대상이 여러 개(MULTI-COLUMN SUBQUERY)인 경우

비교할 컬럼을 () 안에 ,로 구분하여 나열하면 비교 가능

SELECT EMPNO,ENAME,MGR,JOB,SAL FROM EMP
WHERE (MGR,JOB)=(SELECT MGR,JOB FROM EMP WHERE ENAME='ALLEN') AND ENAME<>'ALLEN';

profile
천천히 꾸준히

0개의 댓글