1.先回顾下基础知识:

Group By 对数据分组聚合,常常伴随having使用。having可以处理单记录,也可以小组为单位处理。

语句:

SELECT col
FROM table
[WHERE]
[GROUP BY]
[HAVING]
[ORDER BY [ASC]|[DESC]]

1.FROM子句生成数据集
2.WHERE子句过滤1生成的数据集
3.GROUP BY子句聚合2生成的数据集
4.HAVING子句过滤3生成的数据集
5.SELECT子句在4的结果上做些转换
6.ORDER BY子句对5变换后的数据集进行排序

在SELECT子句但不在GROUP BY子句中的字段必须使用聚合函数。
聚合函数是对一组值执行计算并返回单个值得确定性函数,如COUNT,SUM,AVG,MIN,MAX,VAR_POP,VAR_SAMP等。

2.正文:

从SQL-92标准开始,强制规定了GROUP BY子句的使用,主流厂家也多数已经遵守,即:SELECT的字段,要么在GROUP BY中已经列出,要么使用了聚合函数。

如:有user表,order表,想看每个用户的消费情况,即按userid查询order分组数据,我们真正想要的是:

SELECT u.userid,u.username,u.city,SUM(o.OrderTatal) AS total
FROM user u LEFT JOIN order o ON u.userid=o.userid
GROUP BY u.userid

但不幸,这条语句不符合GROUP BY要求,必须把SELECT中出现,但没使用聚合函数的字段u.username,u.city加入到GROUP BY 子句中,我们其实不关心是否对这2个字段聚合,聚合这2字段对我们期望的结果意义也不大,但不写会报错,于是通常会写成:

SELECT u.userid,u.username,u.city,SUM(o.OrderTatal) AS total
FROM user u LEFT JOIN order o ON u.userid=o.userid
GROUP BY u.userid,u.username,u.city

这种列称为功能依赖列,这样写也满足了要求,但一个不足是我们真正关心的汇总条件被淹没了。如果时间隔得久一点或是语句复杂一点,你有把握区分出其实是多余的功能依赖列吗?我们要按每个user汇总,也要区分具体city?有时你不得不去了解整个查询的基础。

改进这种类型的GROUP BY,不要让真正关心的汇总条件被淹没。改进后的语句:

SELECT u.userid,u.username,u.city,o.total
FROM user u
LEFT JOIN
(SELECT t.userid,SUM(t.OrderTotal) AS Total FROM Order AS t GROUP BY t.userid) AS o
ON u.userid=o.userid;

改进一条Group By的更多相关文章

  1. UITextFiled的输入框改成一条下划线

    在一些程序的界面中,它们的编辑框是一条线,而UITextFiled本身并没有这种style,所有需要我们自己设置.方法还是挺多的 第一种 , (1).我们可以声明一个类继承与UITextFiled ( ...

  2. user_jj两条记录改成一条

    1.前台index控制器,用user_jj.*add找到,home_ddxx_pcz_cl() 2.前台index控制器,用user_jj.*add找到,tgbz_list_sd_cl(),tgbz_ ...

  3. sql-修改每条数据的某一个字段的值

    update B set B.maildata =(select SUBSTRING(maildata,0,3) from basedata where basedata.cid = B.cid)+( ...

  4. google protocol buffer——protobuf的问题及改进一

    这一系列文章主要是对protocol buffer这种编码格式的使用方式.特点.使用技巧进行说明,并在原生protobuf的基础上进行扩展和优化,使得它能更好地为我们服务. 在上一篇文章中,我们完整了 ...

  5. [MyBatis]向MySql数据库插入一千万条数据 批量插入用时6分 之前时隐时现的异常不见了

    本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 这次实验的环境仍然和上 ...

  6. android之存储篇_SQLite数据库_让你彻底学会SQLite的使用

    SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中 ...

  7. 3.3 SQLite数据库

    1.使用嵌入式关系型SQLite数据库存储数据 轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用 ...

  8. SQLite数据库增删改查操作

    一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字).TEXT(字符串 ...

  9. (转)SQLite数据库增删改查操作

    原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数 ...

随机推荐

  1. nyoj 45-棋盘覆盖 (高精度, Java)

    棋盘覆盖 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...

  2. Json模块和Pickle模块的使用

    在对数据进行序列化和反序列化是常见的数据操作,Python提供了两个模块方便开发者实现数据的序列化操作,即 json 模块和 pickle 模块.这两个模块主要区别如下: json 是一个文本序列化格 ...

  3. 初探three.js

    相信大多数选择前端的小伙伴都有一个设计师的梦,今天我来说一说three.js.three.js是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.学习了 ...

  4. vue项目中安装使用vux

    vux是个vue的移动端框架. 目前移动端UI框架这么多,为啥选择vux呢?vux虽然说是个个人维护项目,但是有15000+个star,应该不比其他的团队开源框架差. 最重要的是,目前要做微信公众号和 ...

  5. 使用 Topshelf 组件一步一步创建 Windows 服务 (2) 使用Quartz.net 调度

    上一篇说了如何使用 Topshelf 组件快速创建Windows服务,接下来介绍如何使用 Quartz.net 关于Quartz.net的好处,网上搜索都是一大把一大把的,我就不再多介绍. 先介绍需要 ...

  6. C#学习笔记03--循环和一维数组

    一.循环(重点) 什么时候用循环? 想让一段代码执行多次, 这段代码可能不一样但是一定有一个规律. 1.while 循环 格式:  while(循环条件) { 循环执行的代码; } 循环的机制:  当 ...

  7. Java语法进阶10-多线程

    多线程 并发与并行.进程,线程调度自行百度 线程(thread):是一个进程中的其中一条执行路径,CPU调度的最基本调度的单位.同一个进程中线程可以共享一些内存(堆.方法区),每一个线程又有自己的独立 ...

  8. Spring Boot整合Elasticsearch启动报错

    如果你遇见下面的错误,很可能是你的springboot和es版本关系不对应 ERROR 14600 --- [ main] .d.e.r.s.AbstractElasticsearchReposito ...

  9. UiPath之获取邮件相关信息

    大家好,小U又来给大家分享UiPath文章,争取每一篇文章都给大家带来满满的干货. 本次案例是告诉大家如何使用GetOutLookMailMessage这个Activity, 案例的目的是将某个特定人 ...

  10. Java面向基础概述和三大特性

    Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...