php嵌套查询mysql语句_mysql 查询嵌套
问题描述 为使讨论简单易懂,我将问题稍作简化,去掉诸多的背景。 从前有一个皇帝,他有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 查询嵌套相关推荐
- mysql查询性别语句_MySQL查询语句简单操作示例
本文实例讲述了MySQL查询语句简单操作.分享给大家供大家参考,具体如下: 查询 -- 创建数据库 create database python_test_1 charset=utf8; -- 使用数 ...
- mysql 查询字段语句_mysql查询语句常用字段操作函数
一.concat()函数 1.功能:将多个字符串连接成一个字符串. 2.语法:concat(str1, str2,...) 返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为nu ...
- mysql查询死锁语句_MYSQL查询数据库死锁和事务的语句
查看进程信息 SHOW FULL PROCESSLIST ; 查询事务信息 SELECT * FROM information_schema.INNODB_TRX t -- WHERE t.trx_q ...
- mysql5.5查询字段语句_mysql查询同一个字段下,不同内容的语句
VC----Class Style类风格和窗口风格 CS_BYTEALIGNCLIENT:以字节边界来对齐窗口客户区,这个风格会影响 窗口 的宽度和水平位置.实际上没有看到效果. CS_BYTEALI ...
- MySQL语句系列--查询语句大全(有示例)
原文网址:MySQL语句系列--查询语句大全(有示例)_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL查询语法(命令)的使用.包括:基本查询.运算条件.排序.分页.分组.联结.组合.子查询 ...
- oracle 数据库循环查询语句怎么写,sql循环查询(sql语句循环查询详解)
sql循环查询(sql语句循环查询详解) 2020-07-24 11:15:51 共10个回答 select*fromawheret_idin('3','4');select*fromawheret_ ...
- mysql复杂连接查询语句_MySQL查询语句之复杂查询
软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...
- mysql获取查询策略语句_MySQL数据库查询性能优化策略
优化查询 使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 通过对查询语句的分析,可以了解查询语句的执行 ...
- mysql 统计查询不充电_MySql查询语句介绍,单表查询,来充电吧
mysql在网站开发中,越来越多人使用了,方便部署,方便使用.我们要掌握mysql,首先要学习查询语句.查询单个表的数据,和多个表的联合查询. 下面以一些例子来先简单介绍下单表查询. 操作方法 01 ...
最新文章
- ASP.NET Core EFCore 之Code First
- 安装linux修复系统文件夹,误删除 Linux 系统文件了?这个方法教你解决
- Android 系统(12)---Zygote进程启动过程
- 用台式机搭建服务器测试环境_2020年十大最佳台式机环境
- javascript Date日期类
- 2017电子设计大赛论文:滚球控制系统
- c语言知识竞赛题库答案,2021年9月全国计算机二级C语言考试真题及答案
- 装饰者模式的应用:react高阶组件和ES6 装饰器
- 初学者福利:机器学习项目清单
- StretchDIBits 函数
- MFC实现FTP客户端
- 在树莓派中解决浏览器自动更新失败弹框遮挡数据的方案
- Destroying assets is not permitted to avoid data loss.
- Keil中添加对CX32L003系列芯片的支持
- python爬取拉勾网给定关键词职位信息存入数据库_Python 爬取拉勾网python职位信息...
- C++ GDAL/OGR 图层求交集Intersection
- gnuradio的安装以及安装常见错误
- iptables详解(三)
- 路径,端口,工具总结专题
- oracle to access,OracleToAccess-Oracle转Access软件 v3.5 免费版 - 安下载