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

  • 相关阅读:
    The new powerful SQL executing schedule monthly or weekly in DB Query Analyzer 7.01
    热烈庆祝自已厉精13年开发的 DB查询分析器 7.01(最新版本) 在中关村在线本月获得近6000次的下载量
    CentOS7下安装GitLab
    DB查询分析器7.01新增的周、月SQL执行计划功能
    Ubuntu环境下Anaconda安装TensorFlow并配置Jupyter远程访问
    Docker学习笔记4: Docker-Compose—简化复杂容器应用的利器
    Docker学习笔记3:CentOS7下安装Docker-Compose
    CentOS7下安装python-pip
    [Flutter] 音频播放插件 audioplayers 的一个路径坑
    解放双手之自动拉取与推送
  • 原文地址:https://www.cnblogs.com/cwyblog/p/2833702.html
Copyright © 2020-2023  润新知