专注于自动化测试,性能测试.......

Sql语句之Having用法总结

上一篇 / 下一篇  2009-08-28 00:09:25 / 个人分类:MSSql

0n#Rv"l1W"}fK%K0 Having子句的一般应用场景:Group by分组后对某列的聚合函数进行条件过滤

NEU TrR'U M051Testing软件测试网k~/V2s i_

当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:51Testing软件测试网I.Qi-l;UWH
51Testing软件测试网_q0V*\!Xjn
执行where子句查找符合条件的数据;
H9tHRAg2f4t/r`~Pl051Testing软件测试网k'GNUeA/R0Xq
使用group by 子句对数据进行分组;51Testing软件测试网/B}T'hcw-PX6t op

HHu2@ U/[,T:X0对group by 子句形成的组运行聚集函数计算每一组的值;51Testing软件测试网(X6ymQ9R[I8U

_M(J @ ~-P&]9P'R0最后用having 子句去掉不符合条件的组。

}VH4cb%k051Testing软件测试网.^8Q U ?B~|/n

实例:

]BL ?WC0

XE8MZ/{ A051Testing软件测试网/[3^ gC c0e,v
create table bookshop51Testing软件测试网|[Y,s7?-e
(bookcategory varchar(100) not null,51Testing软件测试网N*^j4m tLz2`!I T
 bookname varchar(100) not null,51Testing软件测试网'D~o6w9S
 bookprice money not null)

{Y!`UM)@6i:C J051Testing软件测试网;y+T Gerg

insert into bookshop values51Testing软件测试网;R2N+O6cp;FM
('C#','C# Programming',45.00)51Testing软件测试网+?`*J6m%P1n$v.U"ek.^

8HWD3cFQJ0insert into bookshop values51Testing软件测试网HbFU6z[p o y,A
('C#','Learn C#',60.50)51Testing软件测试网vL:A*wgMY

1Q(ru!v M!} ~MI0insert into bookshop values51Testing软件测试网Y~.h L)k R3|]
('Python','Dive into Python',70)51Testing软件测试网 WnU5\f)u#fjQj0Q

u"Pwt9e9`l0insert into bookshop values51Testing软件测试网 tP;~8R-eN
('VBS','VBS Document',20.5)

)b5R j"Mt051Testing软件测试网 W1~2x~?;q

select * from bookshop

cc _SshnBO0

!E pC"X&x;^0select bookcategory,sum(bookprice) from bookshop
/H,Myez0group by bookcategory
%NA&QQN%@;K&b5s*X0having count(bookprice)>10051Testing软件测试网5DC5s\;n

m}1o e,ZR3v7\ K0下面是来自百度百科的解释:

#\wv*jf,|$[5[+e0

having

  使用 HAVING 子句选择行
'o%ce2b5Y&\0
  HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中出现的任意项。51Testing软件测试网Ra}+R!Ms7F2e
  下面的查询得到本年度截止到目前的销售额超过 $40,000 的出版商:51Testing软件测试网R&J,w2b,q{|
  USE pubs51Testing软件测试网4^G-xTp!M1mO
  SELECT pub_id, total = SUM(ytd_sales)51Testing软件测试网qKk7Er@:qc
  FROM titles
C$t_Z-m?I0
  GROUP BY pub_id
h"o(E9v RT0
  HAVING SUM(ytd_sales) > 4000051Testing软件测试网eKGL[7W P
  下面是结果集:
2U,e;KRB%x3S;S0
  pub_id total51Testing软件测试网[$p` yQ_h
  ------ -----------51Testing软件测试网:m"MiU*P Md Z;_#G5j
  0877 4421951Testing软件测试网 V }4ZB+Y&R3{
  (1 row(s) affected)51Testing软件测试网 XPX Pr$P
  为了确保对每个出版商的计算中至少包含六本书,下面示例使用 HAVING COUNT(*) > 5 消除返回的总数小于六本书的出版商:51Testing软件测试网(e f9if$wly
  USE pubs51Testing软件测试网0X$Gy#R8C+X
  SELECT pub_id, total = SUM(ytd_sales)51Testing软件测试网{A)q*yV d
  FROM titles51Testing软件测试网7@(g lf ? j4L/z
  GROUP BY pub_id51Testing软件测试网1i#`U5a]m3wr
  HAVING COUNT(pub_id) > 5
6g hc?%eO |0
  下面是结果集:
Yn%YqA0
  pub_id total
F,q'P9G&JXT)r0
  ------ -----------51Testing软件测试网2k!P+hw!Q8r
  0877 4421951Testing软件测试网5V;E0W$Kavg`;D
  1389 24941
|R]OD"P"U1{0
  (2 row(s) affected)51Testing软件测试网%\d2j#MY8[M
  理解应用 WHERE、GROUP BY 和 HAVING 子句的正确序列对编写高效的查询代码会有所帮助:
Er*F.K]lv4F0
  WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。51Testing软件测试网uR-o#U"t&}
  GROUP BY 子句用来分组 WHERE 子句的输出。
^]&[ C)rt.QX)Du0
  HAVING 子句用来从分组的结果中筛选行。
*?mi+O4mPei K r0
  对于可以在分组操作之前或之后应用的搜索条件,在 WHERE 子句中指定它们更有效。这样可以减少必须分组的行数。应当在 HAVING 子句中指定的搜索条件只是那些必须在执行分组操作之后应用的搜索条件。51Testing软件测试网Y Qr(h$O.V
  Microsoft® SQL Server™ 2000 查询优化器可处理这些条件中的大多数。如果查询优化器确定 HAVING 搜索条件可以在分组操作之前应用,那么它就会在分组之前应用。查询优化器可能无法识别所有可以在分组操作之前应用的 HAVING 搜索条件。建议将所有这些搜索条件放在 WHERE 子句中而不是 HAVING 子句中。
2["r6n&w8tV0
  以下查询显示包含聚合函数的 HAVING 子句。该子句按类型分组 titles 表中的行,并且消除只包含一本书的组:51Testing软件测试网 AI4NqD
  USE pubs51Testing软件测试网} x&iU O T&Z
  SELECT type51Testing软件测试网-H6[a,{Hs.S(~
  FROM titles51Testing软件测试网qH(wRN[@-pz
  GROUP BY type51Testing软件测试网NT4Qn i#W5T$|
  HAVING COUNT(type) > 1
_ NA.^gP o2n0
  下面是结果集:
W+`2dN/S#|/d0
  type51Testing软件测试网m;z Nu1^ Gz-h
  ------------------51Testing软件测试网%Sn.k i+h:Z
  business
y9Cl)W'~0
  mod_cook51Testing软件测试网R ko]!pP%d b'e
  popular_comp
-{-fbjN+x!r0
  psychology51Testing软件测试网~v,npf!I;A
  trad_cook51Testing软件测试网5A6w%b)Q|[xnt
  (5 row(s) affected)51Testing软件测试网j ax5vwE n
  以下是没有聚合函数的 HAVING 子句的示例。该子句按类型分组 titles 表中的行,并且消除不是以字母 p 开头的那些类型。51Testing软件测试网 Wh;?E2Z Tz+bp
  USE pubs51Testing软件测试网biAdh,b,e:Gy#fV
  SELECT type
?2{,Y!Hq5v_5t0
  FROM titles
cJ4v6C,}_*QB5`0
  GROUP BY type
!as/p-TQU7_ q+}0
  HAVING type = '%p%'
m ?'Y&z:Ob(sn0
  下面是结果集:
P/H6M2f5jwG#F"A0
  type
^)GW)~Vv0
  ------------------51Testing软件测试网VSo6F"x%}9\/`9v
  popular_comp51Testing软件测试网-j8isYbw'ddR
  psychology
eK6s8~;A_b0
  (2 row(s) affected)51Testing软件测试网JfW*`.z
  如果 HAVING 中包含多个条件,那么这些条件将通过 AND、OR 或 NOT 组合在一起。以下示例显示如何按出版商分组 titles,只包括那些标识号大于 0800、支付的总预付款已超过 $15,000 且销售书籍的平均价格小于 $20 的出版商。51Testing软件测试网%@(r/Ka:PC0?2m
  SELECT pub_id, SUM(advance) AS AmountAdvanced,51Testing软件测试网 Ot9[J A7o:L:AK
  AVG(price) AS AveragePrice
(OTf*g_E.u'Q[r0
  FROM pubs.dbo.titles
;_nvu1[aP0
  WHERE pub_id > '0800'
b)?xd)T6r4W`f"m0
  GROUP BY pub_id
yKQ-W$Qu9U0
  HAVING SUM(advance) > 15000
-Oy1bh*^I/ur0
  AND AVG(price) < 20
n,P[8yuqu.t0
  ORDER BY 可以用来为 GROUP BY 子句的输出排序。下面的示例显示使用 ORDER BY 子句以定义返回 GROUP BY 子句中的行的顺序:51Testing软件测试网*^3\At7Y+z
  SELECT pub_id, SUM(advance) AS AmountAdvanced,
K!X'r0d%o1X^~A0
  AVG(price) AS AveragePrice51Testing软件测试网X+}:_'I0B Ye
  FROM pubs.dbo.titles51Testing软件测试网3Zu8v&~9reY
  WHERE pub_id > '0800'
w wgd&J"i W`'p0
  AND price >= 5
TL1{D2G!Vb0
  GROUP BY pub_id
qY-B8v7hZj7a)P4jQ0
  HAVING SUM(advance) > 1500051Testing软件测试网[$c_R,G3ITGw|
  AND AVG(price) < 2051Testing软件测试网xx#RL(d [/b
  ORDER BY pub_id DESC51Testing软件测试网 M/t;I.IKk0R5I*_
51Testing软件测试网z%dSK$b4Q+\s1p z


"sp] s+S~0 51Testing软件测试网 r4nhy1] e3PH


TAG: having Having

 

评分:0

我来说两句

wxf_xsfy

wxf_xsfy

自动化测试的拥簇者,善于自动化测试的框架和工具开发,TIB工作室核心成员

日历

« 2024-03-24  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 380970
  • 日志数: 79
  • 图片数: 1
  • 文件数: 1
  • 书签数: 3
  • 建立时间: 2007-09-19
  • 更新时间: 2018-01-30

RSS订阅

Open Toolbar