SQL中关于Left Join转为Inner Join的问题,即左关联转为内关联的问题

先说结论

所谓实践出真知,个人也是因为对 Left Join 转为 Inner Join 的问题有疑问,于是逐一尝试,最后得出结论。
从下面的实验结果很容易看出,在有左关联的查询语句中,只要有 WHERE 的过滤条件,那么该语句将被强制转为内关联。

一、创建表

演示使用,随便创建两张表

--班级表
CREATE TABLE T_CLASS(
  class_id NUMBER not null,
  class_name VARCHAR2(100)
)
--学生表
CREATE TABLE T_STUDENT(
  student_id NUMBER not null,
  class_id NUMBER not null,
  student_name VARCHAR2(100),
  age NUMBER,
  sex CHAR(1) 
)
二、创建数据
--班级数据
insert into T_CLASS (CLASS_ID, CLASS_NAME)
values (1, '一班');

insert into T_CLASS (CLASS_ID, CLASS_NAME)
values (2, '二班');

insert into T_CLASS (CLASS_ID, CLASS_NAME)
values (3, '三班');

insert into T_CLASS (CLASS_ID, CLASS_NAME)
values (4, '四班');

insert into T_CLASS (CLASS_ID, CLASS_NAME)
values (5, '五班');

--学生数据
insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (1, 1, '李1', 3, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (2, 1, '李2', 2, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (3, 1, '李3', 3, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (4, 2, '李4', 4, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (5, 2, '李5', 3, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (6, 2, '李6', 3, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (7, 3, '李7', 6, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (8, 3, '李8', 4, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (9, 2, '李9', 2, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (10, 2, '李10', 3, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (11, 3, '李11', 3, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (12, 2, '李12', 8, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (13, 1, '李13', 6, '2');
三、左关联出现的几种情形

1.无过滤条件

查询语句:

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

查询结果:
在这里插入图片描述

2.A表过滤条件在AND中

查询语句:

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

查询结果:
在这里插入图片描述

3.A表过滤条件在WHERE中

查询语句:

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

查询结果:
##图片

4.B表过滤条件在AND中

查询语句:

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

查询结果:
在这里插入图片描述

5.B表过滤条件在WHERE中

查询语句:

SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
 WHERE B.AGE = 3
 ORDER BY A.CLASS_ID;

查询结果:
在这里插入图片描述

6.A表过滤条件在AND中,B表过滤条件在WHERE中

查询语句:

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

查询结果:
在这里插入图片描述

7.A表过滤条件在WHERE中,B表过滤条件在AND中

查询语句:

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

查询结果:
在这里插入图片描述

8.A表和B表过滤条件都在AND中

查询语句:

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

查询结果:
##图片

9.A表和B表过滤条件都在WHERE中

查询语句:

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

查询结果:
##图片
以下附上所有查询语句:

--1.无过滤条件
SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
 ORDER BY A.CLASS_ID;
--2.A表过滤条件在AND中
SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
   AND A.CLASS_ID = 1
 ORDER BY A.CLASS_ID;
--3.A表过滤条件在WHERE中
SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
 WHERE A.CLASS_ID = 1
 ORDER BY A.CLASS_ID;
--4.B表过滤条件在AND中
SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
   AND B.AGE = 3
 ORDER BY A.CLASS_ID;
--5.B表过滤条件在WHERE中
SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
 WHERE B.AGE = 3
 ORDER BY A.CLASS_ID;
--6.A表过滤条件在AND中,B表过滤条件在WHERE中
SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
   AND A.CLASS_ID = 1
 WHERE B.AGE = 3
 ORDER BY A.CLASS_ID;
--7.A表过滤条件在WHERE中,B表过滤条件在AND中
SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
   AND B.AGE = 3
 WHERE A.CLASS_ID = 1
 ORDER BY A.CLASS_ID;
--8.A表和B表过滤条件都在AND中
SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
   AND B.AGE = 3
   AND A.CLASS_ID = 1
 ORDER BY A.CLASS_ID;
--9.A表和B表过滤条件都在WHERE中
SELECT *
  FROM T_CLASS A
  LEFT JOIN T_STUDENT B
    ON A.CLASS_ID = B.CLASS_ID
 WHERE B.AGE = 3
   AND A.CLASS_ID = 1
 ORDER BY A.CLASS_ID;
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值