Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

sql中where与having的区别

宋和兴  发表于:2011-08-02 09:41:23  
复制

sql中where与having的区别

 

Top
浪子心 发表于:2011-08-02 10:35:27

Where子句:指定查询条件,用来筛选表中满足条件的记录。这样理解:用select可对不同字段进行筛选(纵向),而又用where子句,可对不同记录进行筛选(横向)。 如:select 姓名,行业,定额,备注 from BB Where 定额>30返回定额在30元以上的记录。

 

HAVING子句:返回组内指定条件的记录(where是指定表内符合条件的记录,having是指定用group by分组的结果集内的满足条件记录)。如:
select SUM(BB.累计应交)as num,行业 from BB group by 行业 having SUM(BB.累计应交)>200 返回单个行业合计管理费超过200元的“组记录”。



煮江品茶 发表于:2011-08-02 11:00:39
都市侠影 发表于:2011-08-02 16:57:22
WHERE是以行为单位选取表中的记录,HAVING是先用GROUP BY将记录分成若干组后选择组。

都市侠影 发表于:2011-08-03 20:42:26

举例如下:现有软考成绩表(考生编号,考生姓名,证件号,省份/直辖市,考试等级,考试科目,成绩)划线字段是主键,表中数据如下:

考生编号,考生姓名,证件号,省份/直辖市,考试等级,考试科目,成绩

----------------------------------------------------------------

123456    奥巴马    00000   四川         初级      基础知识  0

134535    唐僧      11111   陕西         高级      应用技术  70

253533    诸葛亮    22222   四川         高级      应用技术  75

525552    秦始皇    44444   陕西         高级      应用技术  60

445466    康熙      53333   吉林         初级      基础知识  35

----------------------------------------------------------------

如果要查询成绩在45以上的考生,这是按行选择记录,所以用WHERE:

SELECT 考生姓名 FROM 软考成绩表 WHERE 成绩>=45;

将返回:唐僧,诸葛亮,秦始皇

如果要查询考生平均成绩在45以上的省份,这就存在一个按考生籍贯分组的问题,奥巴马与诸葛亮一组,唐僧与秦始皇一组,康熙一组,但只有陕西这组被选择,所以用GROUP BY和HAVING:

SELECT 省份/直辖市 FROM 软考成绩表 GROUP BY 省份/直辖市 HAVING AVG(成绩)>=45;

对这一语句分析如下:

如果我们写:SELECT 省份/直辖市,AVG(成绩)AS 平均成绩 FROM 软考成绩表 GROUP BY 省份/直辖市;将返回如下结果:

省份/直辖市 平均成绩

--------------------

四川        37   //这里假设成绩字段是整型数据,不考虑小数的问题

陕西        65

吉林        35

这样分成了三组,但我们只需要第二组,所以加上HAVING子句选组分组:HAVING AVG(成绩)>=45,然后我们只需要显示省份,无需显示平均成绩,故再省略SELECT后面那个平均成绩,所以最终是:

SELECT 省份/直辖市 FROM 软考成绩表 GROUP BY 省份/直辖市 HAVING AVG(成绩)>=45;



总记录:4篇  页次:1/1 9 1 :