东莞seo网站优化运营,12306网站建设,空中客车网站建设需求,资阳网站优化问题描述 为使讨论简单易懂#xff0c;我将问题稍作简化#xff0c;去掉诸多的背景。 从前有一个皇帝#xff0c;他有50个妃子#xff0c;这些妃子很没有天理的给他生了100,000个儿子#xff0c;于是#xff0c;皇帝很苦恼#xff0c;海量的儿子很难管理#xff0c;而且…问题描述 为使讨论简单易懂我将问题稍作简化去掉诸多的背景。 从前有一个皇帝他有50个妃子这些妃子很没有天理的给他生了100,000个儿子于是皇帝很苦恼海量的儿子很难管理而且他想知道每个妃子给他生了多少个儿子从而论功行赏这很难办。问题描述为使讨论简单易懂我将问题稍作简化去掉诸多的背景。从前有一个皇帝他有50个妃子这些妃子很没有天理的给他生了100,000个儿子于是皇帝很苦恼海量的儿子很难管理而且他想知道每个妃子给他生了多少个儿子从而论功行赏这很难办。于是皇帝请了一个程序员帮他编了一个程序用数据库来存储所有的儿子的信息这样就可以用程序来统计和管理啦。数据库的结构如下id皇子的唯一编号mother皇子母亲的唯一编号皇帝把妃子分成了两个等级天宫娘娘(编号小于25)和地宫娘娘(编号大于等于25)他想知道天宫娘娘们和地宫娘娘们的生育能力孰强孰弱。于是程序员开始写SQL Query了。方法1使用GROUP BYSQL QuerySELECTCOUNT(*)FROMprinceGROUPBYmother24;执行结果count(*)5002949971在100,000行数据上的运行时间0.0335 秒分析这种GROUP BY方法的最大问题在于无法区分所得到的结果。这两个数字哪一个是天宫娘娘们所生的皇子数哪一个是地宫娘娘们所生的皇子数呢不知道。所以尽管它统计出了总数但是没有什么意义。因此为了区分统计结果必须要把条件 mother 24 也作为一个字段在结果集中作为一个字段体现出来修改后的sql如下SELECTCOUNT(*)ASnumber,mother24AStypeFROMprinceGROUPBYmother24;执行结果number type50029 049971 1条件表达式作为字段时该字段的值就是该条件表达式的值因此对应我们的例子type 1 也就是表示 mother 24 的值为1因此第二行中的数字代表地宫娘娘们所生的皇子数。经过修改后我们看出天宫娘娘们略胜一筹。优缺点缺点是显而易见的由于使用了条件表达式作为分组依据它只能做二元的划分对于要分成多类进行统计的情况不能够胜任。比如要分别统计1~10号、11~24号25号~50号妃子的产子数就无法实现了。另外由于使用了GROUP BY因此涉及到排序执行时间上要更长。我暂时没有发现这种方法的优点。方法2使用嵌套的SELECT使用嵌套的SELECT也可以达到目的在每个SELECT子句中统计一个条件下的数据然后用一个主SELECT把这些统计数据整合起来。SQL QuerySELECT(SELECTCOUNT(*)FROMprinceWHEREmother24)ASdigong,(SELECTCOUNT(*)FROMprinceWHEREmother24)AStiangong执行结果digong tiangong49971 50029在100,000行数据上的运行时间0.0216 秒分析这种嵌套SELECT的方法非常直观就是分别统计各个条件下的数值最后进行汇总通俗易懂跟自然语言没啥区别了。优缺点优点就是直观而且速度也比GROUP BY要快。虽然是3条SELECT语句看起来比GROUP BY的方案多了2条语句但是它不涉及到排序这就节省了很多时间。缺点可能就是语句稍多对语句数量有洁癖的同学可能会比较不舒服。方法3使用CASE WHENCASE WHEN语句的功能很强大可以定义灵活的查询条件很适合进行分类统计。SQL QuerySELECTCOUNT(CASEWHENmother24THEN1ELSENULLEND)ASdigong,COUNT(CASEWHENmother24THEN1ELSENULLEND)AStiangongFROMprince执行结果digong tiangong49971 50029在100,000行数据上的运行时间0.02365825 秒分析此方法的关键在于COUNT(CASEWHENmother24THEN1ELSENULLEND)这里的COUNT和CASE WHEN联合使用做到了分类计数。先使用CASE WHEN当满足条件时将字段值设置为 1 不满足条件时将字段值设置为NULL接着COUNT函数仅对非NULL字段进行计数于是问题解决。优缺点优点嘛此方法也不涉及到排序因此运行时间上与方法2相当SELECT语句减少到了 1 条。缺点就是语句比较长对语句长度有洁癖的同学可能会比较不舒服。总结对于确定分类的按条件计数可以尽量不用GROUP BY从而避免排序动作加速Query的执行。如果需要根据某个字段的值进行分类而该字段的值是可变的比如皇帝要统计每一个妃子的产子数而他可能不停的再娶很多妃子这种情况下使用方法2和方法3就不太灵光了还是使用一个GROUP BY来得简单便捷。本文原创发布php中文网转载请注明出处感谢您的尊重