zoukankan      html  css  js  c++  java
  • sql中order by和group by的区别

    order by 和 group by 的区别:

    1,order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。

    2,group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。

    3,在使用group by的语句中,只能select用于分类的列(表达式),或聚合函数。where条件用于group by之前,having用于group by 之后对结果进行筛选。

    扩展资料:

    一、order by用法: 排序查询、asc升序、desc降序

    示例:

    1.select * from 学生表 

    2.order by 年龄    

    3.查询学生表信息、按年龄的升序(默认、可缺省、从低到高)排列显示也可以多条件排序、 比如 order by 年龄,成绩 desc    

    4.按年龄升序排列后、再按成绩降序排列。二、group by用法:  分组查询、having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group by 子句的查询语句需要使用聚合函数。

    示例:

    1.select 学号,SUM(成绩) from 选课表 group by 学号  按学号分组、查询每个学号的总成绩

    2.select 学号,AVG(成绩) from 选课表  

    3.group by 学号

    4.having AVG(成绩)>(select AVG(成绩) from 选课表 where 课程号='001')

    5.order by AVG(成绩) desc

    6.查询平均成绩大于001课程平均成绩的学号、并按平均成绩的降序排列。

    1、解释不同

    order by是SQL语句中的关键字,用于对查询结果的排序。ORDER BY 语句用于对结果集进行排序,默认的为升序。

    group by语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。

    2、字段不同

    order by是按字段排序,后面必须列出排序的字段名,可以是多个字段名。

    group by是按字段分类 ,必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。 

    3、sql命令格式优先顺序不同

    group By关键字先对指定的分组条件将筛选得到的视图进行分组,将分组视图后不满足条件的记录筛选掉。

    order By语句最后对视图进行排序,最终的结果就产生了。

    扩展资料

    order by和group by的用法示例

    1、select * from 学生表 order by 年龄    

    查询学生表信息、按年龄的升序(默认、可缺省、从低到高)排列显示。

    2、select 学号,SUM(成绩) from 选课表 group by 学号  

    按学号分组、查询每个学号的总成绩。

    3、select 学号,AVG(成绩) from 选课表  group by 学号 having AVG(成绩)>(select AVG(成绩) from 选课表 where 课程号='001') order by AVG(成绩) desc

    查询平均成绩大于001课程平均成绩的学号、并按平均成绩的降序排列。

    经常见sql语句中order by 1或者order by 2...order by N,有时候很莫名其妙.其实1表示第一个栏位,2表示第二栏位; 依此类推,当表中只有2个栏位时,oder by 3就会出错,这个跟order by 列名没有什么区别,不过在特殊情况下还是很有用的.

    例如table1(p_code int,issue_date datetime,issue_num int)

    p_code       issue_date                              issue_num
    101    2016-12-01 00:00:00.000          45
    102    2016-12-01 00:00:00.000         89
    102     2016-12-03 00:00:00.000         44
    103     2016-12-03 00:00:00.000         44
    101     2016-12-02 00:00:00.000         44
    101     2016-12-03 00:00:00.000         44
    101     2016-12-03 00:00:00.000         45
    101     2016-12-03 00:00:00.000         44
    101     2016-12-03 00:00:00.000         44
    102     2016-12-03 00:00:00.000         47
    101     2016-12-03 00:00:00.000         48
    104     2016-12-03 00:00:00.000         86
    101     2016-12-03 00:00:00.000         56
    101     2016-12-03 00:00:00.000         29
    101     2016-12-11 00:00:00.000         11

    我想获取某个p_code过去(不含当天)10次的issue_num平均值,

    可能我们会这么写

    select top 10 p_code, avg(issue_num) as avgissue from table1
    where issue_date<>(select convert(varchar(10),getdate(),120))
    and p_code='101'
    group by p_code
    order by issue_date desc

    但是以上写法是错误,的,会提示 Column "table1.issue_date" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.必须要求issue_date在group by中.
    所以我们改成

    select top 10 p_code, avg(issue_num) as avgissue from table1
    where issue_date<>(select convert(varchar(10),getdate(),120))
    and p_code='101'
    group by p_code,issue_date
    order by issue_date desc

    但是得到的结果却是(今天是2016.12.11)
    p_code avgissue
    101 44
    101 44
    101 45

    显然以上不是我们想要的结果.

    那么该如何结果这种问题呢,当然你可以再次进行avg()聚合运算,但是这里我们既然说oder by N,那么就用这个知识来解决.

    语句如下.

    select top 10 p_code, avg(issue_num) as avgissue from table1
    where issue_date<>(select convert(varchar(10),getdate(),120))
    and p_code='101'
    group by p_code
    order by 2 desc


    结果如下(今天是2016.12.11)
    p_code avgissue
    101 44


    是不是很神奇呢!

    当然作为码农,我们尽量用列名来解决,以便增加代码的可读性和易维护性.

  • 相关阅读:
    [Swift]LeetCode954. 二倍数对数组 | Array of Doubled Pairs
    [Xcode 实际操作]九、实用进阶-(18)图像人脸识别:对图片中的人像进行面部检测
    Hibernate or JPA Annotation中BLOB、CLOB注解写法
    install_driver(mysql) failed
    【Android】Android中AlertDialog对话框的使用实例
    POJ 2442 Sequence【堆】
    distributed OSGI demo
    DSP/BIOS使用之初窥门径——滴答时钟及烧写Flash
    提取工厂类
    【JAVA学习】struts2的action中使用session的方法
  • 原文地址:https://www.cnblogs.com/klb561/p/11657962.html
Copyright © 2011-2022 走看看