数据说明:

+-----------+------------+---------------+--------------+--------------+------------+
| shohin_id | shohin_mei | shohin_bunrui | hanbai_tanka | shiire_tanka | torokubi |
+-----------+------------+---------------+--------------+--------------+------------+
| 0001 | T恤 | 衣服 | 1000 | 500 | 2009-09-20 |
| 0002 | 打孔器 | 办公用品 | 500 | 320 | 2009-09-11 |
| 0003 | 运动T恤 | 衣服 | 4000 | 2800 | NULL |
| 0004 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009-09-20 |
| 0005 | 高压锅 | 厨房用具 | 6800 | 5000 | 2009-01-15 |
| 0006 | 叉子 | 厨房用具 | 500 | NULL | 2009-09-20 |
| 0007 | 擦菜板 | 厨房用具 | 880 | 790 | 2008-04-28 |
| 0008 | 圆珠笔 | 办公用品 | 100 | NULL | 2009-11-11 |
+-----------+------------+---------------+--------------+--------------+------------+
8 rows in set (0.00 sec)

对表进行聚合查询

聚合函数:

COUNT:计算表中的记录数(行数)。

SUM:计算表中数值列的数据合计值。

AVG:计算表中数值列的数据平均值。

MAX:求出表中任意列中数据的最大值。

MIN:求出表中任意列中数据的最小值。

COUNT函数的结果根据参数的不同而不同。COUNT(*)会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数。

聚合函数会将NULL排除在外。但COUNT(*)例外,并不会排除NULL。

MAX/MIN函数几乎适用所有数据类型的列。SUM/AVG函数只适用数字类型的列。

想要计算值得种类时,可以在COUNT函数的参数中使用DISTINCT。

在聚合函数的参数中使用DISTINCT,可以删除重复数据。

对表进行分组

SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui; +---------------+----------+
| shohin_bunrui | COUNT(*) |
+---------------+----------+
| 办公用品 | 2 |
| 厨房用具 | 4 |
| 衣服 | 2 |
+---------------+----------+

GOOUP BY 就像切分表的一把刀。

子句的书写顺序:

SELECTàFROMàWHEREàGROUP BY

SQL子句的顺序不能改变,也不能互相替换。

SELECT shiire_tanka, COUNT(*)
FROM Shohin
GROUP BY shiire_tanka; +--------------+----------+
| shiire_tanka | COUNT(*) |
+--------------+----------+
| NULL | 2 |
| 320 | 1 |
| 500 | 1 |
| 790 | 1 |
| 2800 | 2 |
| 5000 | 1 |
+--------------+----------+

 

聚合键中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来。

GROUP BY 和WHERE并用时, SELECT语句的执行顺序如下:

FROM---WHERE---GROUP BY---SELECT

使用聚合函数时,SELECT字句中只能存在以下三种元素:

  • 常数
  • 聚合函数
  • GROUP BY字句中指定的列明(也就是聚合键)

GROUP BY子句中不能够使用SELECT子句中定义的别名。

因为SELECT子句在GROUP BY子句之后执行。

GROUP BY子句结果的显示是无序的。

只有SELECT和HAVING子句(以及ORDER BY字句)中能够使用聚合函数。

为聚合函数结果指定条件

HAVING子句:

SELECT <列名1>, <列名2>, <列名3>, …

FROM <表名>

GROUP BY <列名1>, <列名2>, <列名3>, …

HAVING <分组结果对应的条件>

使用HAVING子句时SELECT语句的顺序:

SELECT---FROM---WHERE---GROUP BY---HAVING

HAVING子句要写在GROUP BY子句之后,在DBMS内部的执行顺序也排在GROUP BY子句之后。

SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui
HAVING COUNT(*) = 2; in_bunrui | COUNT(*) |
+---------------+----------+
| 办公用品 | 2 |
| 衣服 | 2 |
+---------------+----------+ SELECT shohin_bunrui, AVG(hanbai_tanka)
FROM Shohin
GROUP BY shohin_bunrui
HAVING AVG(hanbai_tanka) >= 2500; ohin_bunrui | AVG(hanbai_tanka) |
+---------------+-------------------+
| 厨房用具 | 2795.0000 |
| 衣服 | 2500.0000 |
+---------------+-------------------+

 

HAVING字句中能够使用的3种要素如下:

  • 常数
  • 聚合函数
  • GROUP BY子句中指定的列名(即聚合键)

WHERE子句 = 指定行所对应的条件

HAVING子句 = 指定组所对应的条件

对查询结构进行排序

ORDER BY子句:

SELECT <列名1>, <列名2>, <列名3>, …

FROM <表名>

ORDER BY <排序基准列1>, <排序基准列1>,…

不论何种情况,ORDER BY子句都需要写在SELECT语句的末尾。这是因为对数据进行排序的操作必须在结果即将返回时执行。

子句的书写顺序:

SELECT---FROM---WHERE---GROUP BY ---HAVING---ORDER BY

未指定ORDER BY子句中排序时会默认使用升序进行排序。ASC升序,DESC降序。

排序键中包含NULL时,会在开头或末尾进行汇总。(MySQL中,升序会在开头汇总,降序会在末尾汇总)

使用HAVING子句时SELECT语句的执行顺序:

FROM---WHERE---GROUP BY---HAVING---SELECT---ORDER BY

SELECT子句的执行顺序在GROUP BY子句之后,ORDER BY子句之前。因此在执行GROUP BY子句时,SELECT语句中定义的别名无法别识别。对于SELECT子句之后执行GROUP BY子句来说,就没有这样的问题了。

在ORDER BY子句中可以使用SELECT子句中为使用的列和聚合函数.

SELECT shohin_mei, hanbai_tanka, shiire_tanka
FROM Shohin
ORDER BY shohin_id; +------------+--------------+--------------+
| shohin_mei | hanbai_tanka | shiire_tanka |
+------------+--------------+--------------+
| T恤 | 1000 | 500 |
| 打孔器 | 500 | 320 |
| 运动T恤 | 4000 | 2800 |
| 菜刀 | 3000 | 2800 |
| 高压锅 | 6800 | 5000 |
| 叉子 | 500 | NULL |
| 擦菜板 | 880 | 790 |
| 圆珠笔 | 100 | NULL |
+------------+--------------+--------------+ SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui
ORDER BY COUNT(*); +---------------+----------+
| shohin_bunrui | COUNT(*) |
+---------------+----------+
| 办公用品 | 2 |
| 衣服 | 2 |
| 厨房用具 | 4 |
+---------------+----------+

  

 

 

SQL --Chater03 聚合与排序的更多相关文章

  1. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  2. 3 SQL 聚合与排序

    3 聚合与排序 3-1 对表进行聚合查询 聚合函数 通过SQL对数据进行 操作或计算时需要使用函数. 计算表中全部数据行数时,可以使用COUNT函数. COUNT : 计算表中的记录数(行数). SU ...

  3. SQL基础教程(第2版)第3章 聚合与排序:3-2 对表进行分组

    第3章 聚合与排序:3-2 对表进行分组 ● 使用GROUP BY子句可以像切蛋糕那样将表分割.通过使用聚合函数和GROUP BY子句,可以根据“商品种类”或者“登记日期”等将表分割后再进行汇总.● ...

  4. SQL基础教程(第2版)第3章 聚合与排序:3-4 对查询结果进行排序

    第3章 聚合与排序:3-4 对查询结果进行排序 ● 使用ORDER BY子句对查询结果进行排序.● 在ORDER BY子句中列名的后面使用关键字ASC可以(通常省略默认)进行升序排序,使用DESC关键 ...

  5. SQL基础教程(第2版)第3章 聚合与排序:3-3 为聚合结果指定条件

    第3章 聚合与排序:3-3 为聚合结果指定条件 ● 使用COUNT函数等聚合函数对表中数据进行汇总操作时,为其指定条件的不是WHERE子句,而是HAVING子句.● 聚合函数可以在SELECT子句. ...

  6. SQL Server 聚合函数算法优化技巧

    Sql server聚合函数在实际工作中应对各种需求使用的还是很广泛的,对于聚合函数的优化自然也就成为了一个重点,一个程序优化的好不好直接决定了这个程序的声明周期.Sql server聚合函数对一组值 ...

  7. sql 按指定规则排序,例如 按 1,3,2排序 而不是1,2,3

    我们都知道 sql语句中的排序有desc(降序).asc(升序),这两个都是按顺序排列的,最近有一个需求是不按顺序排序了 ,抽出个别的排在前面,并且这种需求是应对的问题中的数据是比较少的,而且没有规律 ...

  8. SQL你必须知道的-查询聚合分组排序

    use MySchoolTwo    -- 简单查询    select * from Student    -- 话说这种查询的效率要比 * 要高级点    select sId , sName , ...

  9. 《SQL 基础教程》第三章:聚合和排序

    这一章节主要讲了三方面的内容: 数据的汇总操作a. 聚合函数b.分组操作 给汇总操作指定条件 对汇总结果进行排序 COUNT()等聚合函数 定义: 输入多行,输出一行的函数称为聚合函数 功能: 用于对 ...

随机推荐

  1. Making the Grade(POJ3666)

    题目大意: 给出长度为n的整数数列,每次可以将一个数加1或者减1,最少要多少次可以将其变成单调增或者单调减(不严格). 题解: 1.一开始我有一个猜想,就是不管怎么改变,最终的所有数都是原来的某个数. ...

  2. Bootstrap<基础二十七> 多媒体对象(Media Object)

    Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...

  3. [转]as3 算法实例【输出1 到最大的N 位数 题目:输入数字n,按顺序输出从1 最大的n 位10 进制数。比如输入3,则输出1、2、3 一直到最大的3 位数即999。】

    思路:如果我们在数字前面补0的话,就会发现n位所有10进制数其实就是n个从0到9的全排列.也就是说,我们把数字的每一位都从0到9排列一遍,就得到了所有的10进制数. /** *ch 存放数字 *n n ...

  4. [转载] javascript实现深度克隆

    js一般有两种不同数据类型的值: 基本类型(包括undefined,Null,boolean,String,Number),按值传递: 引用类型(包括数组,对象),按址传递,引用类型在值传递的时候是内 ...

  5. 关于WebView的复习

    最近不知为啥,公司提出要用webView,偷笑不止.在青软上课的时候学过这东西,是说条件比较紧张的时候可以拿来充数的,现在公司里手机端开发人员很多,做的好好的,放着原生ui不用,非要赶时髦搞什么Web ...

  6. Git典型使用场景

    1. 在本地创建版本库(把本地的一个目录内的文件纳入版本库管理,方便查看变动历史,恢复版本等.不限于代码,可以是笔记等所有需要追踪历史的文件.) git init -- 把当前目录初始化为版本库 2. ...

  7. 3、Android Intent Flag的介绍

    介绍:http://blog.csdn.net/luckily01/article/details/7737499

  8. 关于u盘启动,关于UEFI,关于hp手提计算机

    这个国庆前夕,遇到点麻烦了:一台新的手提计算机,按照常规方法不能用u盘启动引导.导致也无法做备份.所以,研究了不少小时哦...终于也可以解决的. 关于u盘启动,一般常用的有:u大侠(推荐),大白菜(不 ...

  9. lucene5学习 - 索引基本操作(创建,查询,更新,删除,分页)

    package lucene5; import java.io.IOException; import java.nio.file.Paths; import java.text.SimpleDate ...

  10. 编写可维护的JavaScript代码

    1.  1)for-in循环用来遍历对象属性.不仅遍历对象的实例属性,还遍历从原型继承来的属性. 所以最好使用hasOwnProperty()方法来过滤. 2) for in循环遍历出的对象属性不能保 ...