oracle DML語句


DML語句

1、  插入數據

創建一個新表

create table new_cust as select * from customers

 

--使用insert語句添加行

/*

確定要插入的行所在的表

確定要插入哪些列,沒有表示所有列

確定要插入的列的值列表

*/

1、插入時注意,主鍵約束和not null約束,外鍵約束

insert into customers(customers.customer_id,first_name,last_name,dob,phone) values

(8,'tang','long',date '1970-09-09','12345678');

 

 

INSERT INTO customers

  (customer_id, first_name, last_name, dob, phone)

VALUES

  (6, 'Fred', 'Brown', to_date('1970-1-1','yyyy-mm-dd'), '800-555-1215');

 

SELECT * FROM customers;

 

 

Not null約束

INSERT INTO customers

  (customer_id, first_name, last_name, dob, phone)

VALUES

  (7, '', 'Brown', to_date('1970-1-1','yyyy-mm-dd'), '800-555-1215');

SELECT * FROM customers;

 

2、忽略列的列表

--當為所有的列都提供值時可以忽略列的列表

--指定的值順序必須與describe命名輸出結果中顯示的列順序一致

INSERT INTO customers

VALUES

  (7, 'Jane', 'Green', DATE '1970-1-1', '800-555-1216');

 

select * from customers

 

3、為列指定空值

INSERT INTO customers

VALUES

  (8, 'Sophie', 'White', NULL, NULL);

 

4、插入默認值

INSERT  INTO  order_status(Order_Status_Id)

VALUES(3);

SELECT * FROM order_status;

 

5、在列值中使用單引號和雙引號

INSERT INTO customers

VALUES(11, 'Kyle', 'O''Malley', '', NULL);

 

SELECT * FROM customers;

 

INSERT INTO products

  (product_id, product_type_id, name, description, price)

VALUES(13, 1, 'The "Greate" Gatsby', NULL, 12.99);

6、處理&

INSERT INTO products

  (product_id, product_type_id, name, description, price)

VALUES

  (14, 1, 'The "Greate" &&Gatsby', NULL, 12.99);

 

SELECT * FROM products;

7、從一個表向另外一個表復制行

select * from customers;

 

create table new_table as select * from customers;

 

delete from new_table;

 

select * from new_table;

 

insert into new_table select * from  customers;

 

 

INSERT INTO customers

  (customer_id, first_name, last_name)

  SELECT 13, first_name, last_name FROM customers WHERE customer_id = 1;

 

SELECT * FROM customers;

8、主鍵沖突

--主鍵沖突

INSERT INTO customers

  (customer_id, first_name, last_name, dob, phone)

VALUES

  (1, 'Fred', 'Brown', DATE '1970-1-1', '800-555-1215');

 

--not null約束

INSERT INTO customers

  (customer_id, first_name, last_name, dob, phone)

VALUES

  ('23', 'a', null, DATE '1970-1-1', '800-555-1215');

9、外鍵約束

SELECT * FROM products;

SELECT * FROM product_types;

 

INSERT INTO products

  (product_id, product_type_id, NAME, description, price)

VALUES

  (13, 6, 'Nike', 'US', 88.99);

 

10、替換變量

INSERT INTO products

  (product_id, product_type_id, NAME, description, price)

VALUES

  (&pid, &type_id, '&name', 'US', 88.99);

 

  select * from products

2、修改數據

--使用update語句修改行

/*

確定要修改的行所在的表

確定要修改哪些列及新的列值

確定要修改那些行where

*/

SELECT last_name

FROM  customers

WHERE customer_id = 2;

 

UPDATE customers

SET last_name = 'Red'

WHERE customer_id = 2;

 

select * from customers

 

--對多列進行更新

SELECT price,NAME

FROM products

WHERE price >= 10;

 

UPDATE products

   SET price = price * 1.2, NAME = lower(NAME)

 WHERE price >= 10;

 

--主鍵可以更新

UPDATE products SET product_id = 13 WHERE NAME = 'My Front Line';

 

select * from products where NAME = 'My Front Line';

 

修改雇員id為1的員工的薪水等於雇員id為2的薪水

update employees e set e.salary = (select t.salary from employees t where t.employee_id =2) where e.employee_id =1

 

3、刪除數據

--使用delete語句刪除行

DELETE FROM products WHERE product_id = 12;

 

--外鍵約束

 

DELETE FROM customers

WHERE customer_id = 1;

 

可以刪除

DELETE FROM customers

WHERE customer_id = 5;

 

 

select * from purchases

                       

 

 

 

數據

 

  select * from all_sales

 

  delete from all_sales

 

  rollback

 

4、事務與鎖

事務與鎖是兩個聯系非常緊密的概念,它們保證了數據庫的一致性。由於數據庫是一個可以由多個用戶共享的資源,因此當多個用戶並發地存取數據時,就要保證數據的准確性。事務與鎖就是來完成這個功能的。

事務在數據庫中主要用於保證數據的一致性,防止出現錯誤數據。

在事務內的語句被作為一個整體,一個失敗,全部失敗。

 

事務在沒有提交前可以回滾,一旦事務提交就不能再撤銷。

 

什么是事務

事務就是一組包含一條或多條語句的邏輯單元,每個事務都是一個原子單位。

 

 

--數據庫事務

--就是一組SQL語句,這組SQL語句是一個邏輯工作單元。

 

--事務的提交和回滾

 

Commit  永久性修改,提交事務

Rollback  把操作還原,回滾事務

 

 

 

INSERT INTO customers

VALUES

  (6, 'Fred', 'Green', DATE '1970-1-1', '800-555-1215');

 

COMMIT;

 

UPDATE customers SET first_name = 'Edward' WHERE customer_id = 1;

 

ROLLBACK;

 

--事務的開始和結束

--事務開始

1)連接到數據庫,並執行一條DML語句

2)前一個事務結束后,又輸入了另外一條DML語句

--事務結束

1)執行commit或rollback語句

2)執行一條DDL語句,會自動執行commit語句

3)執行一條DCL語句,如grant語句,會自動執行commit語句。

4)斷開與數據庫的連接。會根據是否正常推出commit或rollback

5)執行了一條DML語句,該語句失敗了,會rollback

 

--保存點

--在事務的任何點都能夠設置一個保存點,這樣可以將修改回滾到保存點處。

select * from products

 

UPDATE products

SET price = price * 1.20

WHERE product_id = 1;

 

SAVEPOINT save1;

 

UPDATE products

SET price = price * 1.30

WHERE product_id = 2;

 

SELECT product_id,price

FROM products

WHERE product_id IN (1,2);

 

ROLLBACK TO SAVEPOINT save1;

 

SELECT product_id,price

FROM products

WHERE product_id IN (1,2);

 

 

--事務的ACID特性

/*

原子性(atomicity)事務必須成組地提交或回滾

一致性(consistency)事務必須確保數據庫的狀態一致,事務開始時,數據庫的狀態是一致的,結束時,狀態也必須是一致的

隔離性(isolation)多個事務可以獨立運行,而彼此之間不會產生影響

持久性(durability)一旦事務被提交之后,數據庫的變化就會永久保留下來

*/

 

--並發事務

--多個用戶同時對數據庫進行交互,每個用戶都可以同時運行自己的事務。

---------T1---------------------------------------T2----------------------

SELECT * FROM customers;                  SELECT * FROM customers;

--------------------------------------------------------------------------

INSERT INTO customers(

customer_id,first_name,last_name)

VALUES('7','John','Price');

--------------------------------------------------------------------------

UPDATE customers

SET last_name = 'Orange'

WHERE customer_id = 2;

--------------------------------------------------------------------------

SELECT * FROM customers;                  SELECT * FROM customers;

--------------------------------------------------------------------------

返回結果集中包含新插入的行和修改的行。    返回結果集中不包含事務T1所插入的

                                          行和修改后的結果。結果集還是原來的

--------------------------------------------------------------------------

COMMIT;

--------------------------------------------------------------------------

                                          SELECT * FROM customers;

--------------------------------------------------------------------------

                                          返回結果集中包含事務T1所插入的

                                          行和修改后的結果

 

 

數據庫是一個龐大的多用戶數據管理系統,在多用戶的系統中,在同一時刻多個用戶同時操作某相同資源的情況,時常發生。

利用鎖可以消除多用戶操作同一資源時可能出現的隱患。

 

排他鎖:也叫寫鎖。事務對數據加了排他鎖,那么其他事務將不能對該事務加任何鎖,不能讀取與訪問。

共享鎖:也叫讀鎖。該鎖模式下的數據只能被讀取。一個事務被加了共享鎖后,其他事務不能再加排他鎖,可以加共享鎖。

 

鎖是實現並發的主要手段,當事務提交后,會自動釋放鎖。

 

鎖等待與死鎖

 

鎖等待的演示:

打開兩個sql*plus窗口,分別對同一個表中的同一條記錄進行操作,會出現鎖等待。

第一個窗口執行

update customers c set c.first_name ='aaaa' where c.customer_id =6;

 

第二個窗口執行

update customers c set c.first_name ='bbbb' where c.customer_id =6;

會出現等待現象

只有第一個窗口commit;提交后,第二個窗口才行執行下去。

 

死鎖:

死鎖是鎖等待的特例,通常發生在多個會話之間。

 

假設事務1要修改2個資源對象A,B

事務2也需要修改2個資源對象A,B

 

當事務1修改A時,鎖定A,修改后,等待着修改B,同時修改A,B后,然后才提交事務。

 

事務2修改了B,等待修改A,這時A被事務1鎖定。

 

最后出現了事務1等待事務2釋放資源。事務2等待事務1釋放資源,出現死鎖的現象。

 

 

示例

事務1需要修改

update customers c set c.first_name ='tom' where c.customer_id =8;

update customers c set c.first_name ='john' where c.customer_id =9;

 

事務2需要修改

update customers c set c.first_name ='zhansan' where c.customer_id =8;

update customers c set c.first_name ='lisi' where c.customer_id =9;

 

 

步驟1:在第一個窗口執行

update customers c set c.first_name ='tom' where c.customer_id =8;

 

步驟2:在第二個窗口執行

update customers c set c.first_name ='lisi' where c.customer_id =9;

 

步驟3:在第一個窗口執行

update customers c set c.first_name ='john' where c.customer_id =9;

 

步驟4:在第二個窗口執行

update customers c set c.first_name ='zhansan' where c.customer_id =8;

 

 

 

會出現死鎖的情況。

Oracle會自動檢測死鎖的情況,釋放一個沖突鎖,並把消息傳遞給對方事務。此時在第一個回話窗口中會出現下面的信息。

 

 

 

Oracle自動做出處理后,並重新回到鎖等待的情況。

出現鎖等待的情況,要盡快找出原因並進行處理,以免影響數據庫性能。

 

 

 

--在命令行里導出用戶的數據

exp  store/store@yd file =d:/back/store_back.dmp  owner =store log =d:/back/store_exp.log

---刪除用戶  

drop user store cascade;

--把我們備份的數據,再導入某個用戶下面去

CREATE USER store2 identified  by store2;

GRANT connect, resource, dba TO store2;

--imp store/store@yd file =d:\back\store_back.dmp fromuser =store touser=store

--從一個用戶里去導入到另一個用戶里面去

 

imp system/123@yd file =d:\back\store_back.dmp fromuser =store touser=store2

CREATE USER store2 identified  by store2;

GRANT connect, resource, dba TO store2;

---往新用戶導入部分表

imp system/123@yd file =d:\back\store_back.dmp fromuser =store touser=store2 

tables = employees, employees2, products, divisions, jobs, product_types

---導出部分表的命令

exp store/store@yd file =d:/back/table/store_back.dmp

tables= employees,employees2,customers  log =d:/back/table/store_exp.log

---導入部分表

imp store2/store2@yd tables= employees,employees2,customers  rows=y

file =d:/back/table/store_back.dmp

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM