SQL Foundation(18-23)

5562 ワード

1:サブクエリ
  単一の行の検索用=
  複数行のサブクエリ用in(サブクエリの結果に相当するセット)
  サブクエリでは、サブクエリがnullである場合、返ってきた結果は、no rows selectが選択されていない行になります。
 ex:
最初のクエリが選択された行である理由は、サブクエリで得られた結果がnullであるため、
に相当する プロジェクト  ラスター.name,department_id from employees where department_id=null
だから、空のために、次のsqlの実行はこの道理を検証しました。
SQL> select last_name,department_id from employees
  2  where  department_id = (select department_id from employees where last_name
='Haas');

    

SQL> select department_id from employees where last_name='Haas';

    

SQL> select last_name,department_id from employees where department_id = null;

    

SQL> select last_name,department_id from employees where department_id is null;

LAST_NAME                 DEPARTMENT_ID
------------------------- -------------
Grant
2:anyとallの使い方
   1:any
         < any セットの最大値より小さい
         > any セットの最小値より大きい
         = any に相当する in
    2:all
        <  all. セットの最小値より小さい
        >   all. セットの最大値より大きい
ex:
SQL> select employee_id ,last_name ,job_id,salary from employees where  salary <
 any (select  salary from employees where job_id ='IT_PROG');
SQL> select job_id , salary from employees where job_id ='IT_PROG';

JOB_ID         SALARY
---------- ----------
IT_PROG          9000
IT_PROG          6000
IT_PROG          4800
IT_PROG          4800
IT_PROG          4200
だから最初のsqlは 
SQL>   select employee_id ,last_name,job_id ,salary from employees where  salary
 <9000;
select emp.last_name from employees emp
where  emp.employee_id not in (select mgr.manager_id from employees mgr)
not in       != all       。

select emp.last_name from employees emp
where emp.employee_id  in (select mgr.manager_id from employees mgr)

in     = any
3:unionとunion all、 インターレース
          1:union操作子は、2つの結果の異なる行を返します。   並べ替え(標準は第一列のASC順)
           2:union操作子は、2つの結果のすべての行(同じ行を含む)に戻ります。結果は並べ替えられません。
           3:インターレース  オペレータは、結果の同じ行を返します。共通点 結果のソート (デフォルトは第一列のASC順)
           4:minuxオペレータは、第一のクエリにのみ表示され、第二のクエリには存在しないデータを返します。
ex:
 列の数は同じです。同じ列のデータの種類があります。
関数と結果列数を一致させることができます。
SELECT location_id, department_name "Department", 
   TO_CHAR(NULL) "Warehouse"  FROM departments
   UNION
   SELECT location_id, TO_CHAR(NULL) "Department", warehouse_name 
   FROM warehouses;

LOCATION_ID Department            Warehouse
----------- --------------------- --------------------------
       1400 IT
       1400                       Southlake, Texas
       1500 Shipping
       1500                       San Francisco
       1600                       New Jersey
       1700 Accounting
       1700 Administration
       1700 Benefits
       1700 Construction
...
union all以外は自動的に並べ替えられ、1列目のデータの昇順で並べ替えられます。
ノート:
複合クエリでは、order byは一回だけ現れ、最後にしか現れません。oder byは1行目の列しか認識していません。2行目の列は分かりません。
ex:
SQL> select location_id ,department_name "DEP" , to_char(null) location
  2  from departments  union
  3  select location_id, to_char(null) "DEP", state_province "Location"
  4  from location  order by  state_province ;
from location  order by  state_province
                         *
  4      :
ORA-00904: "STATE_PROVINCE":      
以上のような書き方は間違いです。order byです。 知っているだけです
第一列の行は、第二列の行が分かりません。 locationでいいです
4:データを操作する
テーブルをコピー:
create table copy_departments as select*from departments;
一括挿入(values不要に注意)
ex:
insert into sales_reps(id,name,salary,commission_pct)
select  employee_id,last_name,salary,commission_pct
from employees where  job_id like '%REP%';
truncateとdeleteの違い:
truncateはDDL言語です。 rollbackはロールバックできません。これをコピーしてみます。
deleteはDML言語です ロックバックはロールバックできます。 直接に本当に削除します。
deleteは本当にundoテーブル空間に削除されていません。
クエリーができます。
5:データベースの事務
     :  
   1:commit , rollback        ,
   2 :A DDL    DCL       ,       ,  DDL  DCL        ,           。	 
   3:    SQLPLUS               exit  quit      ,  sqlplus    ,           ,     ,     。
   4:            。
事務のロールバックと保存点について:
 
SQL> delete from copy_departments where  department_id=270;

   0 。

SQL>  savepoint a;

      。

SQL>  insert into copy_departments values(280,'BBBBBB',NULL,NULL);

    1  。

SQL>
SQL>  savepoint b;

      。

SQL>
SQL>  update copy_departments set department_name  ='BBCCDD'  where department_i
d =280;

   2 。

SQL>
SQL>  rollback to b;

     。

SQL> commit;

    。

SQL> select * from copy_departments;
暗黙的に提出したいなら、直接提出してください。set atonが必要です。
通常はこのように開けません。
データは提出またはロールバック前の状態です。
データの整合性を維持するために:
データを挿入または削除する場合、複数のユーザが同時に操作します。
複数のセッションに相当します。データが提出されていない場合、
現在のユーザ操作のデータは他のユーザーには見えません。
現在のユーザがデータを提出した場合、他のユーザは修正データを見ることができます。
oracleには前の文の中に一つの暗黙的なsavepointがあります。もし失敗したらひっくり返します。
複数のステートメントの実行に失敗した場合は、このステートメントだけです。
ロールバックします。他のステートメントは正常に実行されます。
読む時は書くのを待つ必要はありません。
書くのも待つ必要はありません。
二つとも書いたら、最初の書くときはロックをかけて、提出してから、他のものが書けます。
FOR UPSDATEは探したデータをずっとロックします。当
comitやrollbackを実行した時にロックを開けます。
oracleがなぜロールバックして提出したのかについて、データを修正する時、先に修正する必要があるテーブルのバックアップを以下にして、そのまま既存の表で操作します。もしロールバックしたら、古い表を新しい表に差し替えます。commtなら、バックアップの表は削除できます。先ほど修正したデータが有効になりました。