精华内容
下载资源
问答
  • 什么时候用GROUP BY ---sql

    千次阅读 多人点赞 2018-09-14 01:56:15
    说的多怕你混,你就记住当SELECT 后 既有 表结构本身的字段,又有需要使用聚合函数(COUNT(),SUM(),MAX(),MIN(),AVG()等)的字段,就要用到group by分组,查询的限定条件里有需要聚合函数计算的字段时也需要分组...

    说的多怕你混,你就记住当SELECT 后 既有 表结构本身的字段,又有需要使用聚合函数(COUNT(),SUM(),MAX(),MIN(),AVG()等)的字段,就要用到group by分组,查询的限定条件里有需要用聚合函数计算的字段时也需要用分组,比如:
    select avg(grade) from cs
    查询选课表(cs)中学生的总成绩(grade);这里就不用分组;
    又如:
    select sno,sum(grade) from cs group by sno
    查询选课表里每个学生的总成绩,这里就要用分组,分组的依照字段必须是select 后没有被计算过的原始字段;
    以上是分组用法。

    本来我也弄不清,书上说的太模糊,后来自己代码写多了就懂了。
    分组的概念:就是让经过计算的查询结果根据某一个或者多个字段分成一组一组(一行一行)的排列显示。

    另外顺便介绍下,WHERE和HAVING的区别,WHERE作用于全表,而HAVING只作用于分组的组内。

    到现在我怎么用都不会混淆了,希望能帮助你

    展开全文
  • 1.什么时候会使用内部临时表 1.1 union 举例: (select 1000 as f) union (select id from t1 order by id desc limit 2); 这里的内存临时表起到了暂存数据的作用,而且计算过程还上了临时表主键 id 的唯一性约束...

    1.什么时候会使用内部临时表

    1.1 union

    举例:
    (select 1000 as f) union (select id from t1 order by id desc limit 2);
    在这里插入图片描述
    这里的内存临时表起到了暂存数据的作用,而且计算过程还用上了临时表主键 id 的唯一性约束,实现了 union 的语义。
    如果把上面这个语句中的 union 改成 union all 的话,就没有了“去重”的语义。这样执行的时候,就依次执行子查询,得到的结果直接作为结果集的一部分,发给客户端。因此也就不需要临时表了。

    1.2 group by

    1.2.1举例:

    select id%10 as m, count(*) as c from t1 group by m;
    这个语句的逻辑是把表 t1 里的数据,按照 id%10 进行分组统计,并按照 m 的结果排序后输出。
    在这里插入图片描述
    如果你的需求并不需要对结果进行排序,那你可以在 SQL 语句末尾增加 order by null。这样就跳过了最后排序的阶段,直接从临时表中取数据返回。

    1.2.2 对内存临时表的排序(来自16讲)

    需要排序时,MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。

    1.2.2.1 全字段排序

    举例
    select city,name,age from t where city=‘杭州’ order by name limit 1000 ;
    在这里插入图片描述
    “按 name 排序”这个动作,可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和参数 sort_buffer_size。sort_buffer_size,就是 MySQL 为排序开辟的内存(sort_buffer)的大小。如果要排序的数据量小于 sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,则不得不利用磁盘临时文件辅助排序。

    可以利用OPTIMIZER_TRACE 的结果来确认,你可以从 number_of_tmp_files 中看到是否使用了临时文件。(具体就不写了)

    1.2.2.2 rowid 排序

    在上面这个算法过程里面,只对原表的数据读了一遍,剩下的操作都是在 sort_buffer 和临时文件中执行的。但这个算法有一个问题,就是如果查询要返回的字段很多的话,那么 sort_buffer 里面要放的字段数太多,这样内存里能够同时放下的行数很少,要分成很多个临时文件,排序的性能会很差。所以如果单行很大,这个方法效率不够好。

    举例SET max_length_for_sort_data = 16;
    max_length_for_sort_data,是 MySQL 中专门控制用于排序的行数据的长度的一个参数。它的意思是,如果单行的长度超过这个值,MySQL 就认为单行太大,要换一个算法。

    在这里插入图片描述
    rowid 排序多访问了一次表 t 的主键索引。
    需要说明的是,最后的“结果集”是一个逻辑概念,实际上 MySQL 服务端从排序后的 sort_buffer 中依次取出 id,然后到原表查到 city、name 和 age 这三个字段的结果,不需要在服务端再耗费内存存储结果,是直接返回给客户端的。

    1.2.2.3 全字段排序和rowid排序

    对于 InnoDB 表来说,rowid 排序会要求回表多造成磁盘读,因此不会被优先选择。

    1.2.3 内存临时表的大小

    内存临时表的大小是有限制的,参数 tmp_table_size 就是控制这个内存大小的,默认是 16M。如果达到上限,就会把内存临时表转成磁盘临时表,磁盘临时表默认使用的引擎是 InnoDB。

    1.2.4 group by 优化方法

    如果 group by 需要统计的数据量不大,尽量只使用内存临时表;也可以通过适当调大 tmp_table_size 参数,来避免用到磁盘临时表;

    1.2.4.1 索引

    如果可以确保输入的数据是有序的,那么计算 group by 的时候,就只需要从左到右,顺序扫描,依次累加。
    改成

    alter table t1 add column z int generated always as(id % 100), add
    index(z); select z, count(*) as c from t1 group by z;

    这样就不再需要临时表,不再需要排序了。

    1.2.4.2 直接排序

    在 group by 语句中加入 SQL_BIG_RESULT 这个提示(hint),就可以告诉优化器:这个语句涉及的数据量很大,请直接用磁盘临时表。

    select SQL_BIG_RESULT id%100 as m, count(*) as c from t1 group by m;

    在这里插入图片描述

    1.3 总结-什么时候需要临时表

    如果语句执行过程可以一边读数据,一边直接得到结果,是不需要额外内存的,否则就需要额外的内存,来保存中间结果;
    join_buffer 是无序数组,sort_buffer 是有序数组,临时表是二维表结构;
    如果执行逻辑需要用到二维表特性,就会优先考虑使用临时表。比如我们的例子中,union 需要用到唯一索引约束, group by 还需要用到另外一个字段来存累积计数。

    展开全文
  • 1. 什么时候用order by ? 2.什么时候用group by ? 3.什么时候 需要同时使用?

    1.  什么时候用order by ?

    2.什么时候用group by ?

    3.什么时候 需要同时使用?

    展开全文
  • 以前,自己总是记不住如何用group by,如何用order by什么时候用group by,什么时候用order by,什么时候两者一起用,怎么用,谁先谁后,现在,我们就一起来说一下Select from where groupby having order by 的...

            以前,自己总是记不住如何用group by,如何用order by,什么时候用group by,什么时候用order by,什么时候两者一起用,怎么用,谁先谁后,现在,我们就一起来说一下Select   from   where   groupby   having   order by 的那些事,简单的总结一下,加深一下自己的印象,也给有需要的人提供点资源

            Select   from   where   groupby   having   order by ,不用说,select from肯定是一起的,然后是where,然后是group by,having的前提是先分组,所以跟着group by,来的是分组之后的筛选条件。最后是从艺的数据集中select 字段,最最后,对已得的数据进行排序 

    所以执行顺序依次是:

    [sql] view plain copy
     
    1. from  
    2. Where  
    3. Group by  
    4. Having
    5. Select  
    6. Order by

    1.执行where xx对全表数据做筛选,返回第1个结果集。 
    2.针对第1个结果集使用group by分组,返回第2个结果集。 
    3.针对第2个结集执行having xx进行筛选,返回第3个结果集。
    4针对第3个结果集中的每1组数据执行select xx,有几组就执行几次,返回第4个结果集。 
    5.针对第4个结果集排序
           其实说起来,我们的sql语句主要就是这几个加上一些聚合函数,嵌套用法什么的,在有一些什么case when语句,下面来个更形象的图文并茂

     数据源:

              

     先来一个比较另类的、简单的,组内排序

     

    Select StudentName,LessonName,Result  from TestTable order byStudentName,LessonName,Result

     

         

           先执行Select StudentName,LessonName,Result from TestTable,然后根据StudentName排序,在此基础上再根据LessonName排序,在以上基础上再根据Result进行升序排序

    another: 

    select StudentName,SUM(Result) asResultField from TestTable where LessonName='语文' GROUP BYStudentName HAVING SUM(Result)>7 ORDER BY ResultField

           
           他的执行顺序是先执行筛选出LessonName=’语文’的,根据StudentName进行分组,在以分组基础上筛选Result之和大于7的数据,然后就是从已得数据集中select StudentName,SUM(Result) as ResultField,然后最后数据集根据总分大小升序排列

     这里面呢,其他的都挺简单,值得注意的是group by的用法: 

    select 列a,聚合函数(聚合函数规范) from 表明 where 过滤条件 group by 列a ;  

    select 列a,列b 聚合函数(聚合函数规范) from 表明 where 过滤条件 group by 列a , 列b

    也就是说,我们从select里面展示的字段都是要用来分组的依据,如果是:

    select 列a,列b 聚合函数(聚合函数规范) from 表明 where 过滤条件 group by 列a   

      

     

    重:下面说一下having和where的用法区别:         

          1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。         

          2.where肯定在group by 之前,即也在having之前。         

          3.where后的条件表达式里不允许使用聚合函数,而having可以。

    转载于:https://www.cnblogs.com/DoubleEggs/p/5765354.html

    展开全文
  • 学习到pandas的groupby功能的时候,相当迷惑,这玩意儿干嘛的? 网上查询了一下,全是具体的用法列,要么就是从某些书本上“copy”下来的段落,也没清楚明白的讲groupby功能到底是什么。 大概知道它和数据库...
  • 在统计的时候Group ByGroup By Rollup和Group By Cube这三个是最长的,但是对于初学者来说搞清它们有点难度,所以我把我的认识过程记下来,希望对有同样苦恼的人有所帮助。 1.Grou...
  • group by分组筛选

    2021-04-14 14:20:58
    我们在MySQL做查询时,经常需要用到 group by 分组来筛选查询 相信做后端的朋友应该遇到过,有时候需要对分组的结果再进行过滤,这时候where用不了,那么该如何解决呢? 解决方法: ...用group by和h
  • SQL语句什么时候用having?以及怎么…

    千次阅读 2017-08-04 15:51:00
    因为where关键字无法与合计函数一起使用,例如sum(),avg()等,所以当有条件的话,需要放在having下。 eg:我们希望查找订单总金额...GROUP BY Customer HAVING SUM(OrderPrice) MySQL无法使用top子句,所以要获得表中
  • 今天在公司做一个需求的时候,写的是面条代码,一个方法直接从头写到尾,其中用到了GroupBy,且GroupBy的KeySelector是多个属性而不是单个属性。 但是公司最近推行Clean Code,要让代码有可读性。且作为一个有追求的...
  • sql中group by的理解

    2019-10-03 16:49:12
    在我们的日常工作中,写sql的时候group by应该是每个程序员都会遇到的。 今天,我们来谈论一下关于group by 的相关理解。 针对group by 的例子,我们可以写成如下样子:  select (1) from your_table where (2...
  • spark 的groupby

    万次阅读 2016-06-01 14:21:41
    其实我一直很不明白的是,为什么有groupByKey了还要有groupBy,今天被一位同事问到了怎么对rdd分组的时候,这个疑问算是彻底惹恼我了,我一定要搞清楚这东西怎么的,嗯,对比一下groupByKey()函数,无参数,pair...
  • 最近在看group by时候,不大理解怎么分组,大学学这个地方的时候就有点稀里糊涂的,查询了很多文章现在终于理解了。 group by 我的理解就是对某个列进行分组,列相同的可以放在一起再聚合函数来查找想要的结果...
  • 但是具体什么时候用哪个,以及他们的效率如何知不道。但是最近做项目就遇到了一个非常奇葩的问题,场景是这样的:我需要查询某个用户的所有菜单项,需要关联查询,但是用distinct查询每次都会少查询出来一个,但是这...
  • 取数据的时候遇到了一个问题,groupby取数据不知道取得是哪一条,哪怕from后面的查询已经orderby了,但是竟然取了中间的一条,这到底是什么问题,有没有大佬能解答一下 ``` SELECT cl.add_time, cl.`event`,...
  • 取数据的时候遇到了一个问题,groupby取数据不知道取得是哪一条,哪怕from后面的查询已经orderby了,但是竟然取了中间的一条,这到底是什么问题,有没有大佬能解答一下 这个是没有用groupby查询出来的结果 !...
  • Baidu了一下没发现groupby方法中有什么参数能指定不要过滤掉空值,只好曲线救国了: 我们给这个列的空值赋值一个特殊的值,保证不会和其他的申请单号重复,然后再分组就OK了,效果是这样的: 效果是达到了,但总...
  • 先说明下这个注射的中心思路:无论用什么方法,就是想办法让sql程序在编译时候出错。(大家开始可能不知道什么意思,下面我会说清楚,大家带着这个思想去了解,印象会深点,了解之后,就相当难忘了) 还有,这个having...
  • oracle group by for update以及笛卡尔积

    千次阅读 2012-05-15 01:16:38
    --当然如果不到的话就不需要再查出来的只需要group by 分组依据的行 就行了 group:除了集合函数本身所查询的字段之外,其他的字段都是查什么(查询的字段)分什么(对应的查询的字段),而且不管是单表查询...
  • group by 语句怎么?他有什么作用? where后面可以使用聚合函数吗? 聚合函数可以在哪使用? 这里先给出答案(结论): having只能对group by的结果进行操作,必须接在group by的后面,而where不能接在group...
  • 索引本质是一个数据结构,排好序的快速查找结构:检索快,排序快 但insert,update,delete等更新表的时候都会变慢。...分组 groupby(先排序后分组) 不适合: 记录少 经常增删改 where不到的 过滤性不好(性别) ...
  • Mysql group by后加 limit 查询很慢的坑

    千次阅读 2020-01-15 21:25:18
    起因是在改造一条sql语句时候,需要加group by,我当时就没有多想,直接就加上了,确认了sql可以正常查询之后,我就开始运行项目测试了。的是baomidou的mybitis插件,这个查询最终是会通过mybatis的处理加上limit...
  • 什么窗口函数?

    2020-04-16 18:06:15
    目录窗口函数具有什么功能?但是这些功能我们的group看差别:那么为...当我们使用group by来分组统计的时候 当我们使用窗口函数的时候 很明显当我们使用group by分组时改变了原来数据库的行数,即生成了一张新表,但是...
  • having() "什么时候使用?" "可以在使用聚合函数的时候对聚合函数进行筛选!居然有聚合函数那就少不了group by了,这两个要对应使用having()离不开group by" -- 下面来波示例瞅瞅 表名称 emp (员工表) id name ...
  • 之前自己的代码都是str,或者直接就是python自己的object类型,那么我们什么时候需要category而不是str呢? 当 这一列 的值的种类(number of unique)非常少的时候,当需要给这一列的值表示某一个顺序的时候,...
  • 今日在用group by 分组的时候遇到了以上问题!看了sql语句一下午也没发现什么问题! 百度吧,也没有结果,仔细检查了一下发现我用的是phpstudy新推出的面板,mysql默认的是8.0版本的我并未进行更改一直那么用了!没...
  • 其实初学的时候看到这个会很困惑,为什么没有包含?聚合函数又是什么?小朋友,你是否有很多问号?首先讲一些很浅显的,也就是这个问题...接下来就是深层次的东西了,为什么要包含进去,为什么ORDER BY可以而GROUP ...
  • 什么用datastage而不直接sql

    千次阅读 2014-07-31 12:38:40
    不就实现了order by ,sum ,连接等sql功能吗,那么我干嘛不在数据源的时候就做好这些事情呢,何必这些stage呢? 例如我搞个odbc stage,自定义 sql select count(1),a from A group by a不就可以了吗

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 124
精华内容 49
关键字:

by什么时候用group