想测试一下group by单独使用的情况,结果发现好多问题,求高手解答(用的Mysql数据库)。
(1)单独使用group by分组,下面是表结构、SQL语句以及输出数据,怎么会是这个结果啊?(用的Mysql数据库)本来想的是会把classId为1的放在一起,为2的全部放在一起,结果怎么就只显示了两条数据呢?(2)我想把classId相同的放在一起显示应该怎么做呢,order by除外哈,order by可以实现,不过我就想知道通过group by该怎么写?(3)不是说select后面的字段,要么出现在group by字句后面,要么出现在聚合函数里,可是我上面的select * 居然也没报错。(4)不是说having只能和group by配合使用么,可是我下面这个语句居然也没报错。
(5)感觉group by,having字句好混乱啊。

解决方案 »

  1.   

    问题一个个回答
    1  建议看看group by的作用,将相同的值分组统计,你的classId只有两个,肯定只有两条语句2  如果没有别的条件,只通过classId分组,实现不了3  这个写法是错的,mysql默认使用不严格的SQL模式,最好不要这么使用4  一般不这么写,不聚合的使用where效率更好,where是先过滤后取值,而having是先取值后过滤5  建议先弄懂group by是干啥用的
      

  2.   

    GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
    这个比较适合做分组统计还有就是解决distinct的去重复问题,DISTINCT 是对整个查询字段的排重,当我们只需要对某一个或几个字段排重时候可以使用。这个就是你最开始的Sql为什么只查询出两条。
      

  3.   

    1 . select * from stu group by classId    默认获取的是分组的第一个值。
    2.  having 没见过这样使用的。
      

  4.   

    1,在MySQL中使用group by的作用是将其后接的字段分组,你这条查询  语句中是按classID进行分组,在数据表中classID只有两种值,即1  和2,使用group by结果集classID就只会有1和2。还有就是你select  数据表中的所有字段,所以在结果集中会得到name,classID,age三个  字段,在结果集中就会输出排在前面的字段。因为stu1和stu10排在  前面,而classID的值也刚好是1和2,所以只会输出这两行结果。
    2,如果你要用select输出表中的所有字段,用group by classID貌似  不行。你用select classID from stu group by classID;会输出1  和2,只能这样看classID字段值的不同值。
    3,select *是输出表的所有字段,你说的group by 后面classID字段  ,select *也包括,所以不会报错
    4,在MySQL中having非常类似于where,有些类型的where子句可以用having代替,唯一的区别是where过滤行,having过滤分组。其实你这个语句就类似于select * from stu where age>19;
    5,给你三个例子:一.select age from stu group by age;按age分组
                    二.select age from stu having age;查询age所有值
                    三.select age from stu group by age having age<25;将age小于25的分组
    你自己操作一下,然后比较一下结果,就知道了。