数据库--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 关系中相同的属性,在自然连接中只能出现一次。


 

猜你喜欢

转载自blog.csdn.net/WilliamChancwl/article/details/78368196