12汇总数据
1聚集函数
运行在行组上,计算和返回单个值的函数。
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和
1.1AVG()
AVG()只能用于单个列。
NULL值:AVG()忽略列值为NULL的行。
1.2COUNT()
NULL值:
使用COUNT(*)对表中行数进行计数,不管表列中包含的是空值(NULL)还是非空值。
使用COUNT(column)对特定列中具有的行进行计数,忽略NULL值。
1.3MAX() 和 MIN()
适用于任意列,如数值、日期、文本。
NULL值:MAX()忽略列值为NULL的行。
MIN()功能与之相反。
1.4SUM()函数
函数SUM(item_price*quantity)返回订单中所有物品价钱之和,where子句同样保证只统计某个物品订单中的物品。
NULL值:忽略。
如本例所示,利用标准算术操作符,所有的聚集函数都可用来执行多个列上的计算。(只返回一个值,与1.1AVG()限定单个列并不冲突)
2聚集不同的值
ALL(默认参数)对所有行执行计算,DISTINCT只对不同值的行执行计算。
如果指定列名,则DISTINCT只能用于COUNT().DISTINCT不能用于COUTN(*),因此不能使用COUNT(DISTINCT).
DISTINCT用于MIN() MAX()无意义。
3组合聚集函数
13分组数据
1GROUP BY创建分组
GROUP BY子句指示按vend_id排序并分组数据。
2HAVING 过滤分组
HAVING和WHERE 句法相同,唯一差别是WHERE在数据分组前对行进行过滤,HAVING在数据分组后对组进行过滤。
上例如果没有HAVING:
3分组和排序
不能依赖GROUP BY排序数据,一般在使用GROUP BY 子句时,也给出ORDER BY,这是数据正确排序的唯一方法。
加ORDER BY 子句来实现结果排序:
4SELECT 子句次序
SELECT > FROM > WHERE > GROUP BY > HAVING > ORDER BY > LIMIT
14子查询
1子查询就是嵌套在其他查询中的查询。
2利用子查询进行过滤
现在需要列出订购物品TNT2的所有客户,包括以下步骤:
- 检索包含物品TNT2的所有订单的编号
- 检索具有上步订单编号的所有客户ID
- 检索上步所有客户ID的客户信息
第一步 第二步 第三步
改用内嵌子查询的句法如下:
(><有点恶心,并没有感觉到哪里灵活...)(下一篇笔记中的联结表更为简洁灵活)
上述语句实际上执行了3个SELECT语句。最里面的子查询返回订单号列表,中间的返回客户ID,最后返回客户信息。
3作为计算字段使用子查询
假如需要显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。应实现如下步骤:
- 从customers表中检索客户列表
- 对于检索出的每个用户,统计其在orders表中的订单数目
可使用SELECT COUNT(*)对表中的行进行计数,并且通过提供一条WHERE子句来过滤某个特定的客户ID,仅对该客户进行计数,例如对客户10001的订单进行计数:
select COUNT(*) AS orders
from orders
where cust_id = 10001;
当对每个客户进行COUNT(*)计算,应该将COUNT(*)作为一个查询:
有两个cust_id列,一个在orders一个在customers,需要比较这两个列以正确地把订单与它们相应的顾客匹配。