我在书上和网上都看到了以下的内容:
GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面但是我如下的例子却正确执行成功了customer表的数据
ID NAME AGE
1 Tom 21
2 Mike 24
3 Jack 30
4 Linda 25
5 Tom 25订单orders表的数据
ID ORDER_NUMBER PRICE CUSTOMER_ID
1 Tom_Order001 100 1
2 Tom_Order002 200 1
3 Tom_Order003 300 1
4 Mike_Order001 100 2
5 Jack_Order001 200 3
6 Linda_Order001 100 4
7 UnknownOrder 200 nullsql是:
SELECT c.id AS id,
c.name AS name,
c.age AS age,
COUNT(o.id) AS num
FROM customers c
left JOIN orders o
ON c.id = o.customer_id
GROUP BY c.id
执行成功了,
查询结果是:
id name age num
1 Tom 21 3
2 Mike 24 1
3 Jack 30 1
4 Linda 25 1
5 Tom 25 0这个跟“select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面”有违背,
不知道怎么回事,请高手指教
GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面但是我如下的例子却正确执行成功了customer表的数据
ID NAME AGE
1 Tom 21
2 Mike 24
3 Jack 30
4 Linda 25
5 Tom 25订单orders表的数据
ID ORDER_NUMBER PRICE CUSTOMER_ID
1 Tom_Order001 100 1
2 Tom_Order002 200 1
3 Tom_Order003 300 1
4 Mike_Order001 100 2
5 Jack_Order001 200 3
6 Linda_Order001 100 4
7 UnknownOrder 200 nullsql是:
SELECT c.id AS id,
c.name AS name,
c.age AS age,
COUNT(o.id) AS num
FROM customers c
left JOIN orders o
ON c.id = o.customer_id
GROUP BY c.id
执行成功了,
查询结果是:
id name age num
1 Tom 21 3
2 Mike 24 1
3 Jack 30 1
4 Linda 25 1
5 Tom 25 0这个跟“select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面”有违背,
不知道怎么回事,请高手指教
c.name AS name,
c.age AS age,
COUNT(o.id) AS num
FROM customers c
left JOIN orders o
ON c.id = o.customer_id
GROUP BY c.id
执行成功了,
查询结果是:
id name age num
1 Tom 21 3
2 Mike 24 1
3 Jack 30 1
4 Linda 25 1
5 Tom 25 0
这个sql的也无意义是查询所有客户的订单的数量
mySQL 的语言支持这种非标SQL语句。但决不提倡这么用。
12.2.7. SELECT Syntax
MySQL extends the use of GROUP BY to allow selecting fields that are not mentioned in the GROUP BY clause. http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#select
MySQL对GROUP BY的使用进行了扩展,允许选择在GROUP BY子句中没有被提到的字段。如果您没有得到预期的结果,请阅读GROUP BY的说明,请参见12.10节,“与GROUP BY子句同时使用的函数和修改程序”。因此,我在mysql里面会成功,而有的朋友会执行失败,
既然不提倡我这么写,
想请高手指点我应该怎么实现这个业务才好,帮忙写个sql语句
SELECT c.id AS id,c.name as name,c.age as age,COUNT(o.id) AS num
FROM customer c left JOIN orders o
ON c.id = o.customerid
GROUP BY c.id, c.name,c.age
结果:
id name age num
----------- -------------------------------------------------- ----------- -----------
1 tom 21 3
2 mike 24 1
3 jack 30 1
4 linda 25 1
5 tom 25 0
你用的是MS-SQL,你写的不错,我理解,我想问问你,你在MS-SQL中,如果你把group by 语句写成GROUP BY c.id
能成功执行么,如果不能把错误信息发给我看看,谢谢
错误信息是:选择列表中的列 'customer.name' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。