서브쿼리 : 메인 SQL문에 포함되어 있는 또 다른 SQL문을 말한다.
- 반드시 괄호( )로 감싸서 사용한다.
- 메인SQL문보다 서브쿼리가 먼저 실행된다.
- 서브쿼리만 가지고도 실행되어야 한다.
- 서브쿼리의 결과가 바깥쿼리의 인자(매개변수)로 사용된다.
- 서브쿼리의 대부분을 조인으로 만들 수 있다.
- 서브쿼리와 조인(JOIN)문은 병행되어 사용이 가능하다.
- 서브쿼리 안에서 ORDER BY절은 사용할 수 없다.
- 서브쿼리는 위치에 따라 명칭이 다르다.
- FROM절에 사용시 인라인 뷰 (Inline view)
- SELECT문에 사용시 스칼라 서브쿼리 (Scala Subquery)
- WHERE절에 사용시 서브쿼리(Subquery) - 일반적
- JONES의 부서명을 구해서 JONES와 같은부서의 부서명과 사원명 출력하기
SELECT E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND D.DEPTNO =
(SELECT DEPTNO FROM EMP WHERE ENAME = 'JONES');
- 10번 부서에서 근무하는 사원의 이름과 부서명을 출력하기
--JOIN 사용
SELECT E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E. DEPTNO = 10;
--서브쿼리 사용
SELECT E.ENAME, D.DNAME
FROM EMP E, (SELECT DEPTNO, DNAME FROM DEPT WHERE DEPTNO = 10) D
WHERE E.DEPTNO = D.DEPTNO;
- 평균보다 더 많은 급여를 받는 사원들을 검색해 출력하기
SELECT EMPNO, ENMAE, SAL
FROM EMP
WHERE SAL > (SELECT AVG(SAL) FROM EMP);
- 'BLAKE'가 속한 부서의 사원 이름과 고용일자 출력하기
SELECT ENAME, HIREDATE
FROM EMP
WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME = 'BLAKE');
- 급여가 3000 이상인 사원이 소속된 부서의 사원명, 급여, 부서번호 출력하기 (다중행 처리 -리턴값이 여러개 IN연산자 활용)
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO FROM EMP WHERE SAL >= 3000)
ORDER BY DEPTNO;
- 30번 부서원들 중 제일 많이 급여를 받는 사람보다, 더 많이 받는 사람들의 이름과 급여를 출력하기 (ALL)
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO=30);
--컬럼 > (전체만족)ALL : 가장 큰 값보다 큰 값/ 위와 같은 결과
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ALL(SELECT SAL FROM EMP WHERE DEPTNO=30);
--컬럼 < (전체만족)ALL : 가장 작은 값보다 작은 값
SELECT ENAME, SAL
FROM EMP
WHERE SAL < ALL(SELECT SAL FROM EMP WHERE DEPTNO=30);
- 20번 부서원들 중 가장 낮은 급여를 받는 사람보다, 더 많은 급여를 받는 사람의 이름과 급여를 출력 (ANY)
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT MIN(SAL) FROM EMP WHERE DEPTNO=20);
--컬럼 > (부분만족)ANY : 가장 작은 값보다 큰값/ 위와 같은 결과
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ANY(SELECT SAL FROM EMP WHERE DEPTNO=20);
--컬럼 < (부분만족)ANY : 가장 큰 값보다 작은값
SELECT ENAME, SAL
FROM EMP
WHERE SAL < ANY(SELECT SAL FROM EMP WHERE DEPTNO=20);
- 급여가 평균 급여보다 많고, 이름에 S가 들어가는 사원과 동일한 부서에서 근무하는 사원의 사번, 이름, 급여 출력하기
- 이중 서브쿼리
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO FROM EMP WHERE SAL >
(SELECT AVG(SAL) FROM EMP) AND ENAME LIKE '%S%');
'데이터베이스 > SQL' 카테고리의 다른 글
[DB] SQL SET연산자(집합연산자)_합집합 UNION,교집합 INTERSECT, 차집합 MINUS (0) | 2021.10.28 |
---|---|
[DB] SQL JOIN(조인)_INNER, OUTER, SELF, 3중 JOIN (0) | 2021.10.28 |
[DB] SQL 관계형 데이터베이스 RDBMS 의 키(KEY)_기본키(PK), 외래키(FK), 슈퍼키(SK) (0) | 2021.10.28 |
[DB] SQL SELECT문(4)_GROUP BY절(그룹함수), HAVING절 (0) | 2021.10.27 |
[DB] 오라클 SQL 함수 (6) 그룹 함수(다중행 함수)_SUM, AVG, MAX, MIN, COUNT.. (0) | 2021.10.27 |