• sqlserver中group by 和having,以及其他语句的用法


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

  • 相关阅读:
    C#正则表达式
    HDU 1009 FatMouse' Trade
    HDU 1022 Train Problem I
    HDU 3665 Seaside
    (转)qsort完整版用法
    HDU 1061 Rightmost Digit (矩阵快速幂)
    HDU 2817 A sequence of numbers
    HDU 1943 Ball bearings
    HDU 1058 Humble Numbers
    HDU 4278 Faulty Odometer
  • 原文地址:https://www.cnblogs.com/cwyblog/p/2833702.html
Copyright © 2020-2023  润新知