数据的分组(group by/having)
- GROUP BY(COLUMN)
根据某一列的类别进行分组根据某一列的类别进行分组。
举个例子:比如说我们需要知道每一个id下分别有多少个产品,因此我们需要根据id进行对数据进行分组,同时对每个组进行计数。
SELECT vend_id, COUNT (*) AS num_prods FROM products GROUP BY vend_id;
我们就可以发现,vend_id 为1001的产品共有3个,以此类推。
- HAVING过滤分组
HAVING非常类似于WHERE,两者都用于限定条件。 唯一的差别是WHERE过滤行,而HAVING对分组进行过滤,因此HAVING必须跟在group by 后面(WHERE在数据分组前进行过滤, HAVING在数据分组后进行过滤)。
下面这条SELECT语句类似于上面的语句。但最后一行增加了HAVING子句,它过滤COUNT(*) >=2(两个以上的订单)的那些分组。
SELECT vend_id, COUNT (*) AS num_prods FROM products GROUP BY vend_id HAVING COUNT(*)>=2;
- 分组与排序
一般在使用GROUP BY子句时,我们应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法。不能仅依赖GROUP BY排序数据。ORDER BY 可以指出我们到底应该按照哪一列来的顺序进行排序,是从小到大还是从大到小进行排序。
数据的汇总
汇总的目的主要有以下:
- 确定表中行数
- 获得表中行组的和
- 找出所有行或某些特定行的最大值、最小值和平均
值
因此,基于这些需求,我们可以找出常用的函数:
1. AVG()函数
下面的例子使用AVG()返回products表中特定供应商的所有产品的平均价格:
SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id =1003;
注意:
a. AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。如果要获得多个列的平均值,必须使用多个AVG()函数 。
b. AVG()函数忽略值为NULL的行
2. COUNT()函数
COUNT()函数进行计数。可利用COUNT()确定表中行的数目或符合特定条件的行的数目。
COUNT()函数有两种使用方式:
a. 使用COUNT(*)计算表中行的数目, 不管表列中包含的是空值(NULL)还是非空值。
b. 使用COUNT(column)计算特定列中具有值的行的数目,忽略
NULL值。
比如说返回customers表中客户的总数 ,
SELECT COUNT(*) AS num_cust FROM customers;
再比如说使用count(cust_email)只对具有电子邮件地址的客户计数 (因为count函数不对空值计数,所以只会计数非空值即有邮件信息的客户)
SELECT COUNT(cust_email) AS num_cust FROM customers;
3. MAX()函数和MIN()函数
- 分别用于返回指定列中的最大值和最小值。
- 要求必须指定列名
例如找出最贵的商品价格,和最低的价格:
SELECT MAX(prod_price) AS max_price FROM products;
SELECT MIN(prod_price) AS min_price FROM products;
4. SUM()函数
常用于合计计算,比如说计算总的订单总额:
SELECT SUM(item_price*quantity) AS total_price FROM orderitems ;
5. 组合汇总函数
同时汇总计数,最大值,最小值,均值:
SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products;
输出结果如下: