图解MYSQL JOIN ON,SQL JOIN 详解,数据库sql join语句_MySQL

php中文网
发布: 2016-05-31 08:49:01
原创
1372人浏览过

对于sql的join,在学习起来可能是比较乱的。我们知道,sql的join语法有很多inner的,有outer的,有left的,有时候,对于select出来的结果集是什么样子有点不是很清楚。coding horror上有一篇文章(实在不清楚为什么coding horror也被墙)通过 文氏图 venn diagrams 解释了sql的join。我觉得清楚易懂,转过来。

假设我们有两张表。

  • Table A 是左边的表。
  • Table B 是右边的表。

其各有四条记录,其中有两条记录是相同的,如下所示:

id name       id  name-- ----       --  ----1  Pirate     1   Rutabaga2  Monkey     2   Pirate3  Ninja      3   Darth Vader4  Spaghetti  4   Ninja
登录后复制

下面让我们来看看不同的Join会产生什么样的结果。

 

SELECT * FROM TableA<strong>INNER JOIN</strong> TableBON TableA.name = TableB.nameid  name       id   name--  ----       --   ----1   Pirate     2    Pirate3   Ninja      4    Ninja
登录后复制

Inner join
产生的结果集中,是A和B的交集。

Venn diagram of SQL inner join
SELECT * FROM TableA<strong>FULL OUTER JOIN</strong> TableBON TableA.name = TableB.nameid    name       id    name--    ----       --    ----1     Pirate     2     Pirate2     Monkey     null  null3     Ninja      4     Ninja4     Spaghetti  null  nullnull  null       1     Rutabaganull  null       3     Darth Vader
登录后复制

Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

Venn diagram of SQL cartesian join
SELECT * FROM TableA<strong>LEFT OUTER JOIN</strong> TableBON TableA.name = TableB.nameid  name       id    name--  ----       --    ----1   Pirate     2     Pirate2   Monkey     null  null3   Ninja      4     Ninja4   Spaghetti  null  null
登录后复制

Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

西语写作助手
西语写作助手

西语助手旗下的AI智能写作平台,支持西语语法纠错润色、论文批改写作

西语写作助手 21
查看详情 西语写作助手
Venn diagram of SQL left join
SELECT * FROM TableALEFT OUTER JOIN TableBON TableA.name = TableB.name<strong>WHERE TableB.id IS null</strong> id  name       id     name--  ----       --     ----2   Monkey     null   null4   Spaghetti  null   null
登录后复制

产生在A表中有而在B表中没有的集合。

join-left-outer.png
SELECT * FROM TableAFULL OUTER JOIN TableBON TableA.name = TableB.name<strong>WHERE TableA.id IS null OR TableB.id IS null </strong>id    name       id    name--    ----       --    ----2     Monkey     null  null4     Spaghetti  null  nullnull  null       1     Rutabaganull  null       3     Darth Vader
登录后复制

产生A表和B表都没有出现的数据集。

join-outer.png

还需要注册的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

SELECT * FROM TableA<strong>CROSS JOIN</strong> TableB
登录后复制

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

(全文完)

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号