首页 > 其他分享 >left join on后面 加条件 与 where后面加条件的区别

left join on后面 加条件 与 where后面加条件的区别

时间:2023-11-21 14:24:46浏览次数:29  
标签:test1 join 后面 user where id left

本文主要讲解left join on 和where 的区别,以及用法
首先
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用left join时,on和where条件的区别如下:

1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

 

1.用left join 进行条件过滤时,on条件只会对右表进行条件过滤,不会对左表数据产生任何影响;
2.用left join 进行条件过滤时,where条件会对结果表进行条件过滤,所以会对左表数据产生影响;
3.用inner join 用on和where没有任何区别

使用:

单独使用left join时:

 

select

o.id id,
o.user_id ,
o.out_trade_no,
o.create_time,
o.state,
o.total_fee,
o.video_id,
o.video_title,
o.video_img,
u.name,
u.head_img,
u.create_time,
u.phone
from video_order o left join user u on o.user_id = u.id

  


这里video_order o是让o代替video_order 这个表,方便命名书写,它的作用首先是输出左表的全部数据,然后筛选右表,将符合的一一对应,与左表关联输出。注意这里是左表的全部数据均输出

再看另外一个left join on的例子

 

select

o.id id,
o.user_id ,
o.out_trade_no,
o.create_time,
o.state,
o.total_fee,
o.video_id,
o.video_title,
o.video_img,
u.name,
u.head_img,
u.create_time,
u.phone
from video_order o left join user u on o.user_id = u.id and u.id=6

 

通过图示我们发现,这里也是显示左表的所有数据,不同在于,要筛选右表,右表不符合的显示为NULL;

join on与where同时使用
下面是我们更希望出现的样子,就是我们关联查询后,能过滤到左表我们不想要的东西

select

o.id id,
o.user_id ,
o.out_trade_no,
o.create_time,
o.state,
o.total_fee,
o.video_id,
o.video_title,
o.video_img,
u.name,
u.head_img,
u.create_time,
u.phone
from video_order o left join user u on o.user_id = u.id where u.id=6

 

其实除了这个办法,我们还可以对左表用子查询进行筛选,具体代码如下

select o.order_id,o.user_id,u.user_id,u.user_name
from ( select * from tb_order where order_id > 10 ) o LEFT JOIN tb_user u on o.user_id = u.user_id;

 

 

 

LEFT JOIN条件在on后面和在where后面的区别
一、left join 的实际运用
二、两表联查SQL区别
1、在on后面补全条件
2、在where后面补全条件
三、三表联查SQL区别
1.错误示范:
1.1 连续使用left join,on后面过滤条件
1.2 连续使用left join,where后面过滤条件
2.正确操作:
2.1将test2和test3作为整个右表查询
四、结论
一、left join 的实际运用
left join 一般用于显示左边所有数据,并携带右表的数据;
而在on后面进行条件过滤,只会过滤掉右表条件不为真的数据,左表数据一定会显示;
在where后面进行条件过滤,是对左表右表的结果表进行过滤,所以数据不一定能完全显示。

二、两表联查SQL区别
存在数据表test1, test4
test1:

test4:


1、在on后面补全条件
select * from test1 left join test4 on test1.id = test4.id and test4.is_effective = 1
1

可以发现test1中的数据全部被读取,test4中过滤了is_effective != 1的数据

2、在where后面补全条件
select * from test1 left join test4 on test1.id = test4.id where test4.is_effective = 1
1

可以发现只显示了test1中的id为1的数据内容。

三、三表联查SQL区别
存在test1,test2,test3三张表,其中test3是test1和test2的中间表
test1:

test2:

test3:


某些业务中,我们会使用中间表查询数据,如果存在业务,要显示test1中的全部数据,并携带test2中的有效数据,我们一般会采用left join 去完成sql,而这时需要注意应该将test2和test3的结果表作为整个右表,才能正常完成业务。

1.错误示范:
1.1 连续使用left join,on后面过滤条件

SELECT
*
FROM
test1
LEFT JOIN test3 ON test1.id = test3.id1
LEFT JOIN test2 ON test2.id = test3.id2 and is_effective = 1

 



会查出test1中的重复数据

1.2 连续使用left join,where后面过滤条件

SELECT
*
FROM
test1
LEFT JOIN test3 ON test1.id = test3.id1
LEFT JOIN test2 ON test2.id = test3.id2
WHERE
is_effective = 1

 



无法完全显示test1中的数据

2.正确操作:
2.1将test2和test3作为整个右表查询

SELECT
*
FROM
test1
LEFT JOIN ( SELECT * FROM test2 INNER JOIN test3 ON test2.id = test3.id2 WHERE is_effective = 1 ) b ON test1.id = b.id1
 

 

正常完成查询
 

参考:left join on后面 加条件 与 where后面加条件的区别

参考:LEFT JOIN条件在on后面和在where后面的区别



标签:test1,join,后面,user,where,id,left
From: https://www.cnblogs.com/aspirant/p/17846478.html

相关文章

  • php提前返回数据,后面代码继续执行封装函数
    /*中断并返回数据,后面程序继续执行,避免用户等待(immediate)*可用于返回值后,继续执行程序,但程序占得所以自由没有释放,一致占用,务必注意,最好给单独脚本执行*@paramstring|array$data字符串或数组,数组将被转换成json字符串*@paramintval$set_ti......
  • 谓语动词的形式取决于 “or” 后面的主语
    在英语中,当我们使用“or”连接两个或多个主语时,谓语动词的形式取决于“or”后面的主语。如果“or”后面的主语是单数,那么谓语动词也应该用单数形式。例如,在“ExcelorWPSisnotrunning”这个句子中,“WPS”是“or”后面的主语,它是单数,所以我们使用了单数形式的“is”......
  • for循环内部有return 如果先遇到return 是否就不再执行后面的程序了
    是的,一旦在for循环内部遇到return语句,函数将立即返回,并且后续的循环迭代以及循环内的其他代码将不再执行。return语句的作用是立即终止函数的执行并将结果返回给调用者。例如,考虑以下示例:defexample_function():foriinrange(5):print(i)ifi==2:......
  • SQL 查询优化指南:SELECT、SELECT DISTINCT、WHERE 和 ORDER BY 详解
    SELECT关键字SQL的SELECT语句用于从数据库中选择数据。SELECT语句的基本语法如下:SELECTcolumn1,column2,...FROMtable_name;其中,column1,column2,等是您要从表中选择的字段名称,而table_name是您要选择数据的表的名称。如果要选择表中的所有列,您可以使用SELECT*语法。......
  • 多线程threading模块(二)daemon和join的区别
    PythonVersion:3.10.12案列一:最简洁的情况,在多线程代码中不开启daemon或join功能。importthreadingimporttimeloop_count=5defcount_num(num):print('子线程<{}>开始运行'.format(num))forxinrange(10):time.sleep(x)print('子线程<{}>结束......
  • 在js中,定义了两个同名函数后, 后面的函数会覆盖前面定义的函数。
    运行以下程序<script>varm=1,j=k=0;functionadd(n){returnn=n+1;}y=add(m);functionadd(n){returnn=n+3;}z=add(m);</script>A2,4B4,4C2,2D报异常正确答案:Bjs里面没有函数重载的......
  • void 作为运算符后面接的是表达式,void expression。而void(0)也是被当做void 0。如果
    void();上面表达式的结果是:AundefinedBTypeErrorCnullDSyntaxError正确答案:Dtypeof1;//'number'typeof(1);//'number'typeof();//SyntaxError语法错误void0;//undefinedvoid(0);//undefinedvoid();//SyntaxError语法错误也就是说错的不是void,而是......
  • 正则表达式中的小括号"()"。是代表分组的意思。 如果再其后面出现\1则是代表与第一个
    以下代码的执行后,str的值是:varstr="Helllloworld";str=str.replace(/(l)\1/g,'$1');AHeloworldBHelloworldCHellloworldDHelllloworld正确答案:B对于正则表达式/(l)\1/g,其中(l)是第一个分组,\1指向第一个分组,即\1重复了第一个分组的内容,所以该正则表达式......
  • var a = parseInt([0,0,1,0,0].join('')+1) a的值为
    vara=parseInt([0,0,1,0,0].join('')+1)a的值为A2B101C1001DNaN正确答案:C官方解析:"00100"+1="001001"再转换为整数为1001vara=parseInt([0,0,1,0,0].join('')+1)//join()方法将数组转为字符串,并用指定的分隔符进行分割[0,0,1,0,0].join(""......
  • Left Join,Right Join,Inner Join与where连接的区别
    概述连表是SQL常用的操作,但是连表不一样,得到的结果也不一样(在数据量大的时候尤为明显),这里就是对关联表中一些筛选用的关键字的具体区别做了一个详细的梳理。首先准备两张表,分别是tb_student和tb_class表 tb_class表:tb_student表:一、内连接1、隐式内连接:把连接条件放......