[498]left join、inner join、right join、full outer join的区别

sql的left join 、right join 、inner join之间的区别

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

t_user表
image.png
t_class表
image.png
sql语句:(左联结)

select u.UserID,u.UserName,c.id,c.name
from t_user u left join t_class c   on  c.id  = u.UserID

运行结果:
image.png
sql语句:(右联结)

select u.UserID,u.UserName,c.id,c.name
from t_user u RIGHT join t_class c
                    on  c.id  = u.UserID

运行结构:
image.png
sql语句(自然联结):

select u.UserID,u.UserName,c.id,c.name
from t_user u inner join t_class c
                    on  c.id  = u.UserID

运行结果:
image.png

根据构建的虚拟表,更新相同的字段值

update dmdc.bond_issuser_rela_detail c inner join (SELECT DISTINCT a.com_uni_code,a.com_chi_name,b.com_uni_code as code2,b.com_chi_name as name2
    FROM dmdc.bond_issuser_rela_detail a
    LEFT JOIN dmdc.t_com_info b 
    ON a.com_chi_name=b.com_chi_name
    WHERE a.com_uni_code is NULL and b.com_uni_code is not NULL ORDER BY b.com_uni_code) d on d.com_chi_name=c.com_chi_name
set c.com_uni_code = d.code2

说明:select查询造的虚拟表当做查询源的时候, 这个select语句是完全独立的, 不和他以外的SQL相通

 update  表1  a1  inner join  (select 字段1,字段2 from 表1 where 条件) a2 on 条件
        set   a1.字段1 = a2.字段2 

先造出来一个虚拟表,然后通过更新虚拟表的方式去实现具体的更新;

FULL OUTER JOIN

SQL FULL OUTER JOIN 关键字

FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.

FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。

SQL FULL OUTER JOIN 语法
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

SQL FULL OUTER JOIN

演示数据库

下面是选自 “Websites” 表的数据:

+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
| 3  | 菜鸟教程      | http://www.runoob.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
+----+---------------+---------------------------+-------+---------+

下面是 “access_log” 网站访问记录表的数据:

+-----+---------+-------+------------+
| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   2 |       3 |   100 | 2016-05-13 |
|   3 |       1 |   230 | 2016-05-14 |
|   4 |       2 |    10 | 2016-05-14 |
|   5 |       5 |   205 | 2016-05-14 |
|   6 |       4 |    13 | 2016-05-15 |
|   7 |       3 |   220 | 2016-05-15 |
|   8 |       5 |   545 | 2016-05-16 |
|   9 |       3 |   201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)
SQL FULL OUTER JOIN 实例

MySQL中不支持 FULL OUTER JOIN,你可以在 SQL Server 测试以下实例

SELECT Websites.name, access_log.count, access_log.date
FROM Websites
FULL OUTER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;

**注释:**FULL OUTER JOIN 关键字返回左表(Websites)和右表(access_log)中所有的行。如果 “Websites” 表中的行在 “access_log” 中没有匹配或者 “access_log” 表中的行在 “Websites” 表中没有匹配,也会列出这些行。

A inner join B 取交集。
A left join B 取 A 全部,B 没有对应的值为 null。
A right join B 取 B 全部 A 没有对应的值为 null。
A full outer join B 取并集,彼此没有对应的值为 null。
对应条件在 on 后面填写。

参考:https://blog.youkuaiyun.com/qq_37938523/article/details/80872162
https://blog.youkuaiyun.com/qq_37709240/article/details/80049744
https://www.runoob.com/sql/sql-join-full.html

inner join是一种等值连接,它只返回两个表中联结字段相等的行。left outer join是左外连接,它返回包括左表中的所有记录和右表中联结字段相等的记录。right outer join是右外连接,它返回包括右表中的所有记录和左表中联结字段相等的记录。full outer join是全外连接,它返回包括左表和右表中的所有记录,无论是否有匹配的记录。所以,这些连接类型主要区别在于它们返回的记录集合的不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [inner joinouter joinright joinleft join 之间的区别](https://blog.youkuaiyun.com/dingjianmin/article/details/92009385)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [oracle基础积累-join,left join,right join,inner join,full join,left outer join,right outer join 之间...](https://blog.youkuaiyun.com/zhangbeizhen18/article/details/101002029)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值