레이블이 #오라클 #ORACLE #서브쿼리 #단일행서브쿼리 #subquery​인 게시물을 표시합니다. 모든 게시물 표시
레이블이 #오라클 #ORACLE #서브쿼리 #단일행서브쿼리 #subquery​인 게시물을 표시합니다. 모든 게시물 표시

2021년 10월 24일 일요일

오라클 서브쿼리, 단일행 서브쿼리(Single-Row Subquery)

 

오라클 서브쿼리, 단일행 서브쿼리(Single-Row Subquery)

단일행 서브쿼리

단일행 서브쿼리(single-row subquery)는 서브쿼리에서 결과를 하나만 반환합니다. 단일행 연산자 > , >= , < , <= , = , <>를 사용합니다(2.5절 ‘연산자’ 참조). 


단일행 서브쿼리나 복수행 서브쿼리는 SELECT 다음 컬럼 위치에 괄호로 싸서 SELECT 가 올수 있으며(스칼라 서브쿼리), FROM절 다음에 괄호로 싸서 SELECT가 올수있고(인라인 뷰), WHERE 절에 괄호로 싸서 SELECT가 올 수 있으며, ORDER BY 다음에도 괄호로 싸서 SELECT가 올수 있습니다. 단지 괄호로 싼 SELECT절이 값을 하나 리턴하느냐 둘 이상의 값을 리턴하느냐의 차이에 따라 단일행 서브쿼리, 복수행 서브쿼리로 구별합니다.


다음은 WHERE절에 단일행 서브쿼리가 올때의 형식 입니다.




단일행 서브쿼리 예문을 살펴봅시다.

5.2.1 두 번 쿼리해서 특정 직원과 같은 정보를 갖는 직원 정보 출력하기


EMP 테이블에서 ‘SMITH’와 같은 JOB을 가지는 직원들의 ENAME, SAL, JOB을 추출합시다. 만약 ‘SMITH’의 JOB이 ‘CLERK’이라는 사실을 알고 있다면 쉬울 겁니다. 그런데 나도 모르는 사이에 ‘SMITH’의 JOB이 바뀌면 어떻게 될까요? 어쩔 수 없이 아래와 같이 매번 두 번 쿼리를 해야 합니다.


SELECT JOB FROM EMP

WHERE ENAME = 'SMITH';


<실행 결과>

 

JOB

1

CLERK



SELECT ENAME, SAL, JOB 

FROM    EMP

WHERE JOB = 'CLERK'


<실행 결과>

 

ENAME

SAL

JOB

1

SMITH

  800

CLERK

2

ADAMS

1100

CLERK

3

JAMES

  950

CLERK

4

MILLER

1300

CLERK


쿼리를 두 번 수행해서 원하는 결과를 얻었습니다. 한 번에 결과를 얻을 방법이 없을까요? 바로 서브쿼리를 사용하면 됩니다.


5.2.2 한 번 쿼리해서 특정 직원과 같은 정보를 갖는 직원 정보 출력하기 : 서브쿼리


서브쿼리를 사용해서  ‘SMITH’와 같은 JOB을 가지는 직원들의 ENAME, SAL, JOB을 한방에 추출합시다.


SELECT ENAME, SAL, JOB

FROM   EMP

WHERE JOB = (SELECT JOB

                         FROM   EMP

                         WHERE ENAME = 'SMITH');


<실행 결과>

 

ENAME

SAL

JOB

1

SMITH

  800

CLERK

2

ADAMS

1100

CLERK

3

JAMES

  950

CLERK

4

MILLER

1300

CLERK



❶ “SMITH”의 JOB을 구하는 서브쿼리가 먼저 실행되어 “CLERK”을 반환합니다.

❷ 반환된 “CLERK”값을 가지고 바깥쪽의 메인쿼리가 실행되어 최종 결과를 반환합니다.

5.2.3 급여를 가장 적게 받는 직원 정보 출력하기 : 서브쿼리


급여 최대값을 구하기 위해서는 MIN(SAL)을 사용 합니다.


직원(EMP) 테이블에서 급여를 가장 적게 받는 직원의 이름과 급여를 출력하는 쿼리문을 만들어봅시다.


SELECT ENAME, SAL

FROM    EMP

WHERE  SAL = (SELECT MIN(SAL) 

                           FROM    EMP);


<실행 결과>


ENAME

        SAL

1

SMITH

        800


<실행 순서>

❶ 직원(EMP) 테이블에서 급여의 최소값인 MIN(SAL)을 구하는 서브쿼리가 먼저 실행되어 800을 반환합니다. ❷ 이 값을 가지고 메인쿼리가 실행이 되어 최종 결과를 추출합니다. 만약 급여가 800인 직원이 여럿이면 모두 출력됩니다.


5.2.4 특정부서 급여 최대값보다 급여가 많은 직원 정보 출력하기 : 서브쿼리


급여 최대값을 구하기 위해서는 MAX(SAL)을 사용 합니다.


직원(EMP) 테이블에서 10번 부서의 급여 최대값보다 급여를 많이 받는 직원의 이름과 급여, 부서코드을 출력하는 쿼리문을 만들어봅시다.


SELECT ENAME, SAL, DEPTNO

FROM    EMP

WHERE SAL > (SELECT MAX(SAL) 

                           FROM    EMP

                           WHERE DEPTNO = 10);


<실행 결과>


ENAME

        SAL

DEPTNO

1

JONES

      2975

          20

2

BLAKE

      2850

          30

3

SCOTT

      3000

          20

4

KING

      5000

      (null)

5

FORD

      3000

          20


<실행 순서>

❶ 직원(EMP) 테이블에서 10번 부서 급여의 최대값인 MAX(SAL)을 구하는 서브쿼리가 먼저 실행되어 2450을 반환합니다. ❷ 이 값을 가지고 메인쿼리가 실행이 되어 최종 결과를 추출합니다. 만약 급여가 800인 직원이 여럿이면 모두 출력됩니다.

 

#오라클 #ORACLE #서브쿼리 #단일행서브쿼리 #subquery​

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...