开发写了几个语句,觉得查询结果跟逻辑有点不相符,就拿到这里一起分析了下。

语句如下:

  1. select tp.title, tp.amount,
  2.  
  3. ifnull(sum(case when tu.type = 1 then ti.invest_amount else 0 end),0) as aInvestAmount,
  4.  
  5. ifnull(sum(case when tu.type = 2 then ti.invest_amount else 0 end),0) as bInvestAmount,
  6.  
  7. ifnull(sum(case when tu.type = 3 then ti.invest_amount else 0 end),0) as cInvestAmount
  8.  
  9. from t_invest ti join t_user tu on ti.user_id = tu.id join t_project tp on ti.project_id = tp.id
  10.  
  11. where tp.id = '';

其中t_project 中有id:48346631623950333337353439383060,但在t_invest中是没有此project_id的。所以这条语句理论上应该是没有任何输出,但实际上却输出了如下结果:

为了方便说明此问题,我们来建立如下的表格及数据。

  1. mysql> select * from t1;
  2.  
  3. +----+-------+
  4.  
  5. | id | name |
  6.  
  7. +----+-------+
  8.  
  9. | 3 | chen |
  10.  
  11. | 1 | zhang |
  12.  
  13. +----+-------+
  14.  
  15. 2 rows in set (0.00 sec)
  16.  
  17. mysql> select * from t2;
  18.  
  19. +------+--------+
  20.  
  21. | id | course |
  22.  
  23. +------+--------+
  24.  
  25. | 2 | math |
  26.  
  27. +------+--------+
  28.  
  29. 1 row in set (0.00 sec)
  30.  
  31. 然后执行如下语句1
  32.  
  33. mysql> select t1.id,t1.name,t2.id,t2.course,sum(t1.id) from t1 join t2 on t1.id=t2.id where t1.id=1 ;
  34.  
  35. +----+-------+------+--------+------------+
  36.  
  37. | id | name | id | course | sum(t1.id) |
  38.  
  39. +----+-------+------+--------+------------+
  40.  
  41. | 1 | zhang | NULL | NULL | NULL |
  42.  
  43. +----+-------+------+--------+------------+
  44.  
  45. 1 row in set (0.00 sec)

发现竟然有输出,再执行如下的语句2:

  1. mysql> select t1.id,t1.name,t2.id,t2.course,sum(t1.id) from t1 join t2 on t1.id=t2.id where t1.id in(1,null) ;
  2.  
  3. +----+------+------+--------+------------+
  4.  
  5. | id | name | id | course | sum(t1.id) |
  6.  
  7. +----+------+------+--------+------------+
  8.  
  9. | NULL | NULL | NULL | NULL | NULL |
  10.  
  11. +----+------+------+--------+------------+
  12.  
  13. 1 row in set (0.00 sec)

发现全部为null。

执行如下语句3,返回Empty set。

  1. mysql> select t1.id,t1.name,t2.id,t2.course,sum(t1.id) from t1 join t2 on t1.id=t2.id where t1.id=1 group by t1.id;
  2.  
  3. Empty set (0.00 sec)

mysql中的语法并不是特别的严格,语句1与语句2其实在oracle中是会报语法检查不通过的。会报:ORA-00937: 不是单组分组函数

一般情况下用到聚合函数一般得加上group by会比较严格些,而出来这样的状况只有在有join的时候出来,单表查询还是没问题的,联合表查询聚合函数有使用的话推荐用语句3的写法。

mysql线上一些隐患查询sql的更多相关文章

  1. mysql 线上not in查询中的一个坑

    今天早上开发又过来说,怎么有个语句一直没有查询出结果,数据是有的呀,并发来了如下的sql(为了方法说明,表名及查询均做了修改): select * from t2 where t2.course no ...

  2. 【MySQL 线上 BUG 分析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous

    一.生产出错! 今天早上11点左右,我在工作休息之余,撸了一下猫.突然,工作群响了,老大在里面说:APP出错了! 妈啊,这太吓人了,因为只是说了出错,但是没说错误的信息.所以我赶紧到APP上看看. 这 ...

  3. MySql 学习之 一条查询sql的执行过程

    相信大家都接触过Mysql数据库,而且也肯定都会写sql.我不知道大家有没有这样的感受,反正我是有过这样的想法.就是当我把一条sql语句写完了,并且执行完得到想要的结果.这时我就在想为什么我写这样的一 ...

  4. MySQL - 常用命令及常用查询SQL

    常用查询SQL #查看临时目录 SHOW VARIABLES LIKE '%tmp%'; #查看当前版本 SELECT VERSION(); 常用命令 #查看当前版本,终端下未进入mysql mysq ...

  5. Docker + node(koa) + nginx + mysql 线上环境部署

    在上一篇 Docker + node(koa) + nginx + mysql 开发环境搭建,我们进行了本地开发环境搭建 现在我们就来开始线上环境部署 如果本地环境搭建没有什么问题,那么线上部署的配置 ...

  6. 【mysql】一条慢查询sql的的分析

    这个是我在jobbole.com 上看到的 先给出数据表table结构 mysql> show create table tt \G *************************** 1. ...

  7. mysql线上负载高怎么排查

    作为一个开发人员或者数据库管理员,学会检查数据库运行情况是必不可少的工作.造成MySQL线程卡顿的原因有很多,但是无论是哪种原因,我们发现问题之后的第一要务就是解决问题,防止问题继续恶化.那么,应该如 ...

  8. 一次 MySQL 线上死锁分析实战

    关键词:MySQL Index Merge 前言 MySQL 的锁机制相信大家在学习 MySQL 的时候都有简单的了解过,那既然有锁就必定绕不开死锁这个问题.其实 MySQL 在大部分场景下是不会存在 ...

  9. MySQL中优化常用的查询sql语

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

随机推荐

  1. CCNA实验1.port-security

    一, 二,MAC地址绑定 3550-1#conf t3550-1(config)#int f0/13550-1(config-if)#switchport mode access /指定端口模式.35 ...

  2. [转]揭秘webdriver实现原理

    转自:http://www.cnblogs.com/timsheng/archive/2012/06/12/2546957.html 通过研究selenium-webdriver的源码,笔者发现其实w ...

  3. BarManager.ContextMenu

    <!--Search & List Area--> <dxb:BarManager Name="barManager1" dxlc:DockLayoutC ...

  4. 在Android界面特效中如何做出和墨迹天气及UC中左右拖动的效果

    (国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/) 在Android界面特效中如何做出和墨迹天气及UC中左右拖动的效果 相信这么多手机APP中 ...

  5. selenium实战练习之:粉丝反馈表单的自动化脚本

    链接 粉丝反馈表 要求 服务质量5颗星 喜欢的内容选择各种公开课 对交流群的意见需要填写 留下自己正确的联系方式 点击提交 断言 不需要断言,能符合上面的要求成功提交就可以

  6. IPv6 app适配

    参考资料: https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/Network ...

  7. CYQ学习教程

    http://www.cyqdata.com/cyqdata/article-detail-413

  8. 卖萌的极致!脸部捕捉软件FaceRig让你化身萌宠

    FaceRig是一款以摄像头为跟踪设备捕捉用户脸部动作并转化为数据套用在其他动画模型上的一款软件,能够应用于一些日常的视频社交软件或网站,比如视频通话软件Skype和直播网站Twitch.FaceRi ...

  9. SymmetricDS 数据库双向同步开源软件入门

    一句话概括该软件:SymmetricDS是一个文件和数据库同步软件,开源的,支持多主复制,同步时过滤和在异构的网络环境中进行数据转换传输.它支持单向和双向上的多个订阅者,异步的数据复制. 以下是从CS ...

  10. SZ,RZ传送文件

    linux 和window之间通过xshell的命令 SZ,RZ传送文件: