改进一条Group By
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的更多相关文章
- UITextFiled的输入框改成一条下划线
在一些程序的界面中,它们的编辑框是一条线,而UITextFiled本身并没有这种style,所有需要我们自己设置.方法还是挺多的 第一种 , (1).我们可以声明一个类继承与UITextFiled ( ...
- user_jj两条记录改成一条
1.前台index控制器,用user_jj.*add找到,home_ddxx_pcz_cl() 2.前台index控制器,用user_jj.*add找到,tgbz_list_sd_cl(),tgbz_ ...
- sql-修改每条数据的某一个字段的值
update B set B.maildata =(select SUBSTRING(maildata,0,3) from basedata where basedata.cid = B.cid)+( ...
- google protocol buffer——protobuf的问题及改进一
这一系列文章主要是对protocol buffer这种编码格式的使用方式.特点.使用技巧进行说明,并在原生protobuf的基础上进行扩展和优化,使得它能更好地为我们服务. 在上一篇文章中,我们完整了 ...
- [MyBatis]向MySql数据库插入一千万条数据 批量插入用时6分 之前时隐时现的异常不见了
本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 这次实验的环境仍然和上 ...
- android之存储篇_SQLite数据库_让你彻底学会SQLite的使用
SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中 ...
- 3.3 SQLite数据库
1.使用嵌入式关系型SQLite数据库存储数据 轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用 ...
- SQLite数据库增删改查操作
一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字).TEXT(字符串 ...
- (转)SQLite数据库增删改查操作
原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数 ...
随机推荐
- hdu 1028 Sample Ignatius and the Princess III (母函数)
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- C语言|博客作业02
这个作业属于哪个课程 C程序语言设计 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/8654 我在这个课程的目标是 ...
- linux添加、删除、升级软件包 yum rpm dpkg
1.红帽7主要采用yum和rpm SN command 1 rpm -qa --query --all. 2 rpm -ql <package> 列出包中的文件 3 rpm -ivh ...
- python day 1 homework 1
作业一要求: 1 输入用户名密码 2 认证成功后显示欢迎信息 3 输错三次后锁定 import os #生成保存用户信息的字典 d_userinfo = {} #保存用户登录字典 input_logi ...
- shell命令管道未读完阻塞了子进程,与等待其结束的父进程死"锁"。
在exec执行一个子进程,我们希望使用管道取得子进程在重定向后的标准输出上的结果,同时等待子进程的结束.那么是等待子进程结束后才取管道数据,还是边取数据边等待子进程结束呢? 这里有一个调试的例子.u0 ...
- python进程与线程的操作
进程操作: # project :Python_Script # -*- coding = UTF-8 -*- # Autohr :XingHeYang # File :processTest.py ...
- location 优先级
###我只是个搬运工 规则 等号类型(=)的优先级最高.一旦匹配成功,则不再查找其他匹配项 前缀普通匹配(^~)优先级次之.不支持正则表达式.使用前缀匹配,如果有多个location匹配的话,则使用表 ...
- Linux 7开机自启项查看并设置
在Linux6中查看及设置开机自启信息是使用chkconfig命令,Linux7中此命令已经被替代,接下来我们就来研究下Linux7中的区别所在. chkconfig --list Note: T ...
- 2019年12月1日Linux开发手记
配置ubuntu摄像头: 1.设置→添加→usb控制器→兼容usb3.0 2.虚拟机→可移动设备→web camera→连接(断开主机) 3.查看是否配置成功,打开终端,输入: susb ls /de ...
- JNI教程与技术手册
转载请标明出处:http://blog.csdn.net/shensky711/article/details/52806794 本文出自: [HansChen的博客] 概述 对于JNI,有些童鞋在没 ...