1. 程式人生 > >資料庫--SQL語句總結

資料庫--SQL語句總結

SQL語句總結

如何用SQL語句新增,刪除和修改資訊

1.刪除

刪除請求的表達和查詢非常類似,我們可以刪除整個元組,但不能只刪除某個屬性上的值.刪除語句是: delete from r; where P; r代表一個關係,p代表一個謂詞,delete語句首先從r 中找出所有使p(t)為真的元祖t,然後把它們從r中刪除.如果省略where子句,則r中所有元祖被刪除.delete命令只對一個關係起作用,如果我們想從多個關係中刪除元祖,我們就必須為每個關係寫一條delete命令.

/*刪除Perryridge支行的所有賬戶*/
delete from account
where branch_name = 'Perryridge'

/*刪除所有數額在1300美元到1500美元之間的貸款*/
delete from loan
where amount between 1300 and 1500

/*刪除所有位於Brooklyn的支行的所有賬戶*/
delete from account
where branch_name in (select branch_name
					  from branch_name
					  where branch_city = 'Brooklyn')

雖然我們一次只能從一個關係中刪除元祖,但是可以通過在delete語句的where子句中巢狀select - from - where語句,從而可以引用任意數目的關係.

2.增加

最簡單的insert語句是插入一個元組的語句.SQL允許在insert語句中指定屬性.

/*在Perryridge支行中插入一個元組*/
insert into account
	values('A-9732','Perryridge',1200)

/*指定屬性插入*/
insert into account(account_number, branch_name, balance)
	values('A-9732', 'Perryridge',1200)
/*或者*/
insert into account(branch_name, account_number, balance)
	values('Perryridge', 'A-9732' 1200)

更通常的情況是,在查詢結果的基礎上執行插入.假設Perryridge支行想給每個在改行貸款的客戶一個動物,對應這些客戶的每筆貸款贈送一個200美元的新貸款賬戶,並以貸款號作為新貸款賬戶的賬號.可寫為:

/*用select語句選取若干個元組,這條select語句先執行*/
insert into account
	select loan_number, branch_name, 200
	from loan
	where branch_name = 'Perryridge'

/*向depositor關係中新增元組*/
insert into depositor
	select customer_name, loan_number
	from borrower, loan
	where borrower.loan_number = loan.loan_number and
		  branch_name = 'Perryridge'

3.更新

我們使用update語句,與使用insert,delete語句類似。待更新的元組可以用查詢語句找到。

 

/*銀行將所有存款餘額增加5%*/
update account
set balance = balance * 1.05

/*對所有存款大於平均數的賬戶付5%的利息。*/
update account
set balance = balance * 1.05
where balance >= 1000

/*SQL提供case結構*/
update account
set balance = case
				when balance <= 10000 then balance * 1.05
				else balance
			  end

 

4.檢視的更新

檢視是一個有用的工具,但如果表達更新,插入或刪除,它們可能帶來嚴重的問題。困難在於,用視圖表達的資料庫修改必須被翻譯為對資料庫邏輯模型中實際關係的修改。

/*loan_branch是給該職員的檢視*/
create view loan_branch as
select loan_number, branch_name
from loan

允許檢視名出現在任何關係允許出現的地方,該職員可以這樣寫出:

insert into loan_number
	values('L-37', 'Perryridge')

當然上面的插入操作必須被描述為對關係loan的一次插入,但是要向loan中插入一條元組,我們必須給出amount值。由於上述會出現一些的少數情況外,一般是不允許對檢視進行修改。不同的資料庫系統對於在檢視關係上執行更新操作指定不同條件。一般來說,如果下面的條件符合,則可以稱檢視是可更新的(即檢視上可以執行插入,更新和刪除操作):

* from子句中只有一個數據庫關係

*select子句中包含關係的屬性名,不包含任何表示式、聚集或distinct宣告

*任何沒有出現在select子句中的屬性可以取空值。

* 查詢中不含有group by子句和having子句

在這些限制下,我們對前面示例中定義的檢視all_customer的update, insert和delete操作將被禁止

/*該檢視是可更新的*/
create view downtown as
select account_number, branch_name, balance
from account
where branch_name = 'Downtown'

5.事務

事務由查詢和(或)更新語句序列組成。SQL標準規定當一個SQL語句被執行,就隱含地開始一個事務。下列語句之一結束事務:

*commit work:提交當前事務,也就是將該事務所做的更新在資料庫中持久儲存,事務被提交後,一個新的事務自動開始。

*rollback work:回滾當前事務,即:撤銷該事務中所有SQLy語句對資料庫的更新。資料庫被恢復到執行第一條語句之前的狀態。

在事務執行過程中檢測到錯誤時,事務回滾是很有用的,在某種意義上,事務提交就像對編輯過的文件存檔,而事務回滾就像不存檔退出。一旦某個事務執行了commit work,那麼它的影響就不能用rollback work撤銷了。資料庫系統保證在出現某些故障的情況下,例如某個SQL語句錯誤,斷電,系統崩潰等。如果一個事務還沒有完成commit work,其影響都可以被回滾。在斷電和系統崩潰的情況下,回滾會在系統重啟後執行。

 

6.連線關係

左外連線: loan left outer join borrower on loan.loan_number = borrower.loan_number

首先計算內連線的結果,然後對左邊關係loan中的內連線時與右邊關係borrower中的任何元組都不匹配的元組t,向結果中加入一個元組r.r的左邊關係得到的屬性值被賦為t中的值,而其他屬性被賦為空

 

右外連線:loan right outer join borrower on loan.loan_number = borrower.loan_number

右側關係不匹配左側關係任何元組先補上空值,然後加入到有外連線的結果中

 

全外連線:(full outer join)左外連線和右外連線的組合,在內連線的結果被計算出來之後,左側關係中不匹配右側關係任何元組的元組被添上空值並加到關係中。同樣,右側關係中不匹配左側關係任何元組也被添上空值並加到結果關係中

 

內連線:loan inner join borrower on loan.loan_number = borrower.loan_number 所得結果的屬性由左側關係的屬性後跟右側關係的屬性構成

 

自然連線:loan natural inner join borrower 關係中相同的屬性,在自然連線中只能出現一次。