oracle學習筆記之七 數據操作

 1.追加數據
  INSERT INTO table[(column[,column...])]
  VALUES      (value[,value...]);
  
  例1:INSERT INTO dept(deptno,dname,loc)
       VALUES      (50,'DEVELOPMENT','DETROIT');

  例2:INSERT INTO dept
       VALUES      (50,'DEVELOPMENT','DETROIT');
 
  例3:INSERT INTO dept(deptno,dname)
       VALUES      (50,'DEVELOPMENT');
 
1)插入含空值NULL的記錄
  -隱含法:在列名列表中忽略該列
  例:INSERT INTO dept(deptno,dname)
      VALUES      (60,'MIS');
 
  -顯示法:制定NULL關鍵字
  例:INSERT INTO dept
       VALUES      (50,'DEVELOPMENT',NULL);

2)插入特殊值
  -SYSDATE函數記錄當前日期和時間
  例:INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
      VALUES    (7196,'GREEN','SALESMAN',7782,SYSDATE,2000,NULL,10);

3)替代變量插入值
  例:INSERT INTO dept(deptno,dname,loc)
      VALUES     (&department_id,'&department_name','&location');

  結果:
        在要執行的腳本中輸入替換變量的值:

        變量                   值
        department_id:       80    
        department_name:     EDUCATION
        location:            ATLANTA

4)從另一個表複製數據
  INSER INTO table [ column(,column)]
  subquery;
 
  例:INSERT INTO test
      SELECT *
      FROM   dept
      WHERE  loc='NEW YORK';

2.修改表中的數據
  UPDATE table
  SET    column=value[,column=value]
  [WHERE condition];
 
  例1:使用WHERE子句制訂要更新的記錄
       UPDATE emp
       SET    deptno=20
       WHERE  empno=7782;
  例2:如果要更新所有記錄WHERE子句可以忽略
       UPDATE employee
       SET    deptno=20;
  例3:用編號爲7499僱員的工作名稱及部門編號更新編號爲7698僱員相對應的信息
  方法一:
          UPDATE emp
          SET    (job,deptno)=
                               (SELECT job,deptno
                                FROM   emp
                                WHERE  empno=7499)
          WHERE   empno=7698;
  方法二:
   
          UPDATE emp
          SET    deptno=
                         (SELECT deptno
                          FROM   emp
                          WHERE  empno=7499)
                  job   =
                         (SELECT job
                          FROM   emp
                          WHERE  empno=7499)
          WHERE   empno=7698;

3.刪除表中記錄
  DELETE [FROM] table_name
  [WHERE        condition];

  例1:在WHERE子句中指定哪些記錄要被刪除

       DELETE FROM emp
       WHERE  job='CLERK';

  例2:如果省略WHERE子句,表中所有記錄將被刪除
       DELETE FROM emp;

  例3:在DELETE語句中使用子查詢可以居於另一個表刪除本表記錄
       DELETE FROM emp
       WHERE       deptno=
                          (SELECT deptno
                           FROM   dept
                           WHERE  dname='NEW YORK');

  例4:刪除記錄時的完整性約束錯誤
       DELETE FROM  dept 
       WHERE        deptno=10;
  結果:
        DELETE FROM  dept
        *

        ERROR 位於第 1 行:
        ORA-02292: 違反完整約束條件 (SCOTT.FK_DEPTNO) - 已找到子記錄日誌

4.合併語句
  -根據條件對錶進行數據更新或插入操作
  -如果行存在,進行更新;如果是新行,進行插入操作
  MERGE INTO table_name table_alias
    USING    (talble|view|sub_query) alias
    ON       (join condition)
    WHEN  MATCHED THEN
      UPDATE SET
        col1=col1_val,
        col2=col2_val
    WHEN NOT MATCHED THEN
      INSERT (column_list)
      VALUES (column_values)

  例:
     MERGE INTO copy_dept c
       USING dept e
       ON    (c.deptno=e.deptno)
       WHEN MATCHED THEN
         UPDATE SET
           c.dname=e.dname,
           c.loc  =e.loc
       WHEN NOT MATCHED THEN
         INSERT VALUES(e.deptno,e.dname,e.loc);

5.數據庫事務
  -開始於第一條可執行的SQL語句的執行
  -在下列情況下結束:
      -COMMIT或ROLLBACK
      -DDL或DCL語句被執行
      -用戶退出
      -系統崩潰
1)COMMIT和ROLLBACK優點
  -確保數據的一致性
  -產生永久性變化之前可以預覽數據的變化
  -聚合一系列邏輯相關的操作

2)隱含的事務處理
  -下列情況下會自動提交:
      -執行DDL語句
      -執行DCL語句
      -正常退出SQL*PLUS,並且沒有明確的執行COMMIT或ROLLBACK
      -在遇到SQL*PLUS異常結束或系統故障都會自動回滾

3)執行COMMIT或ROLLBACK前的數據狀態
  -數據變化前的狀態是可以被恢復的
  -當前用戶可以是使用SELECT語句來驗證DML操作後的結果
  -其他用戶不能查看由當前用戶的DML操作結果
  -受影響記錄被鎖定,也就是其他用戶不能改變受影響記錄中的數據

4)執行COMMIT後的狀態
  -在數據庫中數據變化成爲永久性的
  -先前的數據狀態永久性的消失
  -所有用戶都可以查詢提交後的結果
  -鎖定的記錄被釋放,可以有效地被其他用戶操作
  -所有的存儲節點被清除
 
  例:提交數據
     -產生數據變化
       UPDATE emp
       SET    deptno=10
       WHERE  empno=7782;
     -提交數據變化
       COMMIT;

5)回滾到某個標記狀態
  -在當前事務中使用SAVEPOINT語句創建一個標記狀態
  -使用ROLLBACK TO SAVEPOINT語句回滾到制定的標記狀態
 
  例:SQL>UPDATE...
      SQL>SAVAPOINT update_done;
      Savepoint created.
      SQL>INSERT...
      SQL>ROLLBACK TO update_done;
      Rollback complete.

6)語句級回滾
  -如果一個DML語句在執行過程中出錯,那麼僅僅是這條語句中的操作被回滾
  -Oracle服務器完成一個隱含的保存節點操作
  -所有其他變化仍然保留
  -用戶應該是喲個COMMIT或ROLLBACK語句明確的終止該事務

7)讀取的一致性
  -讀取的一致性可以保證任何時候數據查詢的一致
  -一個用戶所產生的數據變化不會和另一個用戶所產生的數據變化相沖突
  -確保對於同一數據:
     -讀取者不用等待寫入者
     -寫入者不用等待讀取者

6.鎖定
  -鎖定是一種用於防止多個事務同事訪問相同資源而產生的破壞性交互作用的機制
  -Oracle鎖定
     -阻止併發事務之間產生的破壞性交互作用
     -不需要用戶干預
     -自動使用最低級別限制
     -鎖定時間和事務持續時間相同
  -有兩種基本模式
     -排它(行級鎖)
     -共享(表級鎖)

   
練習
1.將以下信息添加到emp表中:
   empno  ename   job      mgr   hiredate    sal   comm deptno
   10     Mirror  manager  7839  1980-12-10   3000         20

   INSERT INTO emp
   VALUES      (10,'Mirror','manager',7839,
               TO_DATE('1980-12-10','yyyy-mm-dd'),3000,NULL,20)

 

2.將以下信息添加到dept表中:

   deptno    dname    loc
   50        LEADER   shenyang
  
   INSERT INTO dept
   VALUES      (50,'LEADER','shenyang');

3.更新僱員編號爲10的僱員薪水爲3500,僱傭日期爲1979-5-1
 
   UPDATE emp
   SET    sal=3500
   WHERE  empno=10;

4.更新dept表部門編號爲50的地址爲beijing

   UPDATE dept
   SET    loc='beijing'
   WHERE  deptno=50;
  

6.用編號爲7900的僱員性誰更新編號爲10的僱員的薪水
 
   UPDATE emp
   SET    sal=
              (SELECT sal
               FROM   emp
               WHERE  empno=7900)
   WHERE  empno=10;

7.刪除工作地點在北京的僱員

   DELETE
   FROM  dept
   WHERE deptno=
                 (SELECT deptno
                  FROM   dept
                  WHERE  loc='beijing');

8.刪除部門編號爲50的部門信息
  
    DELETE
    FROM   dept
    WHERE  deptno=50;

9.將以下信息添加到emp表中:
   empno  ename   job      mgr   hiredate    sal     comm deptno
   10     Mirror  MANAGER  7839  1980-12-10  3000.00         20

   INSERT INTO emp
   VALUES      (10,'Mirror','MANAGER',7839,
               TO_DATE('1980-12-10','yyyy-mm-dd'),3000.00,NULL,20);
  

10.提交所做的改變

   COMMIT;

11.將以下信息添加到emp表中
   empno  ename   job      mgr   hiredate    sal     comm deptno
   11     Word    CLERK    7782  2001-01-12  1500.00         30

   INSERT INTO emp
   VALUES      (11,'Word','MANAGER',7782,
               TO_DATE('2001-01-12','yyyy-mm-dd'),1500.00,NULL,30);

12.設置savepoint mark1

   SAVEPOINT mark1;

13.改變empno爲10的job值,由manager改爲clerk,薪水由3000.00改爲1500.00

   UPDATE emp
   SET    job='CLERK',sal=1500.00
   WHERE  empno=10;

14.設置savepoint mark2

   SAVEPOINT mark2;

15.刪除薪水低於1000元的所有員工信息

   DELETE
   FROM   emp
   WHREE  sal<1000;

16.回退到savepoint mark2

   ROLLBACK TO mark2;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章