数据汇总函数
AVG()
– 求平均值
SELECT AVG(prod_price)
FROM products;
我们还可以对符合条件的行求平均值,例如:
SELECT AVG(prod_price)
FROM products
WHERE vend_id = 'BRS01';
这里有两点要说明下:1.AVG()
会忽略列值为NULL的行。2.AVG()
只能用来确定特定数值列的平均值。
COUNT()
– 计数
我们使用 COUNT()
函数进行计数。
COUNT()
函数有两种使用方式:
- 使用
COUNT(*)
对表中行的数目进行计数,不管表列中包含的是空值(NULL
)还是非空值。 - 使用
COUNT(column)
对特定列中具有值的行进行计数,忽略NULL
值。
例如:
SELECT COUNT(*)
FROM customers;
SELECT COUNT(cust_email)
FROM customers;
如果指定列名,则 COUNT()
函数会忽略指定列的值为空的行,但如果COUNT()
函数中用的是星号(*),则不忽略。
MAX() – 求最大值
SELECT MAX(prod_price)
FROM products;
MIN() – 求最小值
SELECT MIN(prod_price)
FROM products;
MAX(),MIN()
函数会忽略值为 NULL
的行。
SUM() – 求和
SELECT SUM(quantity * item_price)
FROM orderitems;
汇总函数用来汇总数据,这些函数都很高效,一般比自己在程序中计算要快得多,所以能用汇总函数解决的我们就不要自己在程序中计算。
分组汇总
假设我们要求每个供应商的商品价格的平均值,如果一个供应商一个供应商的计算,显然过于麻烦。这时候我们可以使用 GROUP BY
子句。
SELECT vend_id, AVG(prod_price)
FROM products
GROUP BY vend_id;
在使用 GROUP BY
时,除计算语句外,SELECT
语句中的每一列都必须在 GROUP BY
子句中给出。GROUP BY
子句必须出现在 WHERE
子句之后,ORDER BY
子句之前。
像对行进行过滤一样,我们也可以对分组进行过滤。与过滤行不同的是,过滤分组不能使用 WHERE
子句,因为 WHERE
子句没有分组的概念,我们可以使用另外一个子句 HAVING
。WHERE
用来过滤行,HAVING
用来过滤分组。WHERE
在数据分组前进行过滤,HAVING
在数据分组后进行过滤。
例如:
每个供应商供应商品的平均价格。
SELECT vend_id, AVG(prod_price) AS avg_price
FROM products
GROUP BY vend_id;
使用 having 进行过滤
SELECT vend_id, AVG(prod_price) AS avg_price
FROM products
GROUP BY vend_id
HAVING avg_price > 5;
每个供应商的商品数
SELECT vend_id, count(*)
FROM products
GROUP BY end_id;
每个供应商商品价格的最大值
SELECT vend_id, MAX(prod_price)
FROM products
GROUP BY vend_id;
每个供应商商品价格的最小值
SELECT vend_id, MIN(prod_price)
FROM products
GROUP BY vend_id;
每个订单的金额
SELECT order_num,SUM(quantity * item_price)
FROM orderitems
GROUP BY order_num;
SQL 子句的顺序
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
备注:示例中用到的表和数据可以通过链接(https://github.com/songw/sql)下载。
本系列目录:零基础入门 SQL 系列之(一)查询数据
零基础入门 SQL 系列之(二)排序
零基础入门 SQL 系列之(三)过滤数据
零基础入门 SQL 系列之(四)内置函数
零基础入门 SQL 系列之(五)数据汇总
零基础入门 SQL 系列之(六)表连接
零基础入门 SQL 系列之(七)组合
零基础入门 SQL 系列之(八)插入、更新、删除
零基础入门 SQL 系列之(九)创建和操作表
零基础入门 SQL 系列之(十)视图