数据查询详解之软考难点剖析[3]

数据库系统工程师 责任编辑:hhthhhy 2008-05-09

添加老师微信

备考咨询

加我微信

摘要:having子句主要是针对分组进行条件限制。having子句中的谓词只有在形成分组后才起作用,因此可以在having子句中使用聚集函数。通常,having子句只用在有groupby子句的SQL语句中,用来去掉不符合指定条件(即having子句中的谓词)的分组。例如:selectbranch-name,sum(balance)asSummaryfromaccountgroupbybranch-name

having子句主要是针对分组进行条件限制。having子句中的谓词只有在形成分组后才起作用,因此可以在having子句中使用聚集函数。通常,having子句只用在有group by子句的SQL语句中,用来去掉不符合指定条件(即having子句中的谓词)的分组。例如:

select branch-name, sum(balance) as Summary

from account

group by branch-name

having avg(balance) > 1200

如果在同一个查询中同时存在where子句和having子句,那么首先应该用where子句中的谓词进行选择;满足where谓词的元组通过group by子句形成分组;然后在每个分组上使用having子句,不符合having谓词的分组将被抛弃掉!例如,找出居住在Harrison市且在银行中至少有三个帐户的客户的平均余额:

select d.customer-name, avg(balance) as Average-Balance

from depositor d, account a, customer c

where d.account-number = a.account-number and

d.customer-name = c.customer-name and

customer-city = "Harrison"

group by d.customer-name

having count(distinct d.account-number) >= 3

五.嵌套查询

SQL提供了嵌套子查询的机制,子查询是嵌套在另一个查询中的select-from-where表达式。使用子查询的目的是为了:

⑴集合成员资格的确认;

⑵集合的比较;

⑶集合基数的测试。

连接词in和not in用来判断一个元素是否在某个集合中。例如:

select distinct customer-name

from borrower

where customer-name in (select customer-name from depositor)

select distinct customer-name

from borrower

where customer-name not in ("Smith", "Jones")

因此集合成员资格确认的语法格式如下:

(A1,A2,…,An) [in | not in] (Select-From-Where)

有时在查询中总会碰到一些类似于"至少比一个要大"之类的比较运算。SQL-92提供了对这种集合比较的支持,即操作符“>some”。

例如:

select branch-name from branch

where assets >some (select assets

from branch

where branch-city = "Brooklyn")

在SQL-92中:

⑴“至少比一个…”的集合比较运算符还有:some、>=some、=some和<>some。在这里=some等价于in;

⑵ “比所有都…”的集合比较运算符有:all、>=all、=all和<>all。在这里 <>all 等价于not in。

例如,找出平均余额较高的分支机构名称可以用SQL表示如下:

select branch-name from account

group by branch-name

having avg(balance) >=all (select avg(balance)

from account

group by branch-name)

需要说明的是在SQL中聚集函数是不能嵌套的,即max(avg(…))是非法的表达式!

⑴测试一个子查询的结果是否有元组,即测试其是否为空关系。使用关键词exists和not exists,例如:

select customer-name from borrower as B

where exists (select * from depositor as D

where D.customer-name = B.customer-name)

⑵测试一个子查询的结果是否有重复元组。使用关键词unique和not unique,例如,找出在Perryridge分支机构中只有一个帐户的所有客户姓名:

select T.customer-name from depositor as T

where unique (select R.customer-name

from account, depositor as R

where R.customer-name = T.customer-name and

R.account-number = account.account-number and

account.branch-name = "Perryridge")

嵌套子查询是SQL中比较复杂的内容,特别是当嵌套的层次比较多的时候。所以在设计嵌套子查询的时候,嵌套的层次关系一定要考虑的比较清楚。

参考文献:

1.《数据库系统概论》 冯建华, 清华大学出版社。

2.《软件设计师考试知识点分析与真题详解(计算机与软件工程知识篇)》,希赛IT教育研发中心主编 ,电子工业出版社。

[1]  [2]  [3]  

更多资料
更多课程
更多真题
温馨提示:因考试政策、内容不断变化与调整,本网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准!

软考备考资料免费领取

去领取

!
咨询在线老师!