摘要: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教育研发中心主编 ,电子工业出版社。
软考备考资料免费领取
去领取