SQL 中 Left Join 转为 Inner Join 的实际应用-阿里云开发者社区

开发者社区> Java技术进阶> 正文

SQL 中 Left Join 转为 Inner Join 的实际应用

简介: 之前我写过一篇文章叫做,《SQL 中 关于Left Join 转为 Inner Join 的问题》。文章中给出的一个结论是:左关联的查询语句中,只要有 where 的过滤条件,那么该语句将被转为内关联。

之前我写过一篇文章叫做,《SQL 中 关于Left Join 转为 Inner Join 的问题》。文章中给出的一个结论是:左关联的查询语句中,只要有 where 的过滤条件,那么该语句将被转为内关联

继续上一篇的内容,在这篇文章中我来说说在日常开发中的一个实际应用。说来简单,但是不知道的人也经常颇受困扰。

应用:对 Left Join 之后的数据进行过滤,即对左关联之后的数据进行过滤

还是用前一篇文章的例子来说明,建表语句和造数语句均可在前一篇找到,在此不做累赘。

需求说明:

进入界面的时候,需要根据需求查询出所有数据。同时在查询的数据之上有可输入的过滤条件,可以对查询出来的结果进行筛选过滤。即,在进入界面时需要查询出 classstudentsex = 1 的数据,同时界面上有个可输入的过滤条件 classID 。大体结构如下图:

_

进入界面时的查询语句如下:

SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
    AND B.SEX = 1
 ORDER BY A.CLASS_ID;

查询结果如下:

_1

此时的问题是:如何把 classID 过滤条件加入到这个查询语句中?

经常有人是这么加 classID 的条件的:

SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
   AND B.SEX = 1
   AND A.CLASS_ID = 1
 ORDER BY A.CLASS_ID;

得到的查询结果如下图:

_2

数据中仍然带着 student 为空的 class 。原因是,这样的写法,SQL 语句仍然是左关联,空数据无法被过滤。

分析一下需求,添加过滤条件之后,查询结果应该已不是左关联,而是内关联。

此时我们有两种做法

第一种,直接将左关联改为内关联,即将 Left Join 改为 Inner Join
SELECT *
  FROM T_CLASS A
  INNER JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
   AND B.SEX = 1
   AND A.CLASS_ID = 1
 ORDER BY A.CLASS_ID;

查询结果如下:

_3

但是,很多情况下我们不会因为功能中需要有过滤条件而重新写一个查询语句。更多的情况,还是在原有的查询语句中增加过滤条件。此时需要第二种做法。

第二种,用 where 进行过滤,查询语句如下:
SELECT *
  FROM T_CLASS A
 INNER JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
   AND B.SEX = 1
 WHERE A.CLASS_ID = 1
 ORDER BY A.CLASS_ID;

查询结果如下:

_3

就像我在之前文章说的,左关联的查询语句中,只要有 where 的过滤条件,那么该语句将被转为内关联。此时这个用法派上用场了。

版权声明:本文中所有内容均属于阿里云开发者社区所有,任何媒体、网站或个人未经阿里云开发者社区协议授权不得转载、链接、转贴或以其他方式复制发布/发表。申请授权请邮件developerteam@list.alibaba-inc.com,已获得阿里云开发者社区协议授权的媒体、网站,在转载使用时必须注明"稿件来源:阿里云开发者社区,原文作者姓名",违者本社区将依法追究责任。 如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
Java技术进阶
使用钉钉扫一扫加入圈子
+ 订阅

Java技术进阶成长,课程资料,案例解析,实战经验全都有!

官网链接