オラクルシリーズオクタル・ハイ・サブクエリ

サブクエリ

  • サブクエリ(内部クエリ)がメイン・クエリの実行前に実行されます
  • サブクエリを使用して、メインクエリ(外部クエリ)


複数列のサブクエリ

  • メインクエリとサブクエリは、比較するために複数の列を返します

2種類の複数列のクエリの比較:

  • 一対比較

問題:同じ141人のまたは174の従業員を持つクエリはmanager_idと他の従業員がEMPLOYEE_ID DEPARTMENT_ID、MANAGER_ID、DEPARTMENT_ID  

SELECT     EMPLOYEE_ID、MANAGER_ID、DEPARTMENT_ID
 FROM     従業員
   (MANAGER_ID、DEPARTMENT_ID)、IN SELECT MANAGER_ID、DEPARTMENT_ID
                        FROM    従業員
                          EMPLOYEE_ID 、IN141174 ))
      EMPLOYEE_ID ないで、IN141174); 



不対の比較

SELECT   EMPLOYEE_ID、MANAGER_ID、DEPARTMENT_ID
 FROM     従業員
    MANAGER_ID InをSELECTは、  MANAGER_ID
                    FROM     従業員
                    WHERE    EMPLOYEE_ID 、IN174141 ))
       DEPARTMENT_ID 、INSELECTは  DEPARTMENT_ID
                    FROM     従業員
                       EMPLOYEE_ID 、IN174141 ))?
そして    EMPLOYEE_ID ないで 、IN174141);




  • FROM句でサブクエリを使用します

質問:この部門の従業員、DEPARTMENT_ID、給与と平均給与の平均賃金よりも高いlast_nameの復帰
方法:

選択LAST_NAME、DEPARTMENT_ID、給与、選択 の平均(給与)からE3従業
 e1.department_id = e3.department_id
 によってavg_salary DEPARTMENT_ID)
 から従業員がE1
 ここで給料が> 選択の平均(給与)
           から従業員E2  
           ここ e1.department_id = e2.department_id
           によってDEPARTMENT_ID   
          );


方法2:

SELECT   a.last_name、a.salary、
        a.department_id、b.salavg
FROM     従業員、(SELECT    DEPARTMENT_ID、
                       AVG (給与)salavg
                       FROM      従業
                       GROUP  BYがB DEPARTMENT_ID)
    a.department_id = b.department_id
 AND      a.salary > b.salavg。



個別のサブクエリ式

単一の行サブクエリ式は行で唯一のサブクエリリターンします

  • Oracle8iは、次のような場合にのみ使用することができます

たとえば:
SELECT(FROMとWHERE句)のステートメント
リストにINSERT文をVALUES

  • 別のサブクエリ式でOracle9iは、次の場合に使用することができます。

DECODEとCASE
GROUP BY句を除くすべてでSELECT句

質問:EMPLOYEE_ID、LAST_NAME明示的および従業員の場所。従業員は1800 DEPARTMENT_IDと同じようLOCATION_ID DEPARTMENT_ID場合は、それらの中で、「カナダ」の場所は、残りは「USA」です。

選択する
    従業員ID、
    苗字、
        CASE
             DEPARTMENT_ID = SELECT
                    DEPARTMENT_ID
                から
                    部門
                
                    location_idの=  1800 THEN  ' カナダ' 
            ELSE  ' USA ' 
        END
    )の場所
FROM 
    従業員;


相関サブクエリ

  • 相関サブクエリは、メイン・クエリの各列がサブクエリ回行われ、行ごとの順序で実行しました

SELECT column1の、column2の、...
  FROM    TABLE1の   外側の
 WHERE   COLUMN1オペレータSELECT   colum1、COLUMN2
                        FROM     table2の
                           expr1の= 外側 .expr2)。 


質問:表がJOB_HISTORYテーブルをEMPLOYEE_ID従業員が2以上同じ番号をEMPLOYEE_ID場合は、これらの従業員の出力が同じid、LAST_NAMEとそのJOB_IDをEMPLOYEE_ID

SELECT e.employee_id、姓、e.job_id
 FROM    従業員E
 WHERE   2  <= SELECT  COUNT* FROM    JOB_HISTORY
              WHERE   EMPLOYEE_ID = e.employee_id)を、


使用演算子は、NOT EXISTS EXISTSと

  • 状態が連続して存在するか否かをオペレータのチェックをEXISTSサブクエリ
  • サブクエリで条件を満たすために行が存在する場合:

    -サブクエリで探し続けない
    -条件のリターンはTRUE

  • 行条件は、サブクエリに存在しない場合:

    -条件を返しますFALSE
    -サブクエリで検索し続けます

質問:EMPLOYEE_ID企業経営者のお問い合わせは、LAST_NAME、JOB_ID、DEPARTMENT_ID情報

SELECT EMPLOYEE_ID、LAST_NAME、JOB_ID、DEPARTMENT_ID
 FROM    従業外側
EXISTSSELECT ' X ' FROM    従業
                    MANAGER_ID = 外側 .employee_id)と、   
                 
                        

質問:クエリの部署テーブルは部署の表のDEPARTMENT_IDとDEPARTMENT_NAME従業員には存在しません。

SELECT DEPARTMENT_IDを、DEPARTMENT_NAME
 FROM 部門は、D
 WHERE  NOT  EXISTSSELECT  ' X ' 
                  FROM    従業員
                     DEPARTMENT_ID
                          = d.department_id)を、


関連の更新

UPDATE TABLE1のALIAS1の
 SETの    カラム =SELECT FROM    表2 alias2
                    ALIAS1。カラム=     
                        alias2。カラム 
  • 別のテーブル内のデータテーブル更新デー​​タに基づいて、相関サブクエリを使用して
ALTER  TABLEの従業員の
 ADD(DEPARTMENT_NAME VARCHAR214 ));

UPDATE 従業員の電子の
 SETの     DEPARTMENT_NAME = SELECT DEPARTMENT_NAME
            FROM    部門日間
            WHERE   e.department_id = d.department_id);


削除関連

DELETE  FROM TABLE1 ALIAS1
  WHERE   演算子SELECT FROM    表2 alias2
       WHERE   。ALIAS1 カラム =。alias2 カラム)。

テーブル内のデータに基づいて、別のテーブル内のデータを削除するには、相関サブクエリを使用し
、問題:従業員表、emp_historyを持つすべてのこれらのデータテーブルを削除します

DELETE  FROM 従業員E
 WHERE EMPLOYEE_ID = SELECTはEMPLOYEE_ID
             FROM    emp_history
               EMPLOYEE_ID = E.employee_id)。

WITH句の使用

  • WITH句を使用するには、SELECT文で書かれた文の同じブロックの重複を避けるために、
  • WITH句節は一度実行され、ユーザーの一時表領域のブロックに格納されています
  • WITH句を使用するには、クエリの効率を向上させることができます

質問:会社の様々な部門の合計給与を検索することも当社は情報部門のすべての部門の平均総賃金よりも大きく、

WITH  ?dept_costs   AS SELECT   d.department_name、SUM(e.salary)をAS dept_total
    FROM     従業員E、部門は、D
    WHERE    e.department_id = d.department_id
    GROUPを BY 、d.department_name)
avg_cost     AS SELECT  SUM(dept_total)/ COUNT*AS dept_avg
    FROM    dept_costs)
 SELECT  * 
FROM    dept_costs
   dept_total > SELECT dept_avg
          FROM avg_cost)
 ORDER BY DEPARTMENT_NAME。 



おすすめ

転載: www.cnblogs.com/loaderman/p/11834619.html