首页 > 数据库 >SQL语句中 left join 后用 on 还是 where,区别大了!

SQL语句中 left join 后用 on 还是 where,区别大了!

时间:2023-02-25 23:45:08浏览次数:34  
标签:join tab2 SQL size where id left

前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。

后来发现 join on and 不会过滤结果记录条数,只会根据and后的条件是否显示 B表的记录,A表的记录一定会显示。

不管and 后面的是A.id=1还是B.id=1,都显示出A表中所有的记录,并关联显示B中对应A表中id为1的记录或者B表中id为1的记录。

运行sql :

select * from student s left join class c on s.classId=c.id order by s.id

 

运行sql :

 

select * from student s left join class c on s.classId=c.id and s.name="张三" order by s.id

 

 

运行sql :

 

select * from student s left join class c on s.classId=c.id and c.name="三年级三班" order by s.id

 

 

 

 

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。在使用left jion时,on和where条件的区别如下:

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

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

假设有两张表:表1:tab2

 

 

表2:tab2

 

 

两条SQL:1、

 

select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’

2、

select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)

 

第一条SQL的过程:

 

1、中间表on条件:

 

tab1.size = tab2.size

 

2、再对中间表过滤where 条件:

 

tab2.name=’AAA’

 

第二条SQL的过程:1、中间表on条件:

 

tab1.size = tab2.size and tab2.name=’AAA’

 

(条件不为真也会返回左表中的记录)

 

 

其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

标签:join,tab2,SQL,size,where,id,left
From: https://www.cnblogs.com/dotnet-college/p/17155727.html

相关文章

  • 为什么在连接mysql时,设置 SetConnMaxIdleTime 没有作用
    目录测试1go1.15.15go1.17.12测试2go1.15.15go1.17.12参考在使用golang连接mysql时,为了节省连接资源,在连接使用过后,希望在指定长度时间不再使用后,自动关闭连接。这......
  • mysql描述关键字
    SHOWCOLUMNS要求给出一个表名(这个例子中的FROMtab_1),它对每个字段返回一行,行中包含字段名、数据类型、是否允许NULL、键信息、默认值以及其他信息。   另外可以......
  • 908~909Maven工程环境修改,Maven的Java工程取mysql数据库数据
    Maven工程环境修改<plugins><plugin><!--https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin-->......
  • MySQL学习笔记-数据控制语言
    SQL-数据控制语言(DCL)DCL语句用于管理数据库用户,控制数据库的访问权限一.管理用户1.查询用户#访问mysql数据库usemysql;#查询user表select*fromuser;主......
  • PyMySQL删除
    title:PyMySQL删除author:杨晓东permalink:PyMySQL删除date:2021-10-0211:27:04categories:-投篮tags:-demoPyMySQLMySQL数据库_删除"""1、删除操作......
  • MYSQL的索引、并发控制、各种事务介绍以及日志管理
    今天分享的是mysql数据库中的索引、并发控制、各种事务介绍以及日志管理,在学习过程中对这些内容的理解INDEX索引索引介绍索引:是排序的快速查找的特殊数据结构,定义作为查找......
  • 关于Sqlite关闭后还是提示被占用的问题
     sqliteConnection.Close();sqliteConnection.Dispose();关闭和释放还是提示文件被占用。请使用以下方法:System.Data.SQLite.SQLiteConnection.ClearAll......
  • sql多版本(High Version Count)引起的应用程序执行插入语句时hang
    近期遇到一套windowsX64+Oracle11.2.0.1版本数据库,遇到一条使用了6个绑定变量值的插入sql出现了5000多个sqlversion,正常情况下此sql在早上8-9点要执行300-500次左右,当应用......
  • 三天吃透MySQL八股文(2023最新整理)
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校......
  • SQLmap的使用
    sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQLServer、IBMDB2、SQLite......