Oracleサブクエリ


サブクエリとは

  • 一般クエリー(プライマリ・クエリー、プライマリ・クエリー)の別のクエリー
    ->サブクエリ
  • サブクエリは、
  • をかっこで示すSELECT文です.
  • プライマリ・クエリに基づく複数のサブクエリ
  • サブクエリのタイプ

  • サブクエリによる場所
    1)Selectセクションにある:スカラー量子クエリー
    2)Fromセクション内:行内ビュー
    3)Whereセクション:ネストされたサブクエリ
  • 1.スカラー量子クエリー-selectセクション

  • は、メインクエリの選択部
  • に位置する.
  • selectセクションにあり、カラムまたは式のように使用されます.
  • 通常、
  • サブクエリの別名を指定します.
    ->列として
  • サブクエリが最終的に返す小数と列数は、1つの
  • です.
  • サブクエリでは、通常、プライマリ・クエリにチェックインします(チェックインしない場合、複数のクエリがある可能性があります).
  • 結合と比較して、スケール量子クエリの性能は
  • に劣る.
    したがって、
  • を過度に使用しないでください.
  • 他のテーブルの値を取得する際に使用する方法は、結合およびスカラー量子クエリ
  • である.
  • Examples
  • -- example #1
    # 부서명 가져오기
      SELECT a.employee_id
              , a.first_name || ' ' || a.last_name
              , a.department_id
              ,(SELECT b.department_name # 컬럼 1개만 가져올 수 있음 or 문자열 연결 연산자로 결합되어 최종 반환값 1개가 되게 한다.
              FROM departments b 
              WHERE a.department_id = b.department_id) as dept_name
      FROM employees a 
      ORDER BY 1 ;

    説明:従業員178->結合で欠落していますが、サブクエリでクエリー
    -- example #2
    # 부서명, 나라이름 가져오기
    SELECT a.employee_id
            , a.first_name || ' ' || a.last_name
            , a.department_id
            ,(SELECT b.department_name
             FROM departments b 
             WHERE a.department_id = b.department_id) as dept_name -- 부서명
             ,(SELECT d.country_name
        	FROM departments b
            , locations c 
            , countries d
            WHERE a.department_id = b.department_id 
            AND b.location_id = c.location_id
            AND c.country_id = d.country_id) as country_name -- 나라이름
    FROM employees a 
    ORDER BY 1 ;

    2.オンラインビュー-Fromセクション

  • プライマリ・クエリーのfromセクション.
  • にあります.
  • はテーブルのようなもので、動作
  • サブクエリは、最終的に返される小数と列で、式の数は
  • を超えることができます.
  • サブクエリの別名(Alias)には、
  • と明記する必要があります.
  • プライマリ・クエリーと結合条件は、通常、プライマリ・クエリーのWHERE(join~on)セクションで処理されます.

    インラインビューが必要な理由

  • は、単一の既存のテーブルのみを読み込むために必要な情報を得ることが困難である.
    はい、
  • (特定の条件で統計)が必要です.
  • 行内ビューのクエリは、しばしば、複数のテーブルの結合によって
  • を取得する.
  • の複雑なクエリーの場合、
  • はより直感的なクエリーの作成を提供します.
    Examples
    # 1. 부서별 평균 급여를 서브쿼리에서 구한 뒤
    # 2. 사원급여와 부서 평균 급여를 같이 조회
    SELECT a.department_id
    	, a.employee_id
    	, a.first_name || ' ' || a.last_name as emp_name
        , a.salary
        , b.avg_salary
    FROM employees a 
    JOIN (SELECT department_id
    			, avg(salary) as avg_salary)
         FROM employees 
         GROUP BY department_id) b 
      ON a.department_id = b.department_id
    ORDER BY 1;

    3.ネストされたクエリー-Whereセクション

  • は、プライマリ・クエリのWHEREセクションにあります.
  • サブクエリは、条件部分として
  • を使用する.
    最終的な戻り値
  • のサブクエリをプライマリ・クエリ・テーブルの特定のカラム値と比較するときに使用する
  • サブクエリは、最終的に返される小数と列で、式の数は
  • を超えることができます.
  • の条件セクションの一部であるため、サブクエリの別名
  • は使用できません.
  • サブクエリ内のプライマリクエリと結合
  • Examples
    -- example #1
    # 1. employees 테이블에 있는 department_id 조회
    # 2. departments 테이블에서 이 서브쿼리에서 반환하는 값이 포함되는 건만 조회 
    
    SELECT *
    FROM departments
    WHERE department_id in (SELECT departmnet_id FROM employees);
    -- example #2
    # 1. job_id, salary 두 값을 동시에 비교
    # 2. job_id별 최소 급여를 받는 사원이 조회됨
    
    SELECT employee_id 
    	, first_name || ' ' || last_name as emp_name
        , job_id
        , salary
    WHERE (job_id,salary) IN (SELECT job_id, min_salary FROM jobs)
    ORDER BY 1;
    -- example #3
    # 1. employees 테이블에서 자신이 속한 부서의 평균 급여보다 많이 받는 사원 조회
    
    SELECT employee_id
    	, department_id
    	, first_name || ' ' || last_name as emp_name
        , salary
    FROM employees a 
    WHERE salary > (SELECT AGV(salary) as avg_salary 
    				FROM employees b
                    WHERE a.department_id = b.department_id) -- 조인에 의해 group by 효과가 나타남

    4.Withセクション

  • サブクエリの一種(インラインサブクエリ)
  • 別のサブクエリは、再利用可能な構文
  • を参照する.
  • 毒性好
  • WITH節内部使用TEMP表空間
    ->TEMP表領域各サブクエリの結果を含む
  • WITHを使いすぎると、TEMPの表領域を占有し、性能がよくない
  • 典型的にはサブクエリが使用され、サブクエリが容易に使用されない場合はWITHセクション
  • が使用されます.

    セクション

    -- with 별칭 as 다음에 서브쿼리 형태
    WITH -- with는 한번만 명시, 서브쿼리는 여러 개 사용 가능
    temp1 as (
    SELECT a.department_id, a.department_name
        , b.location_id, b.street_address, b.city, b.country_id
    FROM departments a 
    JOIN locations b
      on a.location_id = b.location_id
    ),
    temp2 as (
    SELECT b.department_id, b.department_name, b.street_address, b.city
    	, a.country_name 
    FROM countries a 
    JOIN temp1 b -- 서브쿼리 내에서 다른 서브쿼리 참조 가능
      on a.country_id = b.country_id
    )
    -- 메인 쿼리 
    SELECT a.employee_id
    	, a.first_name || ' ' || a.last_name as emp_name
        , b.department_name
        , b.street_address
        , b.country_name 
    FROM employees a 
    JOIN temp2 b -- 메인 쿼리에서는 여러개의 서브쿼리 조인해 결과 조회 가능 
      on a.department_id = b.department_id
    ORDER BY 1;