---------------------集合运算
SQL作用在关系上的union interset except运算对应于关系代数中的运算并 交和差,参加运算的关系必须相容,也就是说,他们必须含
有相同的属性集。1 union运算
为了找出在银行有帐户、有贷款或两者都有的所有客户,我们可以写查询语句:
(select customer_name
from depositor)
union
(select customer_name
from borrower)
//union运算自动去除重复,如果我们想保留重复,我们必须用Union all代替Union
(select customer_name
from depositor)
union all
(select customer_name
from borrower)
2 intersect运算
找出在银行同时有帐户和贷款的客户,我们可以写出:
(select customer_name
from depositor)
intersect
(select customer_name
from borrower)
intersect与Union运算一样,自动取出重复,如果想保留重复,必须用intersect all代替intersect
3 except运算
为了找出在银行中有帐户但是没有贷款的用户,可以写出:
(select customer_name
from depositor)
except
(select customer_name
from borrower)
-------------------------聚集函数
聚集函数是以值的一个集合(集或多重集)为输入,返回单个值的函数。SQL提供了5个内建的聚集函数:
平均值:avg
最小值:min
最大值:max
总和:sum
计数:count
sum与avg的输入必须是数字集,而其他运算符可作用在非数字数据类型,如字符串上。
示例:找出perryidge支行帐余额;平均值。我们书写该查询如下:
select avg(balance)
from account
where branch_nam='perryidge'
该查询的结果是只有一个属性的关系,其中只包含一行,这一行的数值对应perryridge支行的平均余额。可选的,我们可以用as子句给
结果关系中的属性赋予新的名字
有时候我们不仅希望将聚集函数作用在单个元组集上,而且也希望将其作用在一组元组集上;在sql中可用group by子句实现这个愿望。
group by子句中的一个或多个属性是用来构造分组的,在group by子句中的所有属性上具有相同值的元组将被分在一个组中。
示例:找出每个支行的平均帐户余额
select branch_name,avg(balance)
from account
group by branch_name
示例:找出每个支行储户数 //去除重复的储户
select branch_name,count(distinct customer_name)
from depositor,account
where depositor.account_number=account.account_number
group by branch_name
有时候,对分组限定条件比对元组限定条件更有用,例如我们也许只对帐户平均余额大雨1200美元的支行感兴趣。该条件并不是针对单
个元组,二十针对group by子句形成的分组。为表达这样的查询,我们使用sql的having子句。having子句中的谓词在形成分组后才起作
用,因此可以使用聚集函数。我们用sql表达该查询如下:
select branch_name,avg(balance)
from account
group by branch_name
having avg(balance)>1200
---------------------------空值null
sql允许使用null值表示关于某属性值的信息缺失,我们在谓词中使用特殊的关键字null测试空值,因而为找出loan关系中amount为空的
贷款号,可将语句写成:
select loan_number
from loan
where amount is null
谓词is not null 用来检测非空值
--------------------------嵌套子查询
找出银行中同时有帐户和贷款的客户
select distinct customer_name
from borrower
where customer_name in(select customer_name
from depositor)
集合的比较
SQL中<some,<=some,>some,>=some,=some,<>some表示集合间的比较
=some等价于in
也允许<all,<=all,>all,>=all
------------------------------------视图
任何不是逻辑模型的一部分但作为虚关系对用户可见的关系成为视图
create view v as <查询表达式>
直觉上,在任何给定的时刻,视图关系的元组集是该时刻视图定义中的查询表达式的计算结果,因此,如果一个视图关系被计算并存储
,一旦用于定义该视图的关系被修改,视图就会过期,为了避免这一点,视图一般这样实现:当我们定义一个视图时,数据库系统存储
视图的定义本身而不存储定义该视图的关系代数表达式的计算结果,一旦视图关系出现在查询中,它就被已存储的关系表达式代替。因
此,无论合适我们执行这个查询,视图关系都被重新计算。
-------------------------数据库的修改
到目前为止我们的注意力集中在从数据库中抽取信息上。下面我们将展示如何用sql语句增加、删除和修改信息
1 删除
删除请求的表达与查询非常类似,我们可以删除整个元组,但我们不能只删除某些属性的值,在SQL中,删除语句格式如下:
delete from r
where P
其中P是谓词,r代表一个关系。如果省略where子句,则r中所有的元组被删除
2 插入
insert into account
values()
3 更新 update
update account
set balance=balance*1.05
update account
set balance=case
when balance<=10000 then balance*1.05
else balance*1.06
end11:02 2009-2-18