数据库sql分组
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SELECT pnumber, budget, gross, gross – budget FROM Project WHERE profit >= 30000.00 AND profit <= 70000.00 ORDER BY 4 DESC
一、排序数据
4、多级排序
SQL中可以指定多列进行排序。初级排序对查询结果进行分类并排序,第 二级排序对初级排序分好的类中的数据在相同的数据中进行再次排序。 用户也可以在多级排序中使用DESC与ASC关键字,以指定排序的列是按 照降序还是升序进行排序。多级排序中的DESC与ASC关键字的使用是互不干扰 的。 在多级排序中还可以使用别名和位置指定排序的列。
二、聚集数据
1、去除相同行:DISTINCT
SELECT子句中有两个可选的关键字ALL与DISTINCT,ALL为默认选项,表 示列出所有记录,而不管是否出现重复。如果要去掉重复的记录,可以使用 DISTINCT关键字。可以使用DISTINCT对一列或多列的组合进行重复的删除。 (1)在一列中使用 (2)在多列中使用 (3)空值的处理
二、聚集数据
2、聚集函数
聚集函数是SQL中很重要的一部分。聚 集函数不是对某个记录进行操作,而是对表 中或查询到的所有记录进行操作。聚集函数 中的expression通常是一个列名或者别名, 但也可以是一个常量或者一个函数(SQL支持 函数的嵌套)。 在使用聚集函数时,需要注意: 在函数COUNT( )、SUM( )、AVG( )中可以使用DISTINCT关键字,以在计算中不 包含重复的行。而对于函数MAX( )、MIN( )与COUNT(*)由于不会改变其结果,因此 没有必要使用DISTINCT。 函数SUM( )、AVG( )只能对类型为数字数据类型的列使用,而函数COUNT( )、 MAX( )、MIN( )与COUNT(*)可以对所有数据类型使用。 不同的系统可能提供不同的函数,例如Oracle中提供了用于计算的STDDEV() 与VARIANCE()函数,ASA中提供了LIST()函数。使用时请注意查阅系统手册。
三、分组数据
4、HAVING子句
当同时包含WHERE子句、GROUP BY子句、HAVING子句及聚集函数时,执行 顺序如下: (1)执行WHERE子句查找符合条件的数据; (2)使用GROUP BY子句对数据进行分组; (3)对GROUP BY子句形成的组运行聚集函数计算每一组的值; (4)最后使用HAVING子句去掉不符合条件的组。
SELECT [ALL | DISTINCT] select_list FROM table_list/view_list [WHERE conditions] [GROUP BY group_list] [HAVING conditions] [ORDER BY order_list]
GROUP BY子句可以用来对数据进行分组,将数据分成组并为每一组返回一 行。在不使用聚集函数时,使用GROUP BY与DISTINCT类似。 GROUP BY子句与聚集函数有密切的联系,可以说没有聚集函数GROUP BY 子句也就没有多大的用处。GROUP BY子句可以将查询到的数据分成组,而 聚集函数则用来对每组的数据进行计算。二者的结合是非常有用的。 排序中可以使用WHERE子句以对特定的记录进行排序,在分组中也可以使 用WHERE子句以对特定的记录进行分组。执行顺序为:先执行WHERE子句 将符合条件的记录选出,再对选出的数据进行分组。当然,WHERE子句中 使用的列并不是一定要在SELECT列表中出现。
name sex id salary ————— ——— —— ———— 王力刚 男 5003 3000.00 梁朝阳 男 5002 3000.00 王亚鹏 男 4004 6000.00 魏华翔 男 4003 6000.00 王静 女 3004 3000.00 吴忠彦 男 3002 3000.00 林志祥 男 2003 3000.00 刘燕 女 2002 3000.00 庞文凯 男 1005 3000.00 李大平 男 1003 3000.00 林志千 男 1001 6000.00 [11rows]
在ORDER BY子句中也可以包含多个元素,元素之间也是使用逗号隔开; 关键字ASC表示按照升序排列,这是默认的排列方式。而关键字DESC表 示按照降序排列; 在ORDER BY列表可以是SELECT子句中一个列的名称——columnname; 也可以是SELECT子句中为列或表达式创建的别名——alias;也可以是 SELECT子句中代表位置的编码——position,如1表示SELECT子句中第一个 列,2表示SELECT子句中第二个列。
SELECT pnumber, budget, gross, gross – budget AS profit FROM Project WHERE profit >= 30000.00 AND profit <= 70000.00 ORDER BY profit
(2)使用别名排序 如果没有为表达式创建别名也没有关系,SQL也支持按照在SELECT子句列 表中的位置来指定排序的列。
二、聚集数据
3、避免使用DISTINCT时的错误
在列和表达式 中使用 DISTINCT 在聚集函数中 使用 DISTINCT DISTINCT对空 值的处理
在列和表达式中使用DISTINCT时,只能使用一次DISTINCT,因为 DISTINCT是对SELECT列表中的所有元素的组合起作用。这样在使用 DISTINCT时有了很大的限制,或者是对一个列或表达式去除重复值, 或者对列的组合去除重复值,而不能在列的组合中分别对每个列或 表达式指定是否包含DISTINCT。 聚集函数中可以包含DISTINCT关键字。函数之间使用DISTINCT是互 不干扰的,它是在函数计算时起作用,并不与规则——DISTINCT必 须在select_list之前使用——相违背。 DISTINCT对空值的处理与其它运算符对空值的处理有相同也有不同。 相同点:都将空值作为未知对待,不认为其大于或小于其它任何值; 不同点:对其它运算符而言,空值之间是互不相同的,而且要想查 找到空值需要使用IS NULL进行判断;而对于DISTINCT来说,将空 值看作是相同的,也不需要使用IS NULL。
三、分组数据
1、GROUP BY子句
GROUP BY子句根据列的内容对查询 结果进行分类。使用GROUP BY时, order_list中的每一列都必须出现在 select_list中,即不能选择 select_list之外的列用于分组。
GROUP BY与 DISTINCT GROUP BY与聚集函 数 与WHERE子句一起使 用
一、排序数据
5、空值的处理
当按照某一列进行排序,而该列包含有空值时,就涉及到空值的处理。 SQL中指出:当排序遇到空值时,空值大于或小于所有非空值。并没有明确规 定应该是大于还是小于。不同的数据库系统可能采取不同的处理。 如微软的SQL Server中,空值小于所有非空值。而Oracle中,空值大于 所有非空值。
一、排序数据
2、升序排序和降序排序
在排序中用户可以指定按照什么顺序来排序:升序或降序。SQL中,关键 字ASC表示按照升序排列,关键字DESC表示按照降序排列。而默认的排序方式 为升序,也就是说,如果用户不输入DESC或ASC,那么显示结果将按照从低到 高的顺序排列。当然,为了使用户能更好的明白显示结果的排列顺序,也可 Results 以指定ASC。
本章小结:
•掌握对数据进行排序的方法和注意点 •掌握聚集数据的方法 •掌握对数据分组的方法
SELECT name, sex, id, salary FROM Employee WHERE salary = 3000.00 OR salary = 6000.00 ORDER BY id DESC
一、排序数据
3、使用表达式排序
(1)使用别名排序 为列或表达式创建了别名之后,在排序中就可以使用别名来指定进行排 序的列。
三、分组数据
5、空值的处理
GROUP BY子句将分组中所有的空值也都看成是相同的,如果成组的列包 含多个空值,那么它们将被放在同一组中。
6ห้องสมุดไป่ตู้避免分组时的错误
使用多次分组时,如果包含聚集函数,需要注意的是:多次分组后聚 集函数是对多次分组形成的小组进行计算,而不是对先形成的大组进行计算; 在使用GROUP BY子句时还应该注意以下一些事项: (1)GROUP BY子句、HAVING子句中使用的列名必须包含在SELECT列表 中,否则将会产生错误,不过HAVING子句中使用的列名不一定要包含在GROUP BY子句中。如果使用ORDER BY子句,则ORDER BY子句中使用的列名必须是 GROUP BY子句中包含的列名; (2)ORDER BY子句必须跟在GROUP BY子句之后,如果使用HAVING子句 它必须紧接在GROUP BY子句之后,而在ORDER BY子句之前; (3)HAVING子句是对组进行限制,而WHERE子句是对行进行限制,二 者虽然有相似之处,但是仍有很大的不同; (4)对空值成组时,要注意COUNT( )与COUNT(*)之间的不同。
三、分组数据
2、多次分组
可以使用ORDER BY子句对多个列进行排序一样,在GROUP BY子句中也可 以指定多个列对一组数据再次进行分组。多个列之间也是使用逗号分隔。执 行顺序也与多级排序类似:先对查询结果进行分组,再对分好的组中的数据 进行第二次分组。
3、多次分组
ORDER BY子句可以与GROUP BY子句一起使用以对结果进行排序,更清 晰的显示结果。SQL语句书写时,ORDER BY子句必须在GROUP BY子句之后书写。 这两个子句一起使用时,执行顺序为: 按照GROUP BY对查询到的数据进行分组; 使用ORDER BY对形成的组中的数据进行排序。
第6章 数据的排序,聚集和分组
重点内容:
• 排序数据
• 聚集数据 • 分组数据
一、排序数据
1、ORDER BY的使用
SQL中提供了ORDER BY子句以使查询结果按照用户的需要进行排列,以便 于用户阅读。
SELECT select_list FROM table_list [WHERE conditions] [ORDER BY columnname | alias | position [ASC | DESC]]
一、排序数据
4、多级排序
SQL中可以指定多列进行排序。初级排序对查询结果进行分类并排序,第 二级排序对初级排序分好的类中的数据在相同的数据中进行再次排序。 用户也可以在多级排序中使用DESC与ASC关键字,以指定排序的列是按 照降序还是升序进行排序。多级排序中的DESC与ASC关键字的使用是互不干扰 的。 在多级排序中还可以使用别名和位置指定排序的列。
二、聚集数据
1、去除相同行:DISTINCT
SELECT子句中有两个可选的关键字ALL与DISTINCT,ALL为默认选项,表 示列出所有记录,而不管是否出现重复。如果要去掉重复的记录,可以使用 DISTINCT关键字。可以使用DISTINCT对一列或多列的组合进行重复的删除。 (1)在一列中使用 (2)在多列中使用 (3)空值的处理
二、聚集数据
2、聚集函数
聚集函数是SQL中很重要的一部分。聚 集函数不是对某个记录进行操作,而是对表 中或查询到的所有记录进行操作。聚集函数 中的expression通常是一个列名或者别名, 但也可以是一个常量或者一个函数(SQL支持 函数的嵌套)。 在使用聚集函数时,需要注意: 在函数COUNT( )、SUM( )、AVG( )中可以使用DISTINCT关键字,以在计算中不 包含重复的行。而对于函数MAX( )、MIN( )与COUNT(*)由于不会改变其结果,因此 没有必要使用DISTINCT。 函数SUM( )、AVG( )只能对类型为数字数据类型的列使用,而函数COUNT( )、 MAX( )、MIN( )与COUNT(*)可以对所有数据类型使用。 不同的系统可能提供不同的函数,例如Oracle中提供了用于计算的STDDEV() 与VARIANCE()函数,ASA中提供了LIST()函数。使用时请注意查阅系统手册。
三、分组数据
4、HAVING子句
当同时包含WHERE子句、GROUP BY子句、HAVING子句及聚集函数时,执行 顺序如下: (1)执行WHERE子句查找符合条件的数据; (2)使用GROUP BY子句对数据进行分组; (3)对GROUP BY子句形成的组运行聚集函数计算每一组的值; (4)最后使用HAVING子句去掉不符合条件的组。
SELECT [ALL | DISTINCT] select_list FROM table_list/view_list [WHERE conditions] [GROUP BY group_list] [HAVING conditions] [ORDER BY order_list]
GROUP BY子句可以用来对数据进行分组,将数据分成组并为每一组返回一 行。在不使用聚集函数时,使用GROUP BY与DISTINCT类似。 GROUP BY子句与聚集函数有密切的联系,可以说没有聚集函数GROUP BY 子句也就没有多大的用处。GROUP BY子句可以将查询到的数据分成组,而 聚集函数则用来对每组的数据进行计算。二者的结合是非常有用的。 排序中可以使用WHERE子句以对特定的记录进行排序,在分组中也可以使 用WHERE子句以对特定的记录进行分组。执行顺序为:先执行WHERE子句 将符合条件的记录选出,再对选出的数据进行分组。当然,WHERE子句中 使用的列并不是一定要在SELECT列表中出现。
name sex id salary ————— ——— —— ———— 王力刚 男 5003 3000.00 梁朝阳 男 5002 3000.00 王亚鹏 男 4004 6000.00 魏华翔 男 4003 6000.00 王静 女 3004 3000.00 吴忠彦 男 3002 3000.00 林志祥 男 2003 3000.00 刘燕 女 2002 3000.00 庞文凯 男 1005 3000.00 李大平 男 1003 3000.00 林志千 男 1001 6000.00 [11rows]
在ORDER BY子句中也可以包含多个元素,元素之间也是使用逗号隔开; 关键字ASC表示按照升序排列,这是默认的排列方式。而关键字DESC表 示按照降序排列; 在ORDER BY列表可以是SELECT子句中一个列的名称——columnname; 也可以是SELECT子句中为列或表达式创建的别名——alias;也可以是 SELECT子句中代表位置的编码——position,如1表示SELECT子句中第一个 列,2表示SELECT子句中第二个列。
SELECT pnumber, budget, gross, gross – budget AS profit FROM Project WHERE profit >= 30000.00 AND profit <= 70000.00 ORDER BY profit
(2)使用别名排序 如果没有为表达式创建别名也没有关系,SQL也支持按照在SELECT子句列 表中的位置来指定排序的列。
二、聚集数据
3、避免使用DISTINCT时的错误
在列和表达式 中使用 DISTINCT 在聚集函数中 使用 DISTINCT DISTINCT对空 值的处理
在列和表达式中使用DISTINCT时,只能使用一次DISTINCT,因为 DISTINCT是对SELECT列表中的所有元素的组合起作用。这样在使用 DISTINCT时有了很大的限制,或者是对一个列或表达式去除重复值, 或者对列的组合去除重复值,而不能在列的组合中分别对每个列或 表达式指定是否包含DISTINCT。 聚集函数中可以包含DISTINCT关键字。函数之间使用DISTINCT是互 不干扰的,它是在函数计算时起作用,并不与规则——DISTINCT必 须在select_list之前使用——相违背。 DISTINCT对空值的处理与其它运算符对空值的处理有相同也有不同。 相同点:都将空值作为未知对待,不认为其大于或小于其它任何值; 不同点:对其它运算符而言,空值之间是互不相同的,而且要想查 找到空值需要使用IS NULL进行判断;而对于DISTINCT来说,将空 值看作是相同的,也不需要使用IS NULL。
三、分组数据
1、GROUP BY子句
GROUP BY子句根据列的内容对查询 结果进行分类。使用GROUP BY时, order_list中的每一列都必须出现在 select_list中,即不能选择 select_list之外的列用于分组。
GROUP BY与 DISTINCT GROUP BY与聚集函 数 与WHERE子句一起使 用
一、排序数据
5、空值的处理
当按照某一列进行排序,而该列包含有空值时,就涉及到空值的处理。 SQL中指出:当排序遇到空值时,空值大于或小于所有非空值。并没有明确规 定应该是大于还是小于。不同的数据库系统可能采取不同的处理。 如微软的SQL Server中,空值小于所有非空值。而Oracle中,空值大于 所有非空值。
一、排序数据
2、升序排序和降序排序
在排序中用户可以指定按照什么顺序来排序:升序或降序。SQL中,关键 字ASC表示按照升序排列,关键字DESC表示按照降序排列。而默认的排序方式 为升序,也就是说,如果用户不输入DESC或ASC,那么显示结果将按照从低到 高的顺序排列。当然,为了使用户能更好的明白显示结果的排列顺序,也可 Results 以指定ASC。
本章小结:
•掌握对数据进行排序的方法和注意点 •掌握聚集数据的方法 •掌握对数据分组的方法
SELECT name, sex, id, salary FROM Employee WHERE salary = 3000.00 OR salary = 6000.00 ORDER BY id DESC
一、排序数据
3、使用表达式排序
(1)使用别名排序 为列或表达式创建了别名之后,在排序中就可以使用别名来指定进行排 序的列。
三、分组数据
5、空值的处理
GROUP BY子句将分组中所有的空值也都看成是相同的,如果成组的列包 含多个空值,那么它们将被放在同一组中。
6ห้องสมุดไป่ตู้避免分组时的错误
使用多次分组时,如果包含聚集函数,需要注意的是:多次分组后聚 集函数是对多次分组形成的小组进行计算,而不是对先形成的大组进行计算; 在使用GROUP BY子句时还应该注意以下一些事项: (1)GROUP BY子句、HAVING子句中使用的列名必须包含在SELECT列表 中,否则将会产生错误,不过HAVING子句中使用的列名不一定要包含在GROUP BY子句中。如果使用ORDER BY子句,则ORDER BY子句中使用的列名必须是 GROUP BY子句中包含的列名; (2)ORDER BY子句必须跟在GROUP BY子句之后,如果使用HAVING子句 它必须紧接在GROUP BY子句之后,而在ORDER BY子句之前; (3)HAVING子句是对组进行限制,而WHERE子句是对行进行限制,二 者虽然有相似之处,但是仍有很大的不同; (4)对空值成组时,要注意COUNT( )与COUNT(*)之间的不同。
三、分组数据
2、多次分组
可以使用ORDER BY子句对多个列进行排序一样,在GROUP BY子句中也可 以指定多个列对一组数据再次进行分组。多个列之间也是使用逗号分隔。执 行顺序也与多级排序类似:先对查询结果进行分组,再对分好的组中的数据 进行第二次分组。
3、多次分组
ORDER BY子句可以与GROUP BY子句一起使用以对结果进行排序,更清 晰的显示结果。SQL语句书写时,ORDER BY子句必须在GROUP BY子句之后书写。 这两个子句一起使用时,执行顺序为: 按照GROUP BY对查询到的数据进行分组; 使用ORDER BY对形成的组中的数据进行排序。
第6章 数据的排序,聚集和分组
重点内容:
• 排序数据
• 聚集数据 • 分组数据
一、排序数据
1、ORDER BY的使用
SQL中提供了ORDER BY子句以使查询结果按照用户的需要进行排列,以便 于用户阅读。
SELECT select_list FROM table_list [WHERE conditions] [ORDER BY columnname | alias | position [ASC | DESC]]