左连接、右连接、内连接、外连接

一.外连接

外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。

  • 1.左外连接 = 左连接

left join 是left outer join的简写,left join默认是outer属性的。

左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

SELECT t.*,i.merch_name merchName,i.supplier supplier FROM mal_merch_tx t LEFT JOIN mal_merch_inv i ON t.inv_id = i.inv_qty

我的sql,on后的查询条件(t.inv_id = i.inv_qty)是不相等的,则查询后的数据是mal_merch_tx 表的所有的数据,以及merchName、supplier 的数据,但是merchName、supplier 列数据均为null;

以左表为基准,查询出左表所有的数据和右表中连接字段相等的记录,如果右表中没有对应数据,则在左表记录后显示为空(NULL).如果把两个表分别看成一个集合的话,则显示的结果为JOIN左边的集合。

这种场景下得到的是A的所有数据,和满足某一条件的B的数据;

  • 2.右外连接 = 右连接

类左连接;

  • 3.完整外部联接

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。  

full join (mysql不支持,但是可以用 left join  union right join代替)

select a.id aid,a.age,b.id bid,b.name from tablea a  left join tableb b  on a.id = b.id  

union  

select a.id aid,a.age,b.id bid,b.name from tablea a  right join tableb b  on a.id = b.id  

这种场景下得到的是满足某一条件的公共记录,和独有的记录

二.内连接

内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

显式:SELECT * FROM mal_merch_tx t INNER JOIN mal_merch_inv i ON i.id = t.inv_id

隐式:SELECT * FROM mal_merch_tx t,mal_merch_inv i WHERE i.id = t.inv_id

查询出两个表对应的数据,如果把两个表分别看成一个集合的话,内连接的结果即为两个表的交集。

得到的是满足某一条件的A,B内部的数据;

正因为得到的是内部共有数据,所以连接方式称为内连接。

三.交叉连接

实际应用中还有这样一种情形,想得到A,B记录的排列组合,即笛卡儿积,这个就不好用集合和元素来表示了。需要用到cross join。

交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。

select a.id aid,a.age,b.id bid,b.name from tablea a  cross join tableb b  where a.id = b.id  

注:这种情况下实际上实现了内连接的效果

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值