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;