问题描述 为使讨论简单易懂,我将问题稍作简化,去掉诸多的背景。 从前有一个皇帝,他有50个妃子,这些妃子很没有天理的给他生了100,000个儿子,于是,皇帝很苦恼,海量的儿子很难管理,而且,他想知道每个妃子给他生了多少个儿子,从而论功行赏,这很难办。

问题描述

为使讨论简单易懂,我将问题稍作简化,去掉诸多的背景。

从前有一个皇帝,他有50个妃子,这些妃子很没有天理的给他生了100,000个儿子,于是,皇帝很苦恼,海量的儿子很难管理,而且,他想知道每个妃子给他生了多少个儿子,从而论功行赏,这很难办。于是,皇帝请了一个程序员帮他编了一个程序,用数据库来存储所有的儿子的信息,这样就可以用程序来统计和管理啦。

数据库的结构如下:

id

皇子的唯一编号

mother

皇子母亲的唯一编号

皇帝把妃子分成了两个等级,天宫娘娘(编号小于25)和地宫娘娘(编号大于等于25),他想知道天宫娘娘们和地宫娘娘们的生育能力孰强孰弱。于是,程序员开始写SQL Query了。

方法1:使用GROUP BY

SQL Query

SELECTCOUNT(*)FROM`prince`GROUPBY`mother`>24;

执行结果

count(*)

50029

49971

在100,000行数据上的运行时间:0.0335 秒

分析

这种GROUP BY方法的最大问题在于:无法区分所得到的结果。这两个数字哪一个是天宫娘娘们所生的皇子数,哪一个是地宫娘娘们所生的皇子数呢?不知道。所以,尽管它统计出了总数,但是没有什么意义。

因此,为了区分统计结果,必须要把条件 mother > 24 也作为一个字段在结果集中作为一个字段体现出来,修改后的sql如下:

SELECTCOUNT(*)AS`number`,`mother`>24AS`type`FROM`prince`GROUPBY`mother`>24;

执行结果

number type

50029 0

49971 1

条件表达式作为字段时,该字段的值就是该条件表达式的值,因此,对应我们的例子,type = 1 也就是表示 mother > 24 的值为1,因此,第二行中的数字代表地宫娘娘们所生的皇子数。

经过修改后,我们看出,天宫娘娘们略胜一筹。

优缺点

缺点是显而易见的,由于使用了条件表达式作为分组依据,它只能做二元的划分,对于要分成多类进行统计的情况不能够胜任。比如要分别统计1~10号、11~24号,25号~50号妃子的产子数,就无法实现了。

另外,由于使用了GROUP BY,因此涉及到排序,执行时间上要更长。

我暂时没有发现这种方法的优点。

方法2:使用嵌套的SELECT

使用嵌套的SELECT也可以达到目的,在每个SELECT子句中统计一个条件下的数据,然后用一个主SELECT把这些统计数据整合起来。

SQL Query

SELECT

(SELECTCOUNT(*)FROM`prince`WHERE`mother`>24)AS`digong`,

(SELECTCOUNT(*)FROM`prince`WHERE`mother`<=24)AS`tiangong`

执行结果

digong tiangong

49971 50029

在100,000行数据上的运行时间:0.0216 秒

分析

这种嵌套SELECT的方法非常直观,就是分别统计各个条件下的数值,最后进行汇总,通俗易懂,跟自然语言没啥区别了。

优缺点

优点就是直观,而且速度也比GROUP BY要快。虽然是3条SELECT语句,看起来比GROUP BY的方案多了2条语句,但是它不涉及到排序,这就节省了很多时间。

缺点可能就是语句稍多,对语句数量有洁癖的同学可能会比较不舒服。

方法3:使用CASE WHEN

CASE WHEN语句的功能很强大,可以定义灵活的查询条件,很适合进行分类统计。

SQL Query

SELECT

COUNT(CASEWHEN`mother`>24THEN1ELSENULLEND)AS`digong`,

COUNT(CASEWHEN`mother`<=24THEN1ELSENULLEND)AS`tiangong`

FROMprince

执行结果

digong tiangong

49971 50029

在100,000行数据上的运行时间:0.02365825 秒

分析

此方法的关键在于

COUNT(CASEWHEN`mother`>24THEN1ELSENULLEND)

这里的COUNT和CASE WHEN联合使用,做到了分类计数。先使用CASE WHEN,当满足条件时,将字段值设置为 1, 不满足条件时,将字段值设置为NULL,接着COUNT函数仅对非NULL字段进行计数,于是,问题解决。

优缺点

优点嘛,此方法也不涉及到排序,因此运行时间上与方法2相当,SELECT语句减少到了 1 条。

缺点就是语句比较长,对语句长度有洁癖的同学可能会比较不舒服。

总结

对于确定分类的按条件计数,可以尽量不用GROUP BY,从而避免排序动作,加速Query的执行。

如果需要根据某个字段的值进行分类,而该字段的值是可变的,比如皇帝要统计每一个妃子的产子数,而他可能不停的再娶很多妃子,这种情况下,使用方法2和方法3就不太灵光了,还是使用一个GROUP BY来得简单便捷。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php嵌套查询mysql语句_mysql 查询嵌套相关推荐

  1. mysql查询性别语句_MySQL查询语句简单操作示例

    本文实例讲述了MySQL查询语句简单操作.分享给大家供大家参考,具体如下: 查询 -- 创建数据库 create database python_test_1 charset=utf8; -- 使用数 ...

  2. mysql 查询字段语句_mysql查询语句常用字段操作函数

    一.concat()函数 1.功能:将多个字符串连接成一个字符串. 2.语法:concat(str1, str2,...) 返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为nu ...

  3. mysql查询死锁语句_MYSQL查询数据库死锁和事务的语句

    查看进程信息 SHOW FULL PROCESSLIST ; 查询事务信息 SELECT * FROM information_schema.INNODB_TRX t -- WHERE t.trx_q ...

  4. mysql5.5查询字段语句_mysql查询同一个字段下,不同内容的语句

    VC----Class Style类风格和窗口风格 CS_BYTEALIGNCLIENT:以字节边界来对齐窗口客户区,这个风格会影响 窗口 的宽度和水平位置.实际上没有看到效果. CS_BYTEALI ...

  5. MySQL语句系列--查询语句大全(有示例)

    原文网址:MySQL语句系列--查询语句大全(有示例)_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL查询语法(命令)的使用.包括:基本查询.运算条件.排序.分页.分组.联结.组合.子查询 ...

  6. oracle 数据库循环查询语句怎么写,sql循环查询(sql语句循环查询详解)

    sql循环查询(sql语句循环查询详解) 2020-07-24 11:15:51 共10个回答 select*fromawheret_idin('3','4');select*fromawheret_ ...

  7. mysql复杂连接查询语句_MySQL查询语句之复杂查询

    软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...

  8. mysql获取查询策略语句_MySQL数据库查询性能优化策略

    优化查询 使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 通过对查询语句的分析,可以了解查询语句的执行 ...

  9. mysql 统计查询不充电_MySql查询语句介绍,单表查询,来充电吧

    mysql在网站开发中,越来越多人使用了,方便部署,方便使用.我们要掌握mysql,首先要学习查询语句.查询单个表的数据,和多个表的联合查询. 下面以一些例子来先简单介绍下单表查询. 操作方法 01 ...

最新文章

  1. ASP.NET Core EFCore 之Code First
  2. 安装linux修复系统文件夹,误删除 Linux 系统文件了?这个方法教你解决
  3. Android 系统(12)---Zygote进程启动过程
  4. 用台式机搭建服务器测试环境_2020年十大最佳台式机环境
  5. javascript Date日期类
  6. 2017电子设计大赛论文:滚球控制系统
  7. c语言知识竞赛题库答案,2021年9月全国计算机二级C语言考试真题及答案
  8. 装饰者模式的应用:react高阶组件和ES6 装饰器
  9. 初学者福利:机器学习项目清单
  10. StretchDIBits 函数
  11. MFC实现FTP客户端
  12. 在树莓派中解决浏览器自动更新失败弹框遮挡数据的方案
  13. Destroying assets is not permitted to avoid data loss.
  14. Keil中添加对CX32L003系列芯片的支持
  15. python爬取拉勾网给定关键词职位信息存入数据库_Python 爬取拉勾网python职位信息...
  16. C++ GDAL/OGR 图层求交集Intersection
  17. gnuradio的安装以及安装常见错误
  18. iptables详解(三)
  19. 路径,端口,工具总结专题
  20. oracle to access,OracleToAccess-Oracle转Access软件 v3.5 免费版 - 安下载

热门文章

  1. 前端学习(3214):state的一个简洁方式
  2. [html] 说说你对移动优先布局的理解
  3. [js] 请使用 js 实现一个双向链表
  4. 工作217:重置逻辑
  5. 前端学习(2257)如何做分支管理
  6. 前端学习(1942)vue之电商管理系统电商系统之创建商品分类的分支
  7. 前端学习(1934)vue之电商管理系统电商系统之分析实现默认勾选权限
  8. 前端学习(764):创建对象的三种方式
  9. 第十二期:常用的几种大数据架构剖析
  10. 玩转oracle 11g(29):检查操作系统版本和查询表中修改数据