分组查询GROUP BY用法例子详解

在SQL中使用GROUP BY来对SELECT的结果进行数据分组,在具体使用GROUP BY之前需要知道一些重要的规定。

1、GROUP BY子句可以包含任意数目的列。也就是说可以在组里再分组,为数据分组提供更细致的控制。
2、如果在GROUP BY子句中指定多个分组,数据将在最后指定的分组上汇总。
3、GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用了表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
4、出了聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出。
5、如果分组列中有NULL值,则NULL将作为一个分组返回。如果有多行NULL值,它们将分为一组。
6、GROUP BY子句必须在WHERE子句之后,ORDER BY之前。

过滤分组

对分组过于采用HAVING子句。HAVING子句支持所有WHERE的操作。HAVING与WHERE的区别在于WHERE是过滤行的,而HAVING是用来过滤分组。

另一种理解WHERE与HAVING的区别的方法是,WHERE在分组之前过滤,而HAVING在分组之后以每组为单位过滤。

分组与排序

一般在使用GROUP BY子句时,也应该使用ORDER BY子句。这是保证数据正确排序的唯一方法。

SQL SELECT语句的执行顺序:

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序;
8、select 集合输出。

举个例子吧

select 考生姓名, max(总成绩) as max总成绩
from tb_Grade
where 考生姓名 is not null
group by 考生姓名
having max(总成绩) > 600
order by max总成绩

在上面的示例中 SQL 语句的执行顺序如下:

1、首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
2、执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
3、执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组
4、计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
5、执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
6、执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序.

例子

有数据表 comments
------------------------------------------------
| id | newsID | comment | theTime |
------------------------------------------------
| 1  |        1      |         aaa    |     11       |
------------------------------------------------
| 2  |        1      |         bbb    |     12       |
------------------------------------------------
| 3  |        2      |         ccc     |     12       |

------------------------------------------------

newsID是新闻ID,每条新闻有多条评论comment,theTime是发表评论的时间

现在想要查看每条新闻的最新一条评论:

select * from comments group by newsID 显然不行

select * from comments group by newsID order by theTime desc 是组外排序,也不行

下面有两种方法可以实现:

(1)
selet tt.id,tt.newsID,tt.comment,tt.theTime from( 
select id,newsID,comment,theTime from comments order by theTime desc) as tt group by newsID

(2)
select id,newsID,comment,theTime from comments as tt group by id,newsID,comment,theTime having
 theTime=(select max(theTime) from comments where newsID=tt.newsID)

时间: 2024-10-31 17:07:24

分组查询GROUP BY用法例子详解的相关文章

MySQL分组查询Group By实现原理详解_Mysql

由于GROUP BY 实际上也同样会进行排序操作,而且与ORDER BY 相比,GROUP BY 主要只是多了排序之后的分组操作.当然,如果在分组的时候还使用了其他的一些聚合函数,那么还需要一些聚合函数的计算.所以,在GROUP BY 的实现过程中,与 ORDER BY 一样也可以利用到索引. 在MySQL 中,GROUP BY 的实现同样有多种(三种)方式,其中有两种方式会利用现有的索引信息来完成 GROUP BY,另外一种为完全无法使用索引的场景下使用.下面我们分别针对这三种实现方式做一个分

oracle跨库查询dblink的用法实例详解_oracle

本文实例讲述了oracle跨库查询dblink的用法.分享给大家供大家参考,具体如下: 1.创建之前的工作 在创建dblink之前,首先要查看用户是否有相应的权限.针对特定的用户,使用 sqlplus user/pwd登录后,执行如下语句: 复制代码 代码如下: select * from user_sys_privs t where t.privilege like upper('%link%'); 在sys用户下,显示结果为: SYS CREATE DATABASE LINK NO SYS

Oracle expdp/impdp 用法例子 详解 举例 例子 他的这篇文章没有办法写出来 要这么改

 步骤:   导出端: 建立导出目录. grant create any directory to qbjmes;  create directory backup as '/tmp/backup'; grant read, write on directory backup to public;   导入端:  grant create any directory to qbjmes;  create directory backup as '/tmp/backup'; grant read,

CodeIgniter钩子用法实例详解_php实例

本文实例讲述了CodeIgniter钩子用法.分享给大家供大家参考,具体如下: CodeIgniter执行流程图中有7个椭圆的框,这表示在执行的过程中埋了7个钩子.那先来看看什么是钩子? 网上找到的两段文字: 钩子的完整实现应该叫事件驱动.事件驱动分为两个阶段,第一个阶段是注册事件,目的是给未来可能发生的"事件"起一个名字,简单的实现方法是用单例模式产生一个持久的对象或者注册一个全局变量,然后将事件名称,以及该事件对应的类与方法插入全局变量即可.也就是挂载一个钩子. 第二个阶段是触发事

PHP数据库表操作的封装类及用法实例详解_php技巧

本文实例讲述了PHP数据库表操作的封装类及用法.分享给大家供大家参考,具体如下: 数据库表结构: CREATE TABLE `test_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(45) NOT NULL, `password` varchar(45) NOT NULL, `nickname` varchar(45) NOT NULL, `r` tinyint(4) NOT NULL, PRIMARY KEY

SQL SERVER分区具体例子详解

原文:SQL SERVER分区具体例子详解 在日常工作中,我们会遇到以下的情况,一个表每日数万级的增长,而查询的数据通常是在本月或今年,以前的数据偶尔会用到,但查询和插入的效率越来越慢,用数据库分区会有助于解决这个问题.关于分区的理论知识网上很多我这里就不在累赘,我从一个实际例子出发,看如何将一个已经运行了很长时间的普通表进行分区. 提出问题 需解决问题:有一个数据表数据很大,我们通常的查询是在一个季度中.我们需要将以往年份的数据按不同年份存在文件组里,当年的数据分为4个季度存,如果到了新的一年

Oracle触发器用法实例详解_oracle

本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行.因此触发器不需要人为的去调用,也不能调用.然后,触发器的触发条件其实在你定义的时候就已经设定好了.这里面需要说明一下,触发器可以分为语句级触发器和行级触发器.详细的介绍可以参考网上的资料,简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发.而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次. 具体举例: 1.

jQuery选择器用法实例详解_jquery

本文实例讲述了jQuery选择器用法.分享给大家供大家参考,具体如下: jQuery 使用两种方式来选择 html 的 element,第一种使用CSS和Xpath选择器联合起来形成一个字符串来传送到jQuery的构造器(如:$("div > ul a")):第二种是用jQuery对象的几个methods(方法).这两种方式还可以联合起来混合使用. 使用 CSS 和 XPath 选择器选择的方法有许多种用法,关于详细的 CSS 选择器可参考本站相关文章. 首先来看通过元素的 ID

Android开发之Animations动画用法实例详解_Android

本文实例讲述了Android开发之Animations动画用法.分享给大家供大家参考,具体如下: 一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 Java Code代码中 AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸