mySQL的group by用法深入探讨

先上网上目前的结论:

  • 必須出現在where之後,order by之前
  • select中的列名必須是分組列或者列函數

但是,其实这个结论是不完整的。

先看表:

  1. Student table


  2. Apply table


现在,以下的group by是正确的:

select sname, count(distinct uName)
from Apply join Student using (sid)
group by (sid)
;

其实,其中sname换成sid, score, sssize都是对的
按理说按照最开始的结论,应该只有sid对才对的

而以下的是错误的:

select uName, count(distinct uName)
from Apply join Student using (sid)
group by (sid)
;

其实,uName换成degree、decision都是错的。

原因是:

结论还要加上:select中的列名不是分组列且不写在聚合函数里也是可以的,但是前提是该列名和分组列应该是一一对应关系

原理是:

首先要明确group by的每一个组在之后生成的查询结果表中肯定都是只占一行的。
所以先解释一下为什么聚合函数出现在select中肯定是没问题的:因为聚合函数生成的只有一个值,在生成表中只占用一格。
然后解释为什么上面的sname以及score以及sssize都可以,因为他们三个属性都和sid是一一对应关系(在Student表里面sid是主键,决定他们仨),所以他们仨在生成表里面也都只占用一格。
最后解释为什么degree那些要报错,因为他们在join之后的表里面和sid不是一一对应关系,因此在生成表里面就会占用多格,这就不符合atomic的标准了。

源于和舍友的讨论 <杨~叶>

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近打算采用关系型数据库来理一下公司的运营数据,先拿点东西练手找感觉。下面是几个关于学生课业的表,需要建立一个数据...
    九天朱雀阅读 1,003评论 0 3
  • 1.数据库简介 人类在进化的过程中,创造了数字、文字、符号等来进行数据的记录,但是承受着认知能力和创造能力的提升,...
    大熊_7d48阅读 553评论 0 1
  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,250评论 0 7
  • DQL数据查询语言 数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。 查询返回的结果集是一...
    Michael_林阅读 697评论 0 1
  • 「1」数量排名 1741简书钻,排名890。 「2」奖励情况 昨天得到8.5个,比前天4个有很大增幅。 突破主要在...
    朱团辉阅读 781评论 7 29