首頁 資料庫 mysql教程 8、表中数据的排序与分组_MySQL

8、表中数据的排序与分组_MySQL

Jun 01, 2016 pm 01:34 PM
開發 資料庫 數據表 使用者

bitsCN.com

在前面介绍的使用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,salaryFROM T_teacher WHERE dept ='计算机系'ORDER BY salary ASC
登入後複製

指定表中列的位置序号进行排序
排在使用ORDER BY子句进行排序操作时,除了可以使用列名对指定列进行序,也可以使用该列在选择列表中的位置的序号对其进行排序。

SELECT teaID,teaName,dept,profession,salaryFROM T_teacher ORDER BY 5 ASC
登入後複製

对SELECT语句中的非选择列进行排序
ORDER BY子句中也可以对没有在SELECT语句中出现的选择列进行排序操作。

SELECT teaID,teaName,dept,professionFROM 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,salaryFROM 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_teacherGROUP 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_teacherGROUP BY dept,professionHAVING MAX(salary)>3000
登入後複製
注意:GROUP BY下才有HAVING,HAVING用于组;而WHERE是针对SELECT的(针对于表或者视图),WHERE用于分布前。
SELECT profession,MAX(salary)FROM T_teacherWHERE age>30GROUP BY professionHAVING MAX(salary)>3000
登入後複製

对分组结果进行排序
很多时候,对数据表中数据进行分组后,还希望对分组的结果进行排序操作。如果想对使用了GROUP BY子句的分组结果进行排序的话,就需要使用ORDER BY子句。

SELECT dept,profession,MAX(salary)FROM T_teacherGROUP BY deptORDER BY MAX(salary) DESC
登入後複製

按照GROUP BY后分得的各组中的最高工资给组排序;而如下语句则是按照每组的第一行的工资给组排序。

SELECT dept,profession,MAX(salary)FROM T_teacherGROUP BY deptORDER BY salary DESC
登入後複製

GROUP BY子句中处理NULL值
在使用GROUP BY子句对对指定列进行分组时,有时可能会遇到指定列中含有NULL值的情况。此时,GROUP BY子句会将该列中所有的NULL值归为一组。
如果要得到每个分组中的工资的最大值对应的行(而不是分组的第一行),可以使用子查询等方法,详细以后讨论。

select teaName,salaryfrom (select * from t_teacher order by salary desc) tempgroup by dept<br>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,professionFROM T_teacherORDER BY teaIDLIMIT 3-- 升序排序后的前3条记录LIMIT 3,3-- 升序排序后的第4条到第6条记录
登入後複製

b.Oracle数据库中不支持类似于 MySQL 中的 LIMIT关键字来限制结果集行数,但是在 Oracle数据库中可以使用ROWNUM关键字限制结果集的行数。其语法格式如下:
WHERE ROWNUM其中ROWNUM关键字表示对符合条件结果的序列号,它的起始值总是从1开始的。数字n表示要限制的结果集的行数。当然,这里的比较运算符除了可以使用(c.MySQL数据库和Oracle数据库中使用LIMIT关键字和ROWNUM的方法限制结果集行数,在Microsoft SQL Server数据库中需要使用TOP关键字。其语法格式如下:
SELECT TOP n [PRECENT] 列名1,列名2 …
FROM 表名

其中,TOP是表示限制结果集行数的关键字;数字n表示限制结果集行数;PRECENT关键字表示返回查询的结果集中前n%的行数,它是可选的。

bitsCN.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 Jul 18, 2024 am 05:48 AM

蘋果公司最新發布的iOS18、iPadOS18以及macOSSequoia系統為Photos應用程式增添了一項重要功能,旨在幫助用戶輕鬆恢復因各種原因遺失或損壞的照片和影片。這項新功能在Photos應用的"工具"部分引入了一個名為"已恢復"的相冊,當用戶設備中存在未納入其照片庫的圖片或影片時,該相冊將自動顯示。 "已恢復"相簿的出現為因資料庫損壞、相機應用未正確保存至照片庫或第三方應用管理照片庫時照片和視頻丟失提供了解決方案。使用者只需簡單幾步

在PHP中使用MySQLi建立資料庫連線的詳盡教學 在PHP中使用MySQLi建立資料庫連線的詳盡教學 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立資料庫連線:包含MySQLi擴充(require_once)建立連線函數(functionconnect_to_db)呼叫連線函數($conn=connect_to_db())執行查詢($result=$conn->query())關閉連線( $conn->close())

如何在PHP中處理資料庫連線錯誤 如何在PHP中處理資料庫連線錯誤 Jun 05, 2024 pm 02:16 PM

PHP處理資料庫連線報錯,可以使用下列步驟:使用mysqli_connect_errno()取得錯誤代碼。使用mysqli_connect_error()取得錯誤訊息。透過擷取並記錄這些錯誤訊息,可以輕鬆識別並解決資料庫連接問題,確保應用程式的順暢運作。

PHP 函數的新特性如何簡化開發流程? PHP 函數的新特性如何簡化開發流程? May 04, 2024 pm 09:45 PM

PHP函數的新功能大大簡化了開發流程,包括:箭頭函數:提供簡潔的匿名函數語法,減少程式碼冗餘。屬性類型聲明:為類別屬性指定類型,增強程式碼可讀性和可靠性,並在執行時自動進行類型檢查。 null運算符:簡潔地檢查和處理null值,可用於處理可選參數。

如何在 Golang 中使用資料庫回呼函數? 如何在 Golang 中使用資料庫回呼函數? Jun 03, 2024 pm 02:20 PM

在Golang中使用資料庫回呼函數可以實現:在指定資料庫操作完成後執行自訂程式碼。透過單獨的函數新增自訂行為,無需編寫額外程式碼。回調函數可用於插入、更新、刪除和查詢操作。必須使用sql.Exec、sql.QueryRow或sql.Query函數才能使用回呼函數。

如何在 Golang 中將 JSON 資料保存到資料庫中? 如何在 Golang 中將 JSON 資料保存到資料庫中? Jun 06, 2024 am 11:24 AM

可以透過使用gjson函式庫或json.Unmarshal函數將JSON資料儲存到MySQL資料庫中。 gjson函式庫提供了方便的方法來解析JSON字段,而json.Unmarshal函數需要一個目標類型指標來解組JSON資料。這兩種方法都需要準備SQL語句和執行插入操作來將資料持久化到資料庫中。

如何用 Golang 連接遠端資料庫? 如何用 Golang 連接遠端資料庫? Jun 01, 2024 pm 08:31 PM

透過Go標準庫database/sql包,可以連接到MySQL、PostgreSQL或SQLite等遠端資料庫:建立包含資料庫連接資訊的連接字串。使用sql.Open()函數開啟資料庫連線。執行SQL查詢和插入操作等資料庫操作。使用defer關閉資料庫連線以釋放資源。

PHP與不同資料庫的連接:MySQL、PostgreSQL、Oracle和更多 PHP與不同資料庫的連接:MySQL、PostgreSQL、Oracle和更多 Jun 01, 2024 pm 03:02 PM

PHP連接資料庫指南:MySQL:安裝MySQLi擴展,建立連線(servername、username、password、dbname)。 PostgreSQL:安裝PgSQL擴展,建立連線(host、dbname、user、password)。 Oracle:安裝OracleOCI8擴展,建立連線(servername、username、password)。實戰案例:取得MySQL資料、PostgreSQL查詢、OracleOCI8更新記錄。

See all articles