SQL基本功(三)-- 聚合与排序

SQL基本功(三)-- 聚合与排序_第1张图片

 前文回顾:

SQL知识点--插入记录

SQL知识点--更新记录、删除记录

SQL基本功(一)--SQL和数据库

SQL基本功(二)--查询基础 

表的聚合查询

聚合函数

表的分组

为聚合结果指定条件

对查询结果进行排序

知识检验


表的聚合查询

聚合函数

用于汇总的函数称为聚合函数或者聚集函数,所谓聚合,就是将多行汇总为一行。MySQL中常用聚合函数表

函数名 说明
COUNT([DISTINCT | ALL] * ) 统计数据表中的记录数
COUNT([DISTINCT | ALL] <列名> ) 统计数据表中的一列中值的个数
MAX([DISTINCT | ALL] <列名>) 求数据表的一列值中的最大值
MIN([DISTINCT | ALL] <列名>) 求数据表的一列值中的最小值
SUM([DISTINCT | ALL] <列名>) 计算数据表的一列中值的总和
AVG([DISTINCT | ALL] <列名>) 计算数据表的一列中值的平均值

其中,COUNT 函数的结果根据参数的不同而不同。 COUNT (*) 会得到包含 NULL 的数据行数,而 COUNT (< 列名 >) 会得到 NULL 之外的数据行数。聚合函数会将 NULL 排除在外。但 COUNT (*)例外,并不会排除 NULL 。如果指定关键字DISTINCT,则表示在计算时要取消指定列中的重复值;如果不指定DISTINCT短语或指定ALL短语(ALL为默认值),则表示不取消重复值。PS.除了函数COUNT(*)外,其余聚合函数(包括COUNT(<列名>))都会忽略空值。  

表的分组

 GROUP BY 子句的书写位置有严格要求,一定要写在FROM 语句之后(如果有 WHERE 子句的话需要写在 WHERE 子句之后)。如果无视子句的书写顺序,SQL 就一定会无法正常执行而出错

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

  • ① 只能写在 SELECT 子句之中
  • ② GROUP BY 子句中不能使用 SELECT 子句中列的别名
  • ③ GROUP BY 子句的聚合结果是无序的
  • ④ WHERE 子句中不能使用聚合函数

子句的书写顺序

1. SELECT → 2. FROM → 3. WHERE → 4. GROUP BY(SQL子句的顺序不能改变,也不能互相替换。)

GROUP BY 和 WHERE 并用时 SELECT 语句的执行顺序

FROM → WHERE → GROUP BY → SELECT

为聚合结果指定条件

HAVING 子句的语法如下所示:HAVING 子句必须写在 GROUP BY 子句之后,其在 DBMS 内部的执行顺序也排在 GROUP BY 子句之后。

SELECT < 列名 1>, < 列名 2>, < 列名 3>, ……
FROM < 表名 >
GROUP BY < 列名 1>, < 列名 2>, < 列名 3>, ……
HAVING < 分组结果对应的条件 >

使用 HAVING 子句时 SELECT 语句的顺序
SELECT → FROM → WHERE → GROUP BY → HAVING 

 HAVING 子句中能够使用的 3 种要素如下所示

  •  常数
  • 聚合函数
  •  GROUP BY 子句中指定的列名(即聚合键)
  • WHERE 子句 = 指定行所对应的条件
    HAVING 子句 = 指定组所对应的条件
  • 通常情况下,为了得到相同的结果,将条件写在 WHERE 子句中要比写在 HAVING 子句中的处理速度更快,返回结果所需的时间更短。

对查询结果进行排序

 ORDER BY 子句,不论何种情况, ORDER BY 子句都需要写在 SELECT 语句的末尾。
是因为对数据行进行排序的操作必须在结果即将返回时执行。 ORDER BY子句中书写的列名称为排序键。降序排列时关键字是DESC,升序排列时关键字是ASC,未指定 ORDER BY 子句中排列顺序时会默认使用升序进行排列,排序键中包含 NULL 时,会在开头或末尾进行汇总

SELECT < 列名 1>, < 列名 2>, < 列名 3>, ……
FROM < 表名 >
ORDER BY < 排序基准列 1>, < 排序基准列 2>, ……

子句的书写顺序

1. SELECT 子句 → 2. FROM 子句 → 3. WHERE 子句 → 4. GROUP BY 子句 →
5. HAVING 子句 → 6. ORDER BY 子句

如果想要对该顺序的商品进行更细致的排序的话,就需要再添加一个排序键。规则是优先使用左侧的键,如果该列存在相同值的话,再接着参考右侧的键。当然,也可以同时使用 3 个以上的排序键。

使用 HAVING 子句时 SELECT 语句的顺序
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

因此在使用ODER BY排序的时候可以使用GROUP BY中设置的别名,在 ORDER BY 子句中可以使用 SELECT 子句中未使用的列和聚合函数。

知识检验

1、请指出下述 SELECT 语句中所有的语法错误。

SELECT product_id, SUM(product_name)
-- 本 SELECT 语句中存在错误。
FROM Product
GROUP BY product_type
WHERE regist_date > '2009-09-01';

错误:
①使用了字符类型的列(product_name)作为 SUM 函数的参数
②WHERE 子句写在了 GROUP BY 子句之后
③SELECT 子句中存在 GROUP BY 子句中未指定的列(product_type)

2、请编写一条 SELECT 语句,求出销售单价( sale_price 列)合计值是
进货单价( purchase_price 列)合计值 1.5 倍的商品种类。执行结果
如下所示。

 

SELECT product_type,sum(sale_price) ,sum(purchase_price) 
FROM product
group by product_type
HAVING sum(purchase_price)*1.5<sum(sale_price)

 3、此前我们曾经使用 SELECT 语句选取出了 Product ( 商品 ) 表中的全部记录。当时我们使用了 ORDER BY 子句来指定排列顺序,但现在已经无法记起当时如何指定的了。请根据下列执行结果,思考 ORDER BY 子句的内容。

SQL基本功(三)-- 聚合与排序_第2张图片

 SELECT *
  FROM Product
 ORDER BY regist_date DESC, sale_price;

SQL基本功(三)-- 聚合与排序_第3张图片

你可能感兴趣的:(SQL,sql,数据库,database)