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. Java,你告诉我 fail-fast 是什么鬼?

    本篇我们来聊聊 Java 的 fail-fast 机制,文字一如既往的有趣哦. 01.前言 说起来真特么惭愧:十年 IT 老兵,Java 菜鸟一枚.今天我才了解到 Java 还有 fail-fast ...

  2. 微服务架构 - Jimu(积木) 升级 1.0.0 支持 .Net Core 3.0

    如果不知道 Jimu(积木) 是啥,请移步 .Net Core 分布式微服务框架介绍 - Jimu 这次升级除了支持 .Net Core 3.0 还新增部分功能,如 REST, 链路跟踪等,以下为详细 ...

  3. goland_beego框架学习--api实现

    goland_beego框架学习--api实现 完成一项api实现的流程 (1)beego框架的router层里面注册路由 正则路由 为了用户更加方便的路由设置,beego 参考了 sinatra 的 ...

  4. ubuntu 16.04 上使用pybind11进行C++和Python代码相互调用 | Interfacing C++ and Python with pybind11 on ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/a41adc1/,欢迎阅读! Interfacing C++ and Python with pybind11 on ubuntu ...

  5. ETCD:单机单节点

    原文地址:Setting up local clusters 设置单节点集群 对于测试环境与开发环境,最快速与简单的方式是配置一个本地集群.对于生产环境,参考集群部分. 本地单节点集群 启动一个集群 ...

  6. php中static关键字的理解

    函数内的static变量 static静态变量的理解 静态变量 类型说明符是static. 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整 ...

  7. VueRouter爬坑第二篇-动态路由

    VueRouter系列的文章示例编写时,项目是使用vue-cli脚手架搭建. 项目搭建的步骤和项目目录专门写了一篇文章:点击这里进行传送 后续VueRouter系列的文章的示例编写均基于该项目环境. ...

  8. Parallel Feature Pyramid Network for Object Detection

    Parallel Feature Pyramid Network for Object Detection ECCV2018 总结: 文章借鉴了SPP的思想并通过MSCA(multi-scale co ...

  9. 前端vue如何下载或者导出word文件和excel文件

    前端用vue怎么接收并导出文件 window.location.href = "excel地址" 如果是 get 请求,那直接换成 window.open(url) 就行了 创建一 ...

  10. jQuery实现倒计时重新发送短信验证码功能示例

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...