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​

오라클 SQL(Oracle SQL) 서브쿼리(SubQuery) 개요 및 종류, 서브쿼리란?

 오라클 SQL(Oracle SQL) 서브쿼리(SubQuery) 개요 및 종류, 서브쿼리란? 

 

5. 서브쿼리

학습 목표

서브쿼리(subquery) 개념, 종류, 사용 방법을 알아봅니다.

학습 순서

  • 단일행 서브쿼리

  • 복수행 서브쿼리

  • 상관관계 서브쿼리

  • 스칼라 서브쿼리

  • 인라인뷰 서브쿼리

  • WITH 절(서브쿼리 팩토링)

  • 행 제한 구문을 활용한 Top-N 쿼리



핵심 요약

  1. 서브쿼리는 SELECT, INSERT, UPDATE, DELETE등 모든 SQL문에서 사용가능한 부속 쿼리 문 입니다.

  2. 단일행/복수행/상관관계/스칼라/인라인부/WITH 등에서 사용되는 SQL문 작성을 위한 필수품 입니다.

  3. 서브쿼리, 조인만 잘 이해하시면 쿼리 작성에 눈을 뜨게 됩니다.

서브쿼리 소개

서브쿼리subquery는 SELECT절, FROM절, WHERE절 또는 INSERT, UPDATE, DELETE 내부 또는 다른 서브 쿼리 내부에 중첩 사용될 수 있는내장된 SELECT 문장입니다. 내부쿼리(inner query)라고도 하며 메인쿼리 이전에 한 번만 실행되고 결과를 메인쿼리에서 전달합니다.

대체로 서브 쿼리는 메인 쿼리보다 먼저 실행되므로 서브 쿼리의 결과가 외부 쿼리에 전달 될 수 있습니다. 어떠한 경우에는 메인 쿼리의 값을 받아서 서브 쿼리가 실행 되기도 합니다.


다음은 EMP 테이블에서 이름이 ‘SMITH’인 직원의 급여보다 급여가 많은 사람을 추출하는 쿼리문입니다.



괄호로 싸인 부분이 서브쿼리입니다. 서브쿼리의 결과를 비교 조건으로 사용하는 외부에 있는 구문을 메인쿼리(main query)라고 합니다. 메인쿼리를 외부쿼리(outer query)라고도 합니다.  

서브쿼리 사용 지침

  • 서브쿼리는 괄호로 쌉니다.

  • 단일행 및 복수행 서브쿼리는 연산자 우측에 나타나야 합니다.

유용한 경우

서브쿼리는 테이블 자체의 데이터에 의존하는 조건으로 테이블의 행을 검색할 필요가 있을 때 유용합니다. 예를 들어 직원 테이블에서 SMITH 직원과 같은 부서에 있는 직원들을 추출하는 경우 먼저 SMITH의 부서를 먼저 추출하고, 추출한 부서코드를 가지는 직원들을 다시 추출하면 됩니다.


5.1 서브쿼리 종류

서브쿼리는 반환하는 값 개수에 따른 분류, 실행 방식 등에 따라 다양한 종류가 있습니다.


  • 반환하는 값 개수에 따른 분류. 서브쿼리가 행을 하나만 반환하면 단일행 서브쿼리, 행을 둘 이상 반환하면 복수행 서브쿼리라고 합니다. 단일행 서브쿼리는  =, <, <=, > , >=, <> 연산자를 사용하고 복수행 서브쿼리는 IN, ALL, ANY, SOME, EXISTS 연산자를 주로 사용합니다.

  • 실행 방식에 따른 구분. 메인쿼리의 컬럼을 서브쿼리에서 사용하는 경우 상관관계 서브쿼리라고 부릅니다.

  • 스칼라 서브쿼리. GROUP BY 절을 제외한 곳에서 행 하나, 컬럼 값 하나에 대체하여 SELECT 절을 기술할 수 있는데 이를 스칼라 서브쿼리라고 하며 반드시 결과 값을 하나만 반환해야 합니다. SELECT LIST, 

  • 인라인 뷰 서브쿼리. FROM 절 다음에 기본적으로 테이블명이 오지만 이를 대신하여 SELECT 절이 올 수 있는데 이를 인라인 뷰라고 합니다, 이 역시 서브쿼리의 일종입니다.

  • 서브쿼리 팩토링. UNION 등을 사용하여 SQL 문을 작성하는 경우 공통적인 SELECT 문이 자주 출현하는데 이를 WITH 절에서 이름을 부여해 정의하고 UNION을 사용하는 쿼리문에서는 이름만 가져다 쓰면 쿼리문의 반복을 줄이고, 가독성이 좋아지고 복잡한 구문이 간결해집니다. 이 WITH 구문을 서브쿼리 팩토링이라고 하며 SQL-99 표준의 일부로서 오라클 9.2 버전에서 추가됐습니다. 인라인뷰로 처리되거나 임시 테이블로 해석됩니다.

 

이름이 너무 많아서 다 외우기 힘들죠? 이제부터 하나하나 상세히 알아봅시다. 그 과정에서 개념과 사용법을 익히면 자연스럽게 알게 되니까, 지금 당장 외우려 하지 않아도 됩니다.

 

 

#오라클 #서브쿼리 #SQL #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...