前文回顾:
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点。
子句的书写顺序
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 种要素如下所示:
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 子句的内容。
SELECT *
FROM Product
ORDER BY regist_date DESC, sale_price;