n.所有,持有
v.有( have的现在分词 );(亲属关係中)接受;拿;买到
基本介绍
- 外文名:having
- 解释:n所有,持有
- 包含:聚合函式
简介
使用 HAVING 子句选择行
HAVING 子句对 GROUP BY 子句设定条件的方式与 WHERE 子句和 SELECT 语句互动的方式类似。WHERE 子句搜寻条件在进行分组操作之前套用;而 HAVING 搜寻条件在进行分组操作之后套用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函式。HAVING 子句可以引用选择列表中出现的任意项。
下面的查询得到本年度截止到目前的销售额超过 $40,000 的出版商:
USEpubsSELECTpub_id,total=SUM(ytd_sales)FROMtitlesGROUPBYpub_idHAVINGSUM(ytd_sales)>40000
下面是结果集:
pub_id total
------ -----------
0877 44219
(1 row(s) affected)
为了确保对每个出版商的计算中至少包含六本书,下面示例使用 HAVING COUNT(*) > 5 消除返回的总数小于六本书的出版商:
USEpubsSELECTpub_id,total=SUM(ytd_sales)FROMtitlesGROUPBYpub_idHAVINGCOUNT(pub_id)>5
下面是结果集:
pub_id total
------ -----------
0877 44219
1389 24941
(2 row(s) affected)
理解套用 WHERE、GROUP BY 和 HAVING 子句的正确序列对编写高效的查询代码会有所帮助:
WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
GROUP BY 子句用来分组 WHERE 子句的输出。
HAVING 子句用来从分组的结果中筛选行。
对于可以在分组操作之前套用的搜寻条件,在 WHERE 子句中指定它们更有效。这样可以减少必须分组的行数。应当在 HAVING 子句中指定的搜寻条件只是那些必须在执行分组操作之后套用的搜寻条件。因为HAVING是在查询出的结果集中进行筛选,这个操作需要排序、总计等操作。如果先通过WHERE子句限制查询的记录数,可以减少这方面的开销。
Microsoft® SQL Server™ 2000 查询最佳化器可处理这些条件中的大多数。如果查询最佳化器确定 HAVING 搜寻条件可以在分组操作之前套用,那幺它就会在分组之前套用。查询最佳化器可能无法识别所有可以在分组操作之前套用的 HAVING 搜寻条件。建议将所有这些搜寻条件放在 WHERE 子句中而不是 HAVING 子句中。
以下查询显示包含聚合函式的 HAVING 子句。该子句按类型分组 titles 表中的行,并且消除只包含一本书的组:
USEpubsSELECTtypeFROMtitlesGROUPBYtypeHAVINGCOUNT(type)>1
下面是结果集:
type
------------------
business
mod_cook
popular_comp
psychology
trad_cook
(5 row(s) affected)
以下是没有聚合函式的 HAVING 子句的示例。该子句按类型分组 titles 表中的行,并且消除不是以字母 p 开头的那些类型。
USEpubsSELECTtypeFROMtitlesGROUPBYtypeHAVINGtype='p%'
下面是结果集:
type
------------------
popular_comp
psychology
(2 row(s) affected)
如果 HAVING 中包含多个条件,那幺这些条件将通过 AND、OR 或 NOT 组合在一起。以下示例显示如何按出版商分组 titles,只包括那些标识号大于 0800、支付的总预付款已超过 $15,000 且销售书籍的平均价格小于 $20 的出版商。
SELECTpub_id,SUM(advance)ASAmountAdvanced,AVG(price)ASAveragePriceFROMpubs.dbo.titlesWHEREpub_id>'0800'GROUPBYpub_idHAVINGSUM(advance)>15000ANDAVG(price)<20
ORDER BY 可以用来为 GROUP BY 子句的输出排序。下面的示例显示使用 ORDER BY 子句以定义返回 GROUP BY 子句中的行为递减顺序:
SELECTpub_id,SUM(advance)ASAmountAdvanced,AVG(price)ASAveragePriceFROMpubs.dbo.titlesWHEREpub_id>'0800'ANDprice>=5GROUPBYpub_idHAVINGSUM(advance)>15000ANDAVG(price)<20ORDERBYpub_idDESC
双语例句
1.Hewillnowfaceadisciplinaryhearingforhavinganaffai. 他因有外遇而要面临纪律听证会的裁决。来自柯林斯例句2.Peoplearehavingtothinkhardabouttheirholidayplans.人们现在得仔细地琢磨自己的度假计画。来自柯林斯例句3.Theyidentifiedsixplantsashavingpotentialfordevelopmentintopharmaceuticaldrugs.他们验明6种植物有可能提炼出药物麻醉剂。来自柯林斯例句4.Peopleusuallycomplainabouthavingtodealwithtoomuchbureaucracy.人们经常抱怨不得不应付太多的繁文缛节。来自柯林斯例句5.Havingchildrenwasthequickestwaytoloseyourstreetcred.生孩子是使自己不再年轻时尚的最快方法
1. He will now face a disciplinary hearing for having an affai.他因有外遇而要面临纪律听证会的裁决。来自柯林斯例句2. People are having to think hard about their holiday plans. 人们现在得仔细地琢磨自己的度假计画。来自柯林斯例句3. They identified six plants as having potential for development into pharmaceutical drugs. 他们验明6种植物有可能提炼出药物麻醉剂。来自柯林斯例句4. People usually complain about having to deal with too much bureaucracy. 人们经常抱怨不得不应付太多的繁文缛节。来自柯林斯例句5. Having children was the quickest way to lose your street cred. 生孩子是使自己不再年轻时尚的最快方法