我在书上和网上都看到了以下的内容:
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 后面”有违背,
不知道怎么回事,请高手指教

解决方案 »

  1.   

    这个跟“select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面”有违背这个结果和你把 name 以及age 放到groupby之后是一样的,估计是系统帮你做了优化。所以会成功
      

  2.   

    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 
    这个sql的也无意义是查询所有客户的订单的数量
      

  3.   

    help me,,please :-)
      

  4.   

    啊,不会吧,我在mysql里面运行的,没错
      

  5.   

    朋友兄弟们,我找到原因了,因为我用的是mysql,又因为如下:
    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语句
      

  6.   

    help me,,please :-)
      

  7.   

    我用的是MS-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
      

  8.   

    楼上的朋友,你好
    你用的是MS-SQL,你写的不错,我理解,我想问问你,你在MS-SQL中,如果你把group by 语句写成GROUP BY c.id
    能成功执行么,如果不能把错误信息发给我看看,谢谢
      

  9.   

    如果你把group by 语句写成GROUP BY c.id ,不能执行。
    错误信息是:选择列表中的列 'customer.name' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。