今天分享一个工作经验,有2张表,考勤组表 和 考勤组-用户表,我想要查询所有考勤组的人员信息。

考勤组表现有数据,字段如下

考勤组-用户表现有数据,字段如下:

自然的,我用LEFT JOIN来关联两张表

-- 查询考勤组用户
SELECT *
FROM attendence_group_attgroup att_group
LEFT JOIN attendence_group_attgroupuser user_group ON  att_group.id = user_group.att_group_id

结果如下:(注意我画红圈圈的部分)

看起来似乎是这个效果,那么如果我想过滤那些已经删除的用户呢?

SELECT *
FROM attendence_group_attgroup att_group
LEFT JOIN attendence_group_attgroupuser user_group ON  att_group.id = user_group.att_group_id
WHERE user_group.is_deleted = 0

结果如下:

但是我不想要这个效果。我想要的效果是:如果考勤组一个未删除的用户都没有,应该显示考勤组的信息,而人员信息显示Null,如下:

原因是直接LEFT_JOIN考勤组信息和人员信息关联到了一行中,过滤人员的同时把考勤组也过滤掉了,因为是整行数据过滤:注意上图中我画红圈圈的部分!!所以考勤组信息自然也木有了。

修复SQL:

SELECT att_group.*, user_group.*
FROM attendence_group_attgroup att_group
LEFT JOIN (SELECT *FROM attendence_group_attgroupuser uWHERE u.is_deleted = 0) user_group ON att_group.id = user_group.att_group_id

应该先把不满足条件的人员从人员表中去除,再和考勤组关联,过滤条件提前到了人员表中,避免同时过滤掉考勤组信息。

我这么查询的最终目的是需要查询考勤组的信息,并统计每个考勤组对应的的人员个数,直接LEFT JOIN查询把考勤组也过滤掉了,导致我统计出BUG。最后是我的统计SQL:

-- 查询考勤组信息,并统计用户个数
SELECT att_group.*, count(user_group.user_id) user_nums
FROM attendence_group_attgroup att_group
LEFT JOIN (SELECT *FROM attendence_group_attgroupuser uWHERE u.is_deleted = 0          ) user_group ON att_group.id = user_group.att_group_id
GROUP BY att_group.id

另外,经过大佬指点,JOIN语句可以是组合条件,SQL可以优化成一次左查询:

-- 查询考勤组信息,并统计用户个数
SELECT att_group.id, count(group_user.user_id) user_nums
FROM attendence_group_attgroup att_group
LEFT JOIN attendence_group_attgroupuser group_user ON (att_group.id = group_user.att_group_idANDgroup_user.is_deleted = 0)
GROUP BY att_group.id

最后总结:

A表直接LEFT JOIN B表 再过滤 和 A表LEFT JOIN (B表的子查询结果)的区别是:

如果你的过滤条件只想作用于B表,那么LEFT JOIN B表的子查询结果;

如果你的过滤条件需要作用于整行关联结果,那么直接LEFT JOIN即可。

LEFT JOIN直接关联表和LEFT JOIN关联子查询的区别相关推荐

  1. 单行子查询 多行子查询 关联子查询 笔记

    1.连接基本语法 select columns_list from table_1 innner join table_2 on join_condition; eg:select e.empno,e ...

  2. server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...

    4.1.查询的类型 declare @value as int set @value = 50 select  'age:'as age,2008 years,@valueas va --这种查询时跟 ...

  3. SQL中的关联子查询

    目录 关联查询 例子 分解相关的嵌套查询 与不同的表一起使用 关联子查询与内部联接 哪个更快? 哪个更容易阅读? 哪一个更好? HAVING子句中的关联子查询 在本文中,我们将查看几个示例并将关联子查 ...

  4. SQL进阶之关联子查询练习

    SQL进阶之关联子查询 一.关联子查询简介 二.关联子查询实操 1.CreateTable 2.Sample 一.关联子查询简介 通过关联表内部条件从而达到查询效果 二.关联子查询实操 注:版本使用: ...

  5. Oracle 的关联子查询(correlated subquery) 简介.

    相信 接触过 ocp考题既, 都会见到 correlated subquery的字眼. correlated subquery的中文名称就是相关子查询呢? 1. 什么是子查询 这个很简单,  子查询就 ...

  6. order by 子查询_视图,子查询,标量子查询,关联子查询

    视图 子查询 标量子查询 关联子查询 如何用SQL解决业务问题 各种函数 1. 视图 视图内存放SQL查询语句,运行时运行该语句.查出的数据为临时数据 创建视图 create view as 视图名称 ...

  7. Oracle 数据库的子查询(关联子查询)

    文章目录 一.子查询结果返回一个值(单列单行) 二.子查询结果返回多行(单列多行) 三.子查询结果返回多列多行 四.关联子查询 (一)子查询执行顺序 (二)exists 关键字 五.子查询总结 六.关 ...

  8. exist-in和关联子查询-非关联子查询

    对于exist和in,大家的一致看法如下:     1.in是子查询为驱动表,外面的表为被驱动表,故适用于子查询结果集小而 外面的表结果集大的情况.     2.exists是外面的表位驱动表,子查询 ...

  9. SQL子查询和关联子查询

    子查询:将用来定义视图的SELECT语句直接用于FROM子句中. SELECT <列名1>, <列名2>, - FROM (<SELECT语句>) AS <视 ...

最新文章

  1. ionic4 select 去掉确定取消按钮_word文档中的水印如何去掉,有三种方法,你最喜欢哪种?...
  2. Trie树详解及其应用
  3. 使用cacti对mysql监控的图像解释_Linux下的监控软件cacti的安装与配置
  4. 习惯 积累 沉淀
  5. Liferay Portal额外研究-银狐999
  6. [Java基础] Java中List.remove报错UnsupportedOperationException
  7. 3 vue 线条箭头_线条眉要如何处理才能更自然?
  8. Windows平台下go编译器LiteIDE的安装和使用
  9. 三星 android 截屏,三星S7怎么截屏 3种三星S7截图方法
  10. 走在WCF学习的路上---印在脑子里的点点滴滴(两种元数据交换方式的优缺点)...
  11. python一对一视频教学-使用Python的Tornado框架实现一个一对一聊天的程序
  12. vue 背景透明度_Visual Studio 2017 设置透明背景图
  13. eclipse反编译后的文件去除注释 /** 123 **/
  14. 银行窗口排队叫号系统实现
  15. 桌上远远演唱特别行政区
  16. CVE-2018-18311 阿里云漏洞修复 RHSA-2019:0109-Important: perl secur
  17. CSS3颜色不透明度如何设置?
  18. 点击reset按钮失效,不能清空输入框。
  19. SQL Server 索引碎片和填充因子
  20. TJ Wi-Fi不能使用的解决的办法

热门文章

  1. 二三维一体化平台-FreeXGIS Studio
  2. 【解决】操作无法完成,因为程序已在另一处打开。
  3. 仿918回忆模特写真网整站数据库源码 zblog内核,
  4. wx-wx-wx-wx-wx-wx-wx-wx-wx-wx-wx
  5. 数字IC设计笔试题汇总(一)
  6. HTML5新标签语义及用法
  7. STC12C5A60S2单片机WIFI信号扫描报警监视系统信号增强信号过低报警
  8. FL Studio 21测试版更新、新功能和AI智能编曲插件
  9. OpenMaple C++ interface
  10. tensorflow微调vgg16 程序代码汇总