﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-ivy-jie-文章分类-database</title><link>http://www.cppblog.com/ivy-jie/category/10651.html</link><description>progress ...</description><language>zh-cn</language><lastBuildDate>Sat, 23 May 2009 02:58:16 GMT</lastBuildDate><pubDate>Sat, 23 May 2009 02:58:16 GMT</pubDate><ttl>60</ttl><item><title>SQL中WHERE 和HAVING的区别</title><link>http://www.cppblog.com/ivy-jie/articles/85483.html</link><dc:creator>ivy-jie</dc:creator><author>ivy-jie</author><pubDate>Fri, 22 May 2009 16:45:00 GMT</pubDate><guid>http://www.cppblog.com/ivy-jie/articles/85483.html</guid><wfw:comment>http://www.cppblog.com/ivy-jie/comments/85483.html</wfw:comment><comments>http://www.cppblog.com/ivy-jie/articles/85483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivy-jie/comments/commentRss/85483.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivy-jie/services/trackbacks/85483.html</trackback:ping><description><![CDATA[<p>SQL语句中的Having子句与where子句之区别 <br><br>在说区别之前，得先介绍GROUP BY这个子句，而在说GROUP子句前，又得先说说&#8220;聚合函数&#8221;——SQL语言中一种特殊的函数。例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。 <br><br>如： <br>SELECT SUM(population) FROM vv_t_bbc ; <br><br>　　这里的<span style="COLOR: red">SUM作用在所有返回记录的population字段上，结果就是该查询只返回一个结果</span>，即所有国家的总人口数。 <br><br>　 　而通过使用<span style="COLOR: red">GROUP BY 子句，可以让SUM 和 COUNT 这些函数对<u><strong>属于一组的数据</strong></u>起作用</span>。当你指定 <span style="COLOR: red">GROUP BY region 时，只有属于同一个region（地区）的一组数据才将返回一行值</span>，也就是说，表中所有除region（地区）外的字段，只能通过 SUM, COUNT等聚合函数运算后返回一个值。 <br><br>下面再说说&#8220;HAVING&#8221;和&#8220;WHERE&#8221;： <br>　　<span style="COLOR: red">HAVING子句可以让我们筛选成组后的各组数据，WHERE子句在聚合前先筛选记录</span>．也就是说作用在GROUP BY 子句和HAVING子句前；而 HAVING子句在聚合后对组记录进行筛选。 <br><br>　　让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句： <br><br>　　SQL实例： <br><br>　　一、显示每个地区的总人口数和总面积： <br><br>SELECT region, SUM(population), SUM(area) <br>FROM bbc <br>GROUP BY region <br><br>　　先以region把返回记录分成多个组，这就是GROUP BY的字面含义。分完组后，然后用聚合函数对每组中的不同字段（一或多条记录）作运算。 <br><br>　　二、显示每个地区的总人口数和总面积．仅显示那些人口数量超过1000000的地区。 <br><br>SELECT region, SUM(population), SUM(area) <br>FROM bbc <br>GROUP BY region <br>HAVING SUM(population)&gt;1000000 <br><br>[注]　　在这里，我们不能用where来筛选超过1000000的地区，因为表中不存在这样一条记录。 <br><br>　　相反，HAVING子句可以让我们筛选成组后的各组数据,且HAVING后的条件如果是聚合函数的值,不能取别名来作判断,即如下写法是不能被成功执行的:</p>
<p>SELECT region, SUM(population) <font color=#ff0000>as totalPopulation</font>, SUM(area) <br>FROM bbc <br>GROUP BY region <br>HAVING <font color=#ff0000>totalPopulation</font>&gt;1000000</p>
<p><br><br>ps:如果想根据sum后的字段进行排序可以在后面加上：order by sum(population) desc/asc <br><br>WHERE句子作用于基本表或试图，从中选择满足条件的元组。HAVING作用于组，从中选择满足条件的组</p>
<img src ="http://www.cppblog.com/ivy-jie/aggbug/85483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivy-jie/" target="_blank">ivy-jie</a> 2009-05-23 00:45 <a href="http://www.cppblog.com/ivy-jie/articles/85483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>