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 子句筛选上一步生成行.