教程集 www.jiaochengji.com
教程集 >  数据库  >  mysql  >  正文 mysql中left join、right join、inner join的区别

mysql中left join、right join、inner join的区别

发布时间:2023-04-30   编辑:jiaochengji.com
教程集为您提供mysql中left join、right join、inner join的区别等资源,欢迎您收藏本站,我们将为您提供最新的mysql中left join、right join、inner join的区别资源
mysql中left join、right join、inner join的区别是什么呢,估计很多朋友都不清楚,这个问题包括我在内也不清楚具体的细节区别是什么了,下面一聚教程小编给各位整理了一篇文章很清除的介绍了mysql中left join、right join、inner join的区别哦,希望例子对各位会带来帮助哦。

 今天和某朋友聊天,谈到他们公司的一个小问题。如下: 

表A设备表,存储MAC地址,省份,城市,区。
表B软件表,存储MAC地址,软件名字。
功能是可以按省份,城市,或者区来查询软件列表。

你猜它现在如何做的?
它通过省份,城市,或者区取得MAC地址,然后查询B表用in查询。

    这个很明显是不合理的,处理这种多对多的关系,为什么不用多表联查呢?

链表的方法常用的有3个: (inner) join 内部等值连接、left join 左连接 和 right join右连接。

    有什么区别呢?怎么用呢? 下面是copy的一篇文章:

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

举例如下:
--------------------------------------------
表A记录如下:
aID     aNum
1     a20050111
2     a20050112
3     a20050113
4     a20050114
5     a20050115

表B记录如下:
bID     bName
1     2006032401
2     2006032402
3     2006032403
4     2006032404
8     2006032408

--------------------------------------------
1.left join
sql语句如下:
select * from A
left join B
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
5     a20050115    NULL     NULL

(所影响的行数为 5 行)
结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.
--------------------------------------------
2.right join
sql语句如下:
select * from A
right join B
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
NULL     NULL     8     2006032408

(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
--------------------------------------------
3.inner join
sql语句如下:
select * from A
innerjoin B
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404

结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
--------------------------------------------
注:
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。

语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2

说明:table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr参数指定关系比较运算符:"=", "<", ">", "<=>=" 或 "<>"。
如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误.
    所以,依我的理解,sql应该这么写:

    select 软件 from 软件表 inner join 设备表 on 软件表.mac=设备表.mac where 设备表.pro = 'xxx' and 设备表.city = 'xxx'; 

您可能感兴趣的文章:
mysql中left join、right join、inner join的区别
有关sql语句的left join、right join、inner join的区别
CI框架join多表联合查询的例子
mysql left join,right join,inner join的区别
mysql中left join多表联查询语句
mysql left join,right join,inner join用法与区别
Mysql 多表联合查询效率分析及优化
mysql join实例 mysql事件调度器
Mysql多表关联left join、right join、inner join不同点总结教程
mysql多表随机查询优化方案

[关闭]
~ ~