| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 703 人关注过本帖
标题:select 使用经验 (4)
只看楼主 加入收藏
jjjlan
Rank: 1
等 级:新手上路
帖 子:67
专家分:0
注 册:2004-11-24
收藏
 问题点数:0 回复次数:0 
select 使用经验 (4)

having的使用技巧】

其实这里没技巧可言,select的条件过滤的先后顺序是这样的(我是根据经验而猜得,不知对否):先对join中的on表达式进行过滤,再到where,中间结果出来后再用having进行过滤,最后才把结果显示出来。所以说having是对select结果的最后一次过滤。它与where的分别就是where能够事先把不要的数据过滤掉,这样select里头就不用处理那么多的数据。但有些数据事先不知道要不要过滤,要根据结果才能确定,这时才用having这个事后诸葛亮。

这里兴修例子来比较一下onwherehaving的不同之处

recdbf内容如下:                还有一个tempyf的辅助表,记录12个月

日期 性质         yf

200073 特大 1

200079 特大 2

200093 特大 3

199932 一般 4

199934 一般 5

200013 一般 6

200021 一般 7

200023 一般 8

200034 一般 9

200087 一般 10

2000112 一般 11

199923 重大 12

200023 重大

200052 重大

200089 重大

on的命令如下

SELECT tempyf.*,;

  SUM(IIF(ISNULL(recdbf.日期).OR.AT("一般",recdbf.性质)=0,0,1)) AS 一般,;

  SUM(IIF(ISNULL(recdbf.日期).OR.AT("重大",recdbf.性质)=0,0,1)) AS 重大,;

  SUM(IIF(ISNULL(recdbf.日期).OR.AT("特大",recdbf.性质)=0,0,1)) AS 特大;

 FROM tempyf LEFT OUTER JOIN recdbf ;

  ON tempyf.yf = MONTH(recdbf.日期).AND.YEAR(日期) = ?yy;

 GROUP BY tempyf.yf

其中yy=2000,表示统计2000年的数据

where的命令如下:

SELECT tempyf.*,;

  SUM(IIF(ISNULL(recdbf.日期).OR.AT("一般",recdbf.性质)=0,0,1)) AS 一般,;

  SUM(IIF(ISNULL(recdbf.日期).OR.AT("重大",recdbf.性质)=0,0,1)) AS 重大,;

  SUM(IIF(ISNULL(recdbf.日期).OR.AT("特大",recdbf.性质)=0,0,1)) AS 特大;

 FROM tempyf LEFT OUTER JOIN recdbf ;

  ON tempyf.yf = MONTH(recdbf.日期);

 GROUP BY tempyf.yf ;

where YEAR(日期) = ?yy &&注意,条件从on移到这里来了

having的命令如下:

SELECT tempyf.*,;

  SUM(IIF(ISNULL(recdbf.日期).OR.AT("一般",recdbf.性质)=0,0,1)) AS 一般,;

  SUM(IIF(ISNULL(recdbf.日期).OR.AT("重大",recdbf.性质)=0,0,1)) AS 重大,;

  SUM(IIF(ISNULL(recdbf.日期).OR.AT("特大",recdbf.性质)=0,0,1)) AS 特大;

 FROM tempyf LEFT OUTER JOIN recdbf ;

  ON tempyf.yf = MONTH(recdbf.日期);

 GROUP BY tempyf.yf ;

having YEAR(日期) = ?yy &&注意,条件从on移到这里来了

on的结果如下,这是正确的

YF 一般 重大 特大

1 1 0 0

2 2 1 0

3 1 0 0

4 0 0 0

5 0 1 0

6 0 0 0

7 0 0 2

8 1 1 0

9 0 0 1

10 0 0 0

11 1 0 0

12 0 0 0

where的结果如下:

YF 一般 重大 特大

1 1 0 0

2 2 1 0

3 1 0 0

5 0 1 0

7 0 0 2

8 1 1 0

having的结果如下:

YF 一般 重大 特大

1 1 0 0

2 2 2 0

5 0 1 0

7 0 0 2

8 1 1 0

9 0 0 1

11 1 0 0

搜索更多相关主题的帖子: select 经验 
2005-06-18 13:40
快速回复:select 使用经验 (4)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024060 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved