在前面介绍的使用SQL语句执行查询操作时,我们可能发现查询出的数据结果的排序是无序的。为了更好的观察数据表中的查询结果,开发人员或者用户经常要对查询的数据进行排序操作,这就需要使用ORDER BY子句。在数据库的实际应用中,有时需要对查询的数据进行统计和分组操作,这就需要了解SQL语句的聚合函数和GROUP BY子句的使用。有些时候开发人员或者用户还希望对分组后的结果做进一步的统计,在SQL语句中提供了ROLLUP这样一个关键字用来对数据进行统计。最后还将介绍主要数据库中如何限制结果集的行数。
1.使用ORDER BY子句对数据记录进行排序
指定表中的一列进行排序
通过ORDER BY 子句可以对查询结果中指定的列进行升序或者是降序操作,这取决于ORDER BY子句后的关键字,如果ORDER BY子句后面的关键字是ASC,则对查询的结果执行升序操作;如果ORDER BY子句后面的关键字是DESC,则对查询的结果执行降序操作。其语法规则如下
ORDER BY 列名1 [ASC|DESC]
其中列名1表示需要对该列进行排序操作。关键字ASC和DESC是可选的。如果ORDER BY 子句后面不写ASC或者是DESC,则默认执行的是升序操作。
SELECT teaID,teaName,dept,profession,salary FROM T_teacher WHERE dept ='计算机系' ORDER BY salary ASC
指定表中列的位置序号进行排序
排在使用ORDER BY子句进行排序操作时,除了可以使用列名对指定列进行序,也可以使用该列在选择列表中的位置的序号对其进行排序。
SELECT teaID,teaName,dept,profession,salary FROM T_teacher ORDER BY 5 ASC
对SELECT语句中的非选择列进行排序
ORDER BY子句中也可以对没有在SELECT语句中出现的选择列进行排序操作。
SELECT teaID,teaName,dept,profession FROM T_teacher WHERE dept ='计算机系' ORDER BY salary
指定表中的多列进行排序
ORDER BY子句除了可以指定单列进行排序操作,也可以指定数据表中的多个列进行排序操作。如果要指定数据表中的多个列进行排序操作,则指定排序的列与列之间需要用逗号隔开。其语法规则如下:
ORDER BY 列名1[ASC|DESC],列名2 [ASC|DESC]
其中列名1和列名2表示需要对指定的数据列进行排序操作。列名1和列名2之间用逗号进行分割。关键字ASC和DESC是可选的。如果ORDER BY 子句后面不写ASC或者DESC,则默认执行的是升序操作。首先,根据ORDER BY中指定的第一列进行排序;然后,再根据ORDER BY子句中指定的第二列的升序或者降序方式进行排序。
SELECT teaID,teaName,dept,profession,salary FROM T_teacher ORDER BY salary DESC,dept ASC
2.常用的聚合函数
聚合函数也被称为分组函数或者统计函数,主要用于对得到的一组数据进行统计计算,例如求和、求平均值等,常用的聚合函数包括COUNT、MAX、MIN、SUM和AVG五个。
COUNT、SUM和AVG函数中可以使用DISTINCT关键字去除指定列中的重复项。使用DISTINCT关键字后只是对不同行的值进行统计。
MAX和MIN函数中的列或者表达式可以是数字型、字符型或者是日期类型的值。如果MAX和MIN函数中的列或者表达式是字符型的,则按照首字母从A到Z的顺序排序,如果首字母相同,则比较字符串中第二个字母的大小,以此类推。汉字则是按照其汉语拼音的全拼来排序。
SELECT MAX(salary),MIN(salary) FROM T_teacher
SUM和AVG函数中的表达式只能是数字类型的值。
除了COUNT(*)之外,其他的几个函数在计算时都忽略表达式中的空值(NULL行)。
COUNT函数是用来计算数据表中的总行数,SUM函数是用来计算数据表中某一列的属性值的总和。
SELECT SUM(salary),COUNT(salary),AVG(salary) FROM T_teacher
聚合函数只能出现在SELECT语句、GROUP BY子句以及HAVING子句中,WHERE子句中不能出现聚合函数。
3.使用GROUP BY子句对表中数据进行分组
单列分组
使用GROUP BY子句对数据表中的某一列进行分组时,会对指定分组的列中不同的值都计算出一个统计结果。其语法格式如下:
GROUP BY列名1
其中列名1表示需要对该列进行分组操作。
SELECT dept,COUNT(profession) FROM T_teacher GROUP BY dept
Select同时包含数据列和聚合函数时,必须使用Group By。
多列分组
使用GROUP BY子句对数据表中的多个列进行分组时,会对指定分组的多个列中不同的值都计算出一个统计结果。其语法格式如下:
GROUP BY列名1,列名2…
其中列名1和列名2表示需要对指定列进行分组操作。列名1和列名2之间用逗号进行分割。
使用HAVING子句子限制分组后的查询结果
如果想要对分组后的结果限制查询条件,就需要使用HAVING子句。由于HAVING子句是用来限制分组后的查询结果,所以该子句需要放到GROUP BY子句的后面使用。其语法格式如下:
GROUP BY列名1 HAVING 条件表达式
其中列名1表示需要对该列进行分组操作。HAVING子句后的条件表达式是用来筛选分组后的结果。在HAVING子句中经常使用聚合函数对分组后的结果进行筛选。
SELECT dept,profession,MAX(salary) FROM T_teacher GROUP BY dept,profession HAVING MAX(salary)>3000
SELECT profession,MAX(salary) FROM T_teacher WHERE age>30 GROUP BY profession HAVING MAX(salary)>3000
对分组结果进行排序
很多时候,对数据表中数据进行分组后,还希望对分组的结果进行排序操作。如果想对使用了GROUP BY子句的分组结果进行排序的话,就需要使用ORDER BY子句。
SELECT dept,profession,MAX(salary) FROM T_teacher GROUP BY dept ORDER BY MAX(salary) DESC
按照GROUP BY后分得的各组中的最高工资给组排序;而如下语句则是按照每组的第一行的工资给组排序。
SELECT dept,profession,MAX(salary) FROM T_teacher GROUP BY dept ORDER BY salary DESC
GROUP BY子句中处理NULL值
在使用GROUP BY子句对对指定列进行分组时,有时可能会遇到指定列中含有NULL值的情况。此时,GROUP BY子句会将该列中所有的NULL值归为一组。
如果要得到每个分组中的工资的最大值对应的行(而不是分组的第一行),可以使用子查询等方法,详细以后讨论。
select teaName,salary from (select * from t_teacher order by salary desc) temp group by dept order by salary
4.使用ROLLUP关键字统计数据
在实际应用中,有时不仅需要得到分组后的统计结果,还希望对分组的统计结果做进一步的计算,例如通过对教师信息表(T_teacher)中的院校和教师职称进行分组,得到分组后教师的工资,还希望对每一个院系中的教师的工资做一个阶段性的统计,希望得到各个院校中不同职称的教师的工资的加和(相当于小计),还希望得到所有院校不同职称教师工资的总和(相当于总计)。这个时候仅仅使用GROUP BY子句是无法做到的,此时就需要使用ROLLUP关键字。
ROLLUP关键字使用时需要放到GROUP BY关键字的后面。ROLLUP关键字在不同的数据库中的使用方式上稍有不同。
a.在MySQL和Microsoft SQL Server数据库中需要使用WITH ROLLUP。其语法格式如下:
GROUP BY 列名1 WITH ROLLUP
其中列名1表示要对该列进行分组,WITH ROLLUP关键字表示要对分组的结果进行统计。当然也可以对多个列进行分组,并统计分组后的结果。其语法格式如下:
GROUP BY 列名1 ,列名2 WITH ROLLUP
b.在Oracle数据库中,ROLLUP关键字需要紧跟在GROUP BY关键字的后面,然后再写需要分组的字段。其语法格式如下:
GROUP BY ROLLUP (列名1,列名2…)
5.限制结果集行数
有些时候,开发人员或者用户并不希望将查询结果的数据列中的数据全部显示出来,而是只希望显示其中的几行,尤其是在需要分页的操作中。例如,一个数据表最后查询出了100条记录,而开发人员或者用户只关心其中前10条记录的值,这就需要对查询结果中的数据记录的行数进行限制。在不同的数据库中限制结果集行数的方法也不尽相同。
a.在MySQL数据库中限制结果集行数可以使用LIMIT关键字,它可以用来限制查询出来的数据结果的个数。通过使用LIMIT关键字可以让开发人员或者用户得到其中想要的部分的结果。如果要使用LIMIT限制结果集行数,可以使用下面的语法格式。
LIMIT n
其中LIMIT是关键字,数字n表示要限制结果集行数。
SELECT teaID,teaName,dept,profession FROM T_teacher ORDER BY teaID LIMIT 3 -- 升序排序后的前3条记录 LIMIT 3,3 -- 升序排序后的第4条到第6条记录
b.Oracle数据库中不支持类似于 MySQL 中的 LIMIT关键字来限制结果集行数,但是在 Oracle数据库中可以使用ROWNUM关键字限制结果集的行数。其语法格式如下:
WHERE ROWNUM<n
其中ROWNUM关键字表示对符合条件结果的序列号,它的起始值总是从1开始的。数字n表示要限制的结果集的行数。当然,这里的比较运算符除了可以使用(<)小于以外,还可以使用(<=)小于等于。
c.MySQL数据库和Oracle数据库中使用LIMIT关键字和ROWNUM的方法限制结果集行数,在Microsoft SQL Server数据库中需要使用TOP关键字。其语法格式如下:
SELECT TOP n [PRECENT] 列名1,列名2 …
FROM 表名
…
其中,TOP是表示限制结果集行数的关键字;数字n表示限制结果集行数;PRECENT关键字表示返回查询的结果集中前n%的行数,它是可选的。
相关推荐
在SQL Server中,分组和排序是数据处理的两个关键操作。它们可以帮助我们对大量数据进行聚合、组织和筛选,以便更好地分析和理解数据。本文将深入探讨如何在SQL Server中实现分组排序并获取每组的特定行数据。 首先...
本文将针对ACCESS 2003环境下报表设计的关键技术——报表数据排序与分组汇总及表达式的使用,展开详细介绍,旨在帮助学习者深入理解并掌握其实际应用。 首先,我们来探讨报表数据排序。排序是根据数据的特定顺序将...
下面我们将深入探讨如何在Java中实现集合的分组与排序。 1. **集合分组**: 集合分组通常涉及到`GroupingBy`操作,这在Java 8引入的流(Stream)API中得到了很好的支持。`Collectors.groupingBy`方法允许我们将...
在IT行业中,排序和分组是数据处理的关键环节,尤其在大数据分析、数据库管理以及算法设计等场景下显得尤为重要。本文将围绕“排序后分组”这一主题,结合描述中的“类似微信通讯录”功能,深入探讨相关知识点,并...
SQuirreL SQL:数据排序与分组技术教程.docx
本文将详细探讨在 MapReduce2 中如何实现自定义排序和分组,以满足特定的数据处理需求。 首先,了解 MapReduce 的工作流程是必要的。Map 阶段将输入数据分割成多个块,并在各个节点上并行处理。Reduce 阶段则负责...
SQL数据排序与分组是数据库查询中的核心概念,它们对于数据的分析和处理至关重要。首先,数据分组的目的是为了将具有相同值的记录合并在一起,这样可以方便地对这些记录进行统计分析。例如,如果我们有一个销售记录...
本示例"按拼音排序分组LIST"着重于展示如何在Android应用中实现一个列表(List),该列表中的元素按照汉字的拼音首字母从A到Z进行排序,并且用户可以点击每个字母来筛选显示相应首字母的数据。这个功能在很多应用...
内容概要:本文详细介绍了SQL中的数据排序与分组技术。首先讲解了ORDER BY子句的基本用法,包括单列排序、多列排序和ASC/DESC关键字的使用。接着,讨论了GROUP BY子句的功能,包括数据分组、聚合函数的使用以及...
数据排序与分组 SQL函数与表达式 子查询与嵌套查询 连接查询:内连接与外连接 事务处理与SQL 视图与存储过程 索引与优化查询 数据库安全性与权限管理 SQL与大数据处理 SQL在Web开发中的应用 SQL高级查询技巧 数据库...
JavaScript数据排序,根据数据中的字段,自定义排序方式,实现数据根据不同的字段值分组显示
2. **行组或列组排序**:对于行或列分组的数据,可以通过设置“组”属性来调整排序。在“组”面板中,找到对应的行组或列组,设置其“排序方式”和“排序依据”。 3. **全局排序**:在报表设计界面顶部的“排序”...
4. 希尔排序:希尔排序是对插入排序的一种改进,通过增量序列将数据分组进行排序,然后逐渐减少增量直到为1。其时间复杂度通常比O(n^2)好,但具体依赖于增量序列的选择。 5. 归并排序:归并排序采用分治策略,将...
在IT领域,数据结构与排序算法是计算机科学的基础,它们对于优化程序性能至关重要。下面将详细探讨标题和描述中提到的8种排序算法,并逐一解析它们的工作原理、效率以及应用场景。 1. **快速排序**:由C.A.R. Hoare...
数据排序使用户可以根据需要调整列的顺序。`DataGrid`提供了两种方式实现排序:一是通过设置`DataGridColumn.SortDirection`和`DataGridColumn.HeaderStyle`,二是通过`ICollectionView`接口的`SortDescriptions`...
在iOS开发中,好友列表的排序与分组是一项常见的需求,尤其在社交应用中,用户往往需要按照不同的标准查看和管理他们的联系人。这个“好友列表排序,分组”的demo展示了如何实现这样的功能。首先,我们需要理解好友...
在SQL中,分组排序问题通常涉及到数据的聚合和排名,这是数据分析和报表生成的关键步骤。本问题的目标是检索每学期每门课的学生排名情况,包括学期、课程号、学号、总评成绩以及排名,按照特定的排序规则进行输出。 ...
WPF中的数据排序通常通过数据集本身实现,而不是直接在ListBox上操作。如果你的数据源继承自ICollectionView(如ICollectionView或ICollectionViewLiveShaping),你可以直接调用其SortDescriptions或...
在SQL中实现随机分组后的随机排序是一种较为高级的数据处理技术,主要用于数据分析、报表生成等场景,能够帮助用户获得更加多样化的数据视图。本文将详细介绍如何通过SQL语句实现这一功能,并对其中涉及的关键概念和...
8. **希尔排序**:希尔排序是插入排序的改进版,通过增量序列将待排序的元素进行分组,然后对每个组进行插入排序,最后进行一次插入排序。希尔排序的时间复杂度取决于增量序列的选择,通常比简单插入排序更快,但...