サブクエリ
- サブクエリ(内部クエリ)がメイン・クエリの実行前に実行されます
- サブクエリを使用して、メインクエリ(外部クエリ)
複数列のサブクエリ
- メインクエリとサブクエリは、比較するために複数の列を返します
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 、IN(141、174 )) と EMPLOYEE_ID ないで、IN(141、174);
不対の比較
SELECT EMPLOYEE_ID、MANAGER_ID、DEPARTMENT_ID FROM 従業員 MANAGER_ID Inを ?(SELECTは、 MANAGER_ID FROM 従業員 WHERE EMPLOYEE_ID 、IN(174、141 )) と DEPARTMENT_ID 、IN ?(SELECTは DEPARTMENT_ID FROM 従業員 EMPLOYEE_ID 、IN(174、141 ))? そして EMPLOYEE_ID ないで 、IN(174、141);
- 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 従業外側 EXISTS(SELECT ' X ' FROM 従業 MANAGER_ID = 外側 .employee_id)と、
質問:クエリの部署テーブルは部署の表のDEPARTMENT_IDとDEPARTMENT_NAME従業員には存在しません。
SELECT DEPARTMENT_IDを、DEPARTMENT_NAME FROM 部門は、D WHERE NOT EXISTS(SELECT ' X ' FROM 従業員 DEPARTMENT_ID = d.department_id)を、
関連の更新
UPDATE TABLE1のALIAS1の SETの カラム =(SELECT 式 FROM 表2 alias2 ALIAS1。カラム= alias2。カラム)
- 別のテーブル内のデータテーブル更新データに基づいて、相関サブクエリを使用して
ALTER TABLEの従業員の ADD(DEPARTMENT_NAME VARCHAR2(14 )); 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。