[关闭]
@tingyuge 2016-08-04T01:55:08.000000Z 字数 1155 阅读 1018

MySQL基本知识 -- 进阶

MySQL进阶 MySQL


数据分组

分组允许把数据分为多个逻辑组,以便能对每组数据进行聚集计算。

1.创建分组
分组是在SELECT语句的GROUP BY子句中建立的。
  1. SELECT columnName1, COUNT(columnName2) AS coluMnName FROM tableName GROUP BY columnName1;
GROUP BY子句指示MySQL分组数据,然后对每组而不是整个结果集进行聚集。
注意:
GROUP BY子句必须出现在WHERE子句之后,ORDER BY之前。
2.过滤分组
除了能用GROUP BY分组数据外,还能够使用HAVING子句过滤分组,规定包括哪些分组,排除哪些分组。例如,想要列出至少有两个订单的所有顾客,为了得到这种数据,必须基于完整的分组而不是个别的行进行过滤。
  1. SELECT columnName1, COUNT(columnName2) AS columnName FROM tableName GROUP BY columnName1 HAVING columnName > 2;
注意:
HAVINGWHERE的区别:
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤,WHERE排除的行不在分组中,这可能会改变计算值,从而影响HAVING子句基于这些值过滤的分组.

完整的SELECT子句的顺序

  1. SELECT * FROM tableName WHERE columnName = value GROUP BY columnName HAVING columnName ORDER BY columnName LIMIT num1,num2;

使用子查询

子查询:
嵌套在其他查询中的查询。使用子查询可以把多个查询语句组合为一条语句。
假如在商城系统中要查询订购物品TNT2的所有客户,有两种方式:
第一种为一步一步进行查询:
  1. # 查询订单表中订单物品为TNT2的所有订单
  2. SELECT order_num FROM orderitems WHERE pro_id = 'TNT2';
  3. 假设上条语句结果为2005,2007
  4. SELECT cust_id FROM orders WHERE order_num IN (2005,2007);
  5. # 假设上条语句结果为1001,1004
  6. SELECT cust_name FROM custmoers WHERE cust_id IN (1001, 1004);
  7. # 上条语句查询出customer表中用户的用户名

第二种方法为使用子查询,将上述的三条语句组合在一起:

  1. SELECT cust_name FROM custmoers WHERE cust_id IN (
  2. SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num
  3. FROM orderitems WHERE pro_id = 'TNT2')
  4. );
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注