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. Python3.7.1学习(八) Python访问SQL Server数据库

    一.pip install pymssql即可安装pymssql库 二.Python连接SQL Server数据库     实例代码如下: # -*- coding:utf-8 -*-"&q ...

  2. 力扣(LeetCode)学生出勤记录I 个人题解

    给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个学生的出勤记录中不超过一个' ...

  3. scipy.sparse的csc_matrix、csr_matrix与coo_matrix区别与应用(思维导图)

  4. Nginx 匹配流程一览

    在 nginx server 模块中,location 的定义长被用来匹配一个标准的 URI, 并根据 URI 的不同做出相应的服务方案. nginx location 匹配的优先级 在 locati ...

  5. 理解Redis单线程运行模式

    本文首发于:https://mp.weixin.qq.com/s/je4nqCIq6ARhSV2V5Ymmtg 微信公众号:后端技术指南针 0.概述 通过本文将了解到以下内容: Redis服务器采用单 ...

  6. Pod镜像拉取策略imagePullPolicy

    默认值是IfNotPresent Always 总是拉取: 首先获取仓库镜像信息, 如果仓库中的镜像与本地不同,那么仓库中的镜像会被拉取并覆盖本地. 如果仓库中的镜像与本地一致,那么不会拉取镜像. 如 ...

  7. android 网络异步加载数据进度条

    ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...

  8. Beta阶段贡献分配

    此作业要求参见:http://edu.cnblogs.com/campus/nenu/2019fall/homework/10006 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 刘信鹏 要 ...

  9. 2019-9-18:渗透测试,基础学习,ubuntu搭建LNMP,phpmyadmin

    1,安装nginx:sudo apt-get install nginx 2,安装完成,输入,service nginx start开启服务,输入:netstat -ntulp |grep 80,确定 ...

  10. 剑指Offer-29.最小的K个数(C++/Java)

    题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 分析: 最先想到的是将数组升序排列,返回前k个元素.不过排序的话效率 ...