mySQL内连接和外链接(SQL的四种连接)以及Join ON 和Where区别

您所在的位置:网站首页 四连接和八连接的区别 mySQL内连接和外链接(SQL的四种连接)以及Join ON 和Where区别

mySQL内连接和外链接(SQL的四种连接)以及Join ON 和Where区别

2024-07-17 16:32| 来源: 网络整理| 查看: 265

说道四种连接,就不得不提关于他们在指令操作上的区别

这四种连接都是为了把两个表合成一个表,这两个表呢,其中至少应该有一列的数据属性是相同的,在下面的两个表中,列属性包含id,size,name。那么这两个表共有属性的列是size,那么久针对这一列的属性把两个表合并的操作就是连接

表1:tab1

idsize110220330

表2:tab2

sizename10AAA20BBB20CCC 内连接:关键字:inner join select * from employees e inner join department d on e.employee_id = d.department_id where e.employee_id = "1"; 等价于 select * from employees e,department d where e.employee_id = d.department_id and e.employee_id = "1";

 这两句第一个关键字为inner join on也就是内连接

第二句关键字为where

这两者在实际上是没有区别的,但若是没有了inner,区别就打了。这个问题之后再说,现在先说这四种连接

举例如下:

                  图2:B表数据 图1:A表数据          

为了把Bid和Aid加以区分,不让大家有误解,所以把Bid的起始种子设置为100。有SQL基本知识的人都知道,两个表要做连接,就必须有个连接字段,从上表中的数据可以看出,在A表中的Aid和B表中的Bnameid就是两个连接字段。下图3说明了连接的所有记录集之间的关系:

             

图3:连接关系图 现在我们对内连接和外连接一一讲解。 1.内连接:利用内连接可获取两表的公共部分的记录,即图3的记录集C 语句如下:Select * from A JOIN B ON A.Aid=B.Bnameid 运行结果如下图4所示:其实select * from A,B where A.Aid=B.Bnameid与Select * from A JOIN B ON A.Aid=B.Bnameid的运行结果是一样的。 

 

  图4:内连接数据

 

 2.外连接:外连接分为两种,一种是左连接(Left JOIN)和右连接(Right JOIN)   

 (1)左连接(Left JOIN):即图3公共部分记录集C+表A记录集A1。  语句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid  运行结果如下图5所示:

图5:左连接数据     

说明:在语句中,A在B的左边,并且是Left Join,所以其运算方式为:A左连接B的记录=图3公共部分记录集C+表A记录集A1 在图3中即记录集C中的存在的Aid为:2 3 6 7 8  图1中即表A所有记录集A中存在的Aid为:1 2 3 4 5 6 7 8 9   表A记录集A1中存在的Aid=(图1中即A表中所有Aid)-(图3中即记录集C中存在的Aid),最终得出为:1 4 5 9   由此得出图5中A左连接B的记录=图3公共部分记录集C+表A记录集A1, 最终得出的结果图5中可以看出Bnameid及Bid非NULL的记录都为图3公共部分记录集C中的记录;Bnameid及Bid为NULL的Aid为1 4 5 9的四笔记录就是表A记录集A1中存在的Aid。   (2)右连接(Right JOIN):即图3公共部分记录集C+表B记录集B1。

语句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid   运行结果如下图6所示:  

 

图6:右连接数据  说明: 在语句中,A在B的左边,并且是Right Join,所以其运算方式为:A右连接B的记录=图3公共部分记录集C+表B记录集B1  在图3中即记录集C中的存在的Aid为:2 3 6 7 8   图2中即表B所有记录集B中存在的Bnameid为:2 3 6 7 8 11   表B记录集B1中存在的Bnameid=(图2中即B表中所有Bnameid)-(图3中即记录集C中存在的Aid),最终得出为:11   由此得出图6中A右连接B的记录=图3公共部分记录集C+表B记录集B1, 最终得出的结果图6中可以看出Aid及Aname非NULL的记录都为图3公共部分记录集C中的记录;Aid及Aname为NULL的Aid为11的记录就是表B记录集B1中存在的Bnameid。     交叉连接:两张表联合没有条件情况下,条数 = 图1 * 图2

那么现在来说说join on和where区别

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

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

假设有两张表:

表1:tab2

idsize110220330

表2:tab2

sizename10AAA20BBB20CCC

两条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 tab1.idtab1.sizetab2.sizetab2.name11010AAA22020BBB22020CCC330(null)(null)

 

  2、再对中间表过滤 where 条件: tab2.name=’AAA’ tab1.idtab1.sizetab2.sizetab2.name11010AAA

 

  

 

第二条SQL的过程:

 

1、中间表 on条件: tab1.size = tab2.size and tab2.name=’AAA’ (条件不为真也会返回左表中的记录) tab1.idtab1.sizetab2.sizetab2.name11010AAA220(null)(null)330(null)(null)

 

 

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

 



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3