3、聚合与排序

3-1:对表进行聚合查询

  1、使用聚合函数对表中的列进行合计值或者平均值等等合计操作

  2、聚合函数会对NULL以外的对象进行合计,但是COUNT(*)函数可以查出包含NULL的内的全部数据行数

  3、使用DISTINCT关键字删除重复值

3-1-1:聚合函数

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

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

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

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

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

-- 计算全部数据行数
SELECT COUNT(*)
FROM Shohin;

3-1-2:计算NULL以外数据的行数

-- 计算shiire_tanka列中(进货单价)中非空行数
SELECT COUNT(shiire_tanka)
FROM Shohin;

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

3-1-3:计算合值

-- 销售单价的合计值
SELECT SUM(hanbai_tanka)
FROM Shohin;

  法则3-2:聚合函数会将NULL排除在外,但COUNT(*)例外,并不会排除NULL。

3-1-3:计算平均值

SELECT AVG(hanbai_tanka)
FROM Shohin;

 

3-1-3:计算最大值和最小值

-- 计算销售单价最大值和进货单价的最小值
SELECT MAX(hanbai_tanka), MIN(shiire_tanka)
FROM Shohin;

  法则3-3:MAX/MIN函数几乎适用于所有数据类型的列,SUM/AVG函数只适用于数值类型的列。

3-1-4:使用聚合函数删除重复值(关键字DISTINCT)

SELECT COUNT(shohin_bunrui), COUNT(DISTINCT shohin_bunrui)
FROM Shohin;

  法则3-4:计算值种类,可以在聚合函数参数前使用DISTINCT关键字,进行去重。

3-2:对表进行分组

  1、使用GROUP BY子句可以对数据进行分割再聚合

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

  3、使用聚合函数和GROUP BY子句时需要注意以下4点:

    (1)只能写在SELECT子句中

    (2)GROUP BY子句中不能使用SELECT子句中列的别名

    (3)GROUP BY子句的聚合结果是无序的

    (4)WHERE子句中不能使用聚合函数

3-2-1:GROUP BY子句

  语法3-1:使用GROUP BY子句进行聚合

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

       FROM <表名>

       GROUP BY <列名1>,<列名2>,<列名3>,....;

-- 按商品种类统计数据行数
SELECT shohin_bunrui, COUNT(*) -- COUNT(shohin_bunrui)
FROM Shohin
GROUP BY shohin_bunrui;

 

  法则3-5:GROUP BY子句要写在最后。

3-2-2:聚合中包含NULL的情况

-- 按照进货碟单价统计数据行数
SELECT shiire_tanka, COUNT(*) -- COUNT(shiire_tanka)
FROM Shohin
GROUP BY shiire_tanka;

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

3-2-3:使用WHERE子句时GROUP BY的执行结果

  语法3-2:使用WHERE子句和GROUP BY子句进行聚合

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

       FROM <表名>

       WHERE <条件表达式>

       GROUP BY <列名1>,<列名2>,<列名3>,....;

SELECT shiire_tanka, COUNT(*) -- COUNT(shiire_tanka)
FROM Shohin
WHERE shohin_bunrui = '衣服'
GROUP BY shiire_tanka;

  说明:GROUP BY和WHERE并用时,SELECT语句的执行顺序是:

    FROM -> WHERE -> GROUP BY -> SELECT

3-2-4:使用聚合函数和GROUP BY子句中常见的错误

  法则3-7:使用GROUP BY子句时,SELECT子句中不能出现聚合键之外的列名。

  法则3-8:在GROUP BY子句中不能使用SELECT子句中定义的别名。(在PostgreSQL中不会报错,但有些DBMS会报错)

  法则3-9:GROUP BY子句结果的输出是无序的。

  法则3-10:只有在SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数。

3-2-5:DISTINCT和GROUP BY都能去除重复值

-- DISTINCT和GROUP BY实现相同的功能
SELECT DISTINCT shohin_bunrui
FROM Shohin;

SELECT shohin_bunrui
FROM Shohin
GROUP BY shohin_bunrui;

如何选择使用这两个:

  想要删除选择结果的重复记录使用DISTINCT

  想要计算聚合结果时使用GROUP BY

3-3:为聚合结果指定条件

   1、使用COUNT函数等对表中数据进行聚合操作时,为其指定的条件不是WHERE子句,而是HAVING子句

   2、聚合函数可以在SELECT、HAVING和ORDER BY子句中使用

   3、HAVING子句要写在GROUP BY子句之后

   4、WHERE子句用来指定数据行的条件,HAVING子句用来指定分组的条件

3-3-1:HAVING子句

  语法3-3:SELECT <列名1>,<列名2>,<列名3>,....

       FROM <表名>

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

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

  法则3-13:HAVING子句要写在GROUP BY子句之后。

-- 取出包含数据的行数为2行的组
SELECT shohin_bunrui, COUNT(*)
FORM Shohin
GROUP BY shohin_bunrui
HAVING COUNT(*) = 2;

3-3-2:HAVING子句的构成要素

  1、常数

  2、聚合函数

  3、GROUP BY子句中指定的列名

  法则3-14:指定行所对应的条件写在WHERE子句中,指定组所对应和条件写在HAVING子句中。

 

3-4:对查询结果排序

  1、使用ORDER BY子句对查询结果排序

  2、在ORDER BY子句中的列名后使用关键字ASC升序排序,DESC降序排序

  3、ORDER BY子句中可以指定多个排序列名

  4、排序中包含NULL时,会在开头或结尾进行汇总

  5、ORDER BY子句中可以使用SELECT子句中定义的列的别名

  6、ORDER BY子句中可以使用SELECT子句中未出现的列或聚合函数

  7、ORDER BY子句中不能使用列的编号

3-4-1:ORDER BY子句

  语法3-3:SELECT <列名1>,<列名2>,<列名3>,....

       FROM <表名>

         ORDER BY <列名1>,<列名2>,<列名3>,....

      

-- 按销售单价从低向高排序
SELECT shohin_id, shohin_mei,hanbai_tanka,shiire_tanka
FROM Shohin
ORDER BY hanbai_tanka;

说明:子句的书写顺序

  SELECT子句->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句

    法则3-15:ORDER BY子句通常写在SELECT语句末尾。

-- 按销售单价从高向低排序
SELECT shohin_id, shohin_mei,hanbai_tanka,shiire_tanka
FROM Shohin
ORDER BY hanbai_tanka DESC;

-- 按销售单价和商品编号从高向低排序
SELECT shohin_id, shohin_mei,hanbai_tanka,shiire_tanka
FROM Shohin
ORDER BY hanbai_tanka DESC,shohin_id DESC;-- 每一个列都必须跟一个DSEC

  法则3-17:排序键中包含NULL时,会在开头或进行汇总

3-4-2:在排序键中使用显示用别名

SELECT shohin_id AS id, shohin_mei
FROM Shohin
ORDER BY id;

  说明:SELECT子句执行在GROUP BY子句之后,ORDER BY子句之前,所以在GROUP BY子句中不能用SELECT字义的别名,ORDER BY子句中可以。

  法则3-18:ORDER BY子句中可以使用SELECT子句中字义别名。

  法则3-19:ORDER BY子句中可以使用列中所有的列和聚合函数。

  法则3-20:ORDER BY子句中不要使用列编号。

posted @ 2017-03-22 00:05  起航追梦人  阅读(550)  评论(0编辑  收藏  举报