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

SQL 基础知识梳理(三) – 聚合和排序

【博主】反骨仔    【原文】http://www.cnblogs.com/liqingwen/p/5926689.html

 

图片 1

 

  这是《SQL 基础知识梳理(二) –
查询基础
》的下篇。

 

目录

 

一、对表举办联谊查询 

  1.聚合函数

    (1)5
个常用函数:

      ①COUNT:总括表中的记录(行)数。

      ②SUM:总括表中数值列的多寡合计值。

      ③AVG:总结表中数值列的数量平均值。

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

      ⑤MIN:求出表中任意列中多少的细小值。

 

    (2)聚合:将多行汇总成一行。

图片 2

图1-1 Shohin 表

 

  2.统计表中多少的行数 

--示例
SELECT COUNT(*)  -- *:参数,这里代表全部列
FROM dbo.Shohin;

图片 3

 

  3.统计 NULL 以外数据的行数

  将 COUNT(*) 的参数改成指定对象的列,就足以拿走该列的非 NULL 行数。

SELECT COUNT(shiire_tanka)
FROM dbo.Shohin;

图片 4

只总结非 NULL 的行

  【备注】除了 COUNT
函数,其余函数不可以将星号作为参数。

  【备注】COUNT
函数的结果依据参数的两样而不同。COUNT(*) 会得到包含 NULL 的数量行数,而
COUNT(<列名>) 会拿到 NULL 之外的数目行数。

 

  4.统计合计值

SELECT SUM(hanbai_tanka) AS sum_hanbai_tanka,    --总和
    AVG(hanbai_tanka) AS avg_hanbai_tanka,        --平均
    MAX(hanbai_tanka) AS max_hanbai_tanka,        --最大
    MIN(hanbai_tanka) AS min_hanbai_tanka        --最小
FROM dbo.Shohin;

图片 5

  【备注】所有的聚合函数,假若以列名为参数,会一笑置之
NULL 值所在的行。

 

SELECT MAX(torokubi),  --torokubi 为日期
    MIN(torokubi)
FROM dbo.Shohin

图片 6

  【备注】MAX/MIN
函数几乎适用于所有数据类型的列。SUM/AVG 函数只适用于数值类型的列。

 

  5.采取聚合函数删除重复值(关键字 DISTINCT)

--示例1:计算去除重复数据后的数据行数
SELECT COUNT(DISTINCT shohin_bunrui)
FROM dbo.Shohin;

--示例2:先计算数据行数再删除重复数据的结果
SELECT DISTINCT COUNT(shohin_bunrui)
FROM dbo.Shohin;

图片 7

  【备注】在聚合函数的参数中使用
DISTINCT(示例1),能够去除重复数据。DISTINCT 不仅限于 COUNT
函数,所有的聚合函数都可以利用。

 

二、对表进行分组

  1.GROUP BY 子句

--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...;

--示例
SELECT shohin_bunrui AS '商品种类',
    COUNT(*) AS '数量'
FROM dbo.Shohin
GROUP BY shohin_bunrui;

图片 8

  【备注】GROUP BY
子句中指定的列称为“聚合键”或“分组列”。

  【子句的书写顺序(暂定)】SELECT
–> FROM –> WHERE –> GROUP BY

 

  2.聚合键中隐含 NULL 的情况

SELECT shiire_tanka, COUNT(*)
FROM dbo.Shohin
GROUP BY shiire_tanka;

图片 9

  【备注】聚合键中涵盖
NULL 时,在结果中也会以 NULL 行的样式显示出来。

 

  3.WHERE 对 GROUP BY 执行结果的震慑

--语法
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--WHERE <表达式>
--GROUP BY <列名1>, <列名2>, ...

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

图片 10

  那里是先依据 WHERE 子句指定的基准进行过滤,然后再展开联谊处理。

  【执行各样】FROM
–> WHERE –> GROUP BY –>
SELECT。那里是举行各类,跟以前的书写顺序是不等同的。

 

  4.与聚合函数和 GROUP BY 子句关于的大面积错误

  (1)易错:在 SELECT
子句中书写了剩下的列

    SELECT 子句只好存在以下两种因素:

      ①常数

      ②聚合函数

      ③GROUP BY 子句中指定的列名(即聚合键)

图片 11

易错点1

  【总计】使用 GROUP
BY 子句时,SELECT 子句不可能出现聚合键之外的列名。

  (2)易错:在 GROUP
BY 子句中写了列的别名   

图片 12

 

易错点2

  回顾从前说的推行顺序,SELECT 子句是在 GROUP BY
子句之后执行。所以举行到 GROUP BY 子句时不知道该怎么做辨别别名。

  【总结】GROUP BY
子句不可以动用 SELECT 子句中定义的别名。

 

  (3)易错:GROUP BY
子句的结果能排序吗?

  【解答】它是自由的。如若想排序,请使用
ORDER BY 子句。

  【总计】GROUP BY
子句结果的显得是无序的。

 

  (4)易错:在 WHERE
子句中拔取聚合函数

图片 13

易错点3

  【总计】只有 SELECT
子句和 HAVING 子句(以及 ORDER BY 子句)中可以运用聚合函数。

  

三、为汇集结果指定条件

  1.HAVING 子句

  WHERE 子句智能指定记录(行)的尺度,而不可能用来指定组的标准。

  【备注】HAVING 是
HAVE(拥有)的明日分词。

--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...
--HAVING <分组结果对应的条件>

  【书写顺序】SELECT
–> FROM –> WHERE –> GROUP BY –> HAVING

SELECT shohin_bunrui, COUNT(*)
FROM dbo.Shohin
GROUP BY shohin_bunrui
HAVING COUNT(*) = 2

图片 14

从通过商品系列举行联谊分组后的结果中,取出“包含数据的行数为 2 行”的数据

  2.HAVING 子句的结合要素

    (1)3 要素:

      ①常数

      ②聚合函数

      ③GROUP BY 子句中指定的列名(即聚合键)

图片 15

易错用法

  3.HAVING 与 WHERE

  有些条件可以写在 HAVING 子句中,又足以写在 WHERE
子句中。这一个标准就是聚合键所对应的尺度。

  图片 16

结果一律

  【指出】尽管结果一律,聚合键对应的口径应该写在
WHERE 子句中,不是 HAVING 子句中。

  【理由】①WHERE
子句的施行进度比 HAVING 快。

      ②意思:WHERE 子句 = 指定行所对应的条件,HAVING 子句 =
指定组所对应的原则。

 

四、对查询结果开展排序

  1.ORDER BY 子句

--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--ORDER BY <排序基准列1>, <排序基准列2>, ...

SELECT shohin_id, hanbai_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka;    --升序排列

图片 17

销售单价由低到高(升序)

  排序键:ORDER BY
子句中书写的列名。

  【书写顺序】SELECT
–> FROM –> WHERE –> GROUP BY –> HAVING –> ORDER BY

 

   2.升序(ASC)和降序(DESC):

SELECT shohin_id, hanbai_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka DESC;    --降序排列

图片 18

  【备注】ORDER BY
子句中排列顺序时会默认使用升序(ASC)举行排列。

 

  3.指定五个排序键

SELECT shohin_id, shohin_mei, hanbai_tanka, shiire_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka, shohin_id;

图片 19

  4.NULL 值的依次:排序键中包含 NULL 时,会在起先或最后举办汇总。

 

  5.在排序键中选用 SELECT 子句中的别名

SELECT shohin_id AS id, shohin_mei, hanbai_tanka AS ht
FROM dbo.Shohin
ORDER BY ht, id;

图片 20

 

  【执行各样】FROM
–> WHERE –> GROUP BY –> HAVING –> SELECT –> ORDER BY

  【备注】ORDER BY
子句可以应用 SELECT 子句中定义的别名,GROUP BY 子句不可以选用别名。

 

  6.ORDER BY 子句中运用聚合函数

SELECT shohin_bunrui, COUNT(*)
FROM dbo.Shohin
GROUP BY shohin_bunrui
ORDER BY COUNT(*);

图片 21

  7.不提出采纳列的编号举行排序,即使可以

SELECT shohin_id ,
       shohin_mei ,
       shohin_bunrui ,
       hanbai_tanka ,
       shiire_tanka ,
       torokubi
FROM dbo.Shohin
ORDER BY hanbai_tanka DESC, shohin_id;

SELECT shohin_id ,
       shohin_mei ,
       shohin_bunrui ,
       hanbai_tanka ,
       shiire_tanka ,
       torokubi
FROM dbo.Shohin
ORDER BY 4 DESC, 1;  --这里使用列的编号,由于阅读不便,不推荐使用

图片 22

结果是千篇一律的

  【备注】在 ORDER BY
子句中永不拔取列的编号。

 

传送门

  《SQL 基础知识梳理(一) – 数据库与
SQL

  《SQL 基础知识梳理(二) –
查询基础

 

备注

  这里运用 MS SQL Server 举办求证,不保险拥有的 DBMS 执行结果正确。

 


【参考】《SQL ゼロからはじめるデータベース操作》

 

相关文章