MySQL学习笔记3(汇总数据,分组数据,子查询)

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的所有客户,包括以下步骤:

  1. 检索包含物品TNT2的所有订单的编号
  2. 检索具有上步订单编号的所有客户ID
  3. 检索上步所有客户ID的客户信息

第一步                                                第二步                                                             第三步

    

改用内嵌子查询的句法如下:

(><有点恶心,并没有感觉到哪里灵活...)

上述语句实际上执行了3个SELECT语句。最里面的子查询返回订单号列表,中间的返回客户ID,最后返回客户信息。

3作为计算字段使用子查询

假如需要显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。应实现如下步骤:

  1. 从customers表中检索客户列表
  2. 对于检索出的每个用户,统计其在orders表中的订单数目

可使用SELECT COUNT(*)对表中的行进行计数,并且通过提供一条WHERE子句来过滤某个特定的客户ID,仅对该客户进行计数,例如对客户10001的订单进行计数:

select COUNT(*) AS orders

from orders

where cust_id = 10001;

当对每个客户进行COUNT(*)计算,应该将COUNT(*)作为一个查询:

有两个cust_id列,一个在orders一个在customers,需要比较这两个列以正确地把订单与它们相应的顾客匹配。

猜你喜欢

转载自blog.csdn.net/captainNYS/article/details/87886546
今日推荐