日期:2014-05-17  浏览次数:20486 次

这句SQL语句,不能理解
要求统计每个客户下的订单总数:

这句能理解:

SELECT 客户表.姓名,COUNT(*) AS 订单总数
FROM 客户表,订单主表 
WHERE 客户表.客户编号 = 订单主表.客户编号
group by 客户表.姓名

这句不能理解:

SELECT 客户表.姓名,COUNT(订单主表.客户编号) AS 订单总数
FROM 客户表,订单主表 
WHERE 客户表.客户编号 = 订单主表.客户编号
group by 客户表.姓名


问题:
上面那句我能理解,按照姓名分组,然后统计每个组的个数,第二句我不能理解,每个组为什么就能统计“订单主表.客户编号”的总数。
按照SQL Server帮助文档里面说的:
聚合函数每个组进行聚集;
SELECT 子句列表中的聚合函数提供有关每个组(而不是各行)的信息

分组是按照“客户表.姓名”分组的,怎么能说明COUNT(订单主表.客户编号)就是每个组的信息啊?COUNT(订单主表.客户编号)不是整个订单主表吗?

实在不能理解.........

------解决方案--------------------
你这两个结果有区别吗
------解决方案--------------------
SQL code

--
SELECT 客户表.姓名,COUNT(订单主表.客户编号) AS 订单总数
FROM 客户表,订单主表  
WHERE 客户表.客户编号 = 订单主表.客户编号
group by 客户表.姓名
--
SELECT 客户表.姓名,COUNT(1) AS 订单总数
FROM 客户表,订单主表  
WHERE 客户表.客户编号 = 订单主表.客户编号
group by 客户表.姓名
--
SELECT 客户表.姓名,COUNT(*) AS 订单总数
FROM 客户表,订单主表  
WHERE 客户表.客户编号 = 订单主表.客户编号
group by 客户表.姓名

------解决方案--------------------
count是表联合之后 基于group By的字段统计 和count里面的内容没关系 count(1) 也都可以
------解决方案--------------------
GROUP BY就可以分组了 。。

COUNT(订单主表.客户编号)是求的分组后的信息。
------解决方案--------------------
SQL code
SQL Select语句完整的执行顺序: 

1、from子句组装来自不同数据源的数据; 
2、where子句基于指定的条件对记录行进行筛选; 
3、group by子句将数据划分为多个分组; 
4、使用聚集函数进行计算; 
5、使用having子句筛选分组; 
6、计算所有的表达式; 
7、使用order by对结果集进行排序。 


另外:一个查询语句各个部分的执行顺序: 
--8)  SELECT (9) DISTINCT (11) <TOP_specification> <select_list> 
--(1)  FROM <left_table> 
--(3)    <join_type> JOIN <right_table> 
--(2)      ON <join_condition> 
--(4)  WHERE <where_condition> 
--(5)  GROUP BY <group_by_list> 
--(6)  WITH {CUBE | ROLLUP} 
--(7)  HAVING <having_condition> 
--(10) ORDER BY <order_by_list>

------解决方案--------------------
但这个是不同的,这个结果会是0,count(null)这是个很有用处的东西,以后很多地方你都会用到的
,可以简化很多语句
SQL code

SELECT 客户表.姓名,COUNT(null) AS 订单总数--此处为0
FROM 客户表,订单主表  
WHERE 客户表.客户编号 = 订单主表.客户编号
group by 客户表.姓名

------解决方案--------------------
如果单是一个语句

select count(*) from tb
select count(字段) from tb --这个会过滤掉null值

但是你的语句是一个内连接,join的时候已经过滤了客户编号 为null的

所以结果肯定是一样的
------解决方案--------------------
分组是这样的 假如你join 后的数据是
name 订单
张三 订单1
张三 订单2
张三 订单3 
李四 订单1
李四 订单2

group by name 就是按照name 分组 那么一样的是一组
张三就是一组了,那么张三出现的次数也就是count 的结果
也是订单次数


这下总该明白了吧
------解决方案--------------------
楼主是不明白group by的用法? 楼上已经解释了,看明白了
------解决方案--------------------
探讨

引用:

count是表联合之后 基于group By的字段统计 和count里面的内容没关系 count(1) 也都可以

和COUNT里面的内容有关系吧,比如,下面两句:

SELECT 客户表.姓名,COUNT(客户表.客户编号) AS 订单总数
FROM 客户表 LEFT JOIN 订单主表
ON 客户表.客户编号 = 订单主表.客户编号
group……

------解决方案--------------------
探讨

我就是能理解
SELECT 客户表.姓名,COUNT(客户表.客户编号) AS 订单总数
FROM 客户表,订单主表
WHERE 客户表.客户编号 = 订单主表.客户编号
group by 客户表.姓名




不能理解:
SELECT 客户表.姓名,COUNT(订单主表.客户编号) AS 订单总数
FROM 客户表,订单主表
WHERE 客户表.客户编号 = 订单主表.……

------解决方案--------------------