where与having

1.作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组(group)。

表数据:
编号/姓名/专业/学分/性别
id   name major     score sex
1    jak    Chinese    40    f
2    rain    Math        89    m
3    leo    Phy          78    f
4    jak    Math         76    f
5    rain    Chinese   56    m
6    leo    Math         97    f
7    jak    Phy          45    f
8    jak    Draw         87    f
9    leo    Chinese    45    f

现在我们要得到一个视图:
要求查询性别为男生,并且列出每个学生的总成绩:
SQL:
select s.*,sum(s.score) from student s where sex='f' group by s.name

Result:
id   name major     score sex sum(s.score)
1    jak    Chinese    40    f       248
3    leo    Phy         78     f       220

可以看到总共查到有两组,两组的学生分别是jak和leo,每一组都是同一个学生,这样我们就可以使用聚合函数了。
只有使用了group by语句,才能使用如:count()、sum()之类的聚合函数。

下面我们再对上面的结果做进一步的筛选,只显示总分数大于230的学生:
SQL:
select s.*,sum(s.score) from student s where sex='f' group by s.name having sum(s.score)>230

Result:
id   name major     score       sex   sum(s.score)
1    jak    Chinese    40          f       248

可见having于where的功能差不多。

再看一组数据

如果要查找,同一出产地,水果数量,以及平均价,同时水果名称不为橘子,则sql语句

Select ProductPlace as '出产地', COUNT(produceprice) as '水果数量',AVG(cast(produceprice as int)) as '平均价' 
FROM FRUITINFO where fruitname<>'ORANGE' GROUP BY ProductPlace

 

如果要去除平均价相同的选项则

Select productplace, AVG( DISTINCT  cast(produceprice as int)) as '平均价', COUNT(produceprice) as '数量'
 FROM dbo.FRUITINFO  GROUP BY productplace order by productplace

总结:

--group by后面的ProductPlace一定要和前面的相同,但是where后面的条件是可以的,不然是不会成功的--
--当执行的时候,是先执行where后面的句子,再group by--
--执行顺序是Where, Group By, Having, Order by--
--COUNT(produceprice)和COUNT(*)两者是一样的,count后面的字段没有影响-- 

-- (left,right) outer join对数据进行第一次处理,将两表连接.(逗号为自然连接)

--ON 子句在外连接中用来筛选上一步所生成的数据行 .
--WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
--GROUP BY 子句用来分组 WHERE 子句的输出。
--HAVING 子句用来从分组的结果中筛选行。

--slect case 子句筛选上一步生成行.

posted on 2012-12-26 11:25  弥丝  阅读(2943)  评论(0编辑  收藏  举报