sql用逗号连接多张表对应哪个join?

举报
DevFeng 发表于 2021/04/12 17:46:15 2021/04/12
【摘要】 转自:http://blog.csdn.net/huanghanqian/article/details/52847835 四种join的区别已老生常谈:INNER JOIN(也可简写为JOIN): 如果表中有至少一个匹配,则返回行LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行FULL JOIN: 只要其中一个表...

转自:http://blog.csdn.net/huanghanqian/article/details/52847835

四种join的区别已老生常谈:

  • INNER JOIN(也可简写为JOIN): 如果表中有至少一个匹配,则返回行
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行

那么问题来了,还有一种常见的写法是将表用逗号隔开,那这个又是怎么连接的呢。

先看这两张表。

使用逗号隔开的方法来连接表:

SELECT *  
FROM   employee,department 
WHERE  employee.DepartmentID = department.DepartmentID

输出结果:

可以很明显发现:这不就是inner join嘛!

没错,答案正是这样:sql用逗号连接多张表对应的是 inner join。

为了严谨性,我到处找sql的官方文档来证实这一点。然而搜不出来sql的文档(谁知道网址请务必发我),最后还是在维基百科上找到了可以当作论据的话。

SQL 定义了两种不同语法方式去表示"连接"。首先是"显式连接符号",它显式地使用关键字 JOIN,其次是"隐式连接符号",它使用所谓的"隐式连接符号"。隐式连接符号把需要连接的表放到 SELECT 语句的 FROM 部分,并用逗号隔开。这样就构成了一个"交叉连接",WHERE 语句可能放置一些过滤谓词(过滤条件)。那些过滤谓词在功能上等价于显式连接符号. SQL 89标准只支持内部连接与交叉连接,因此只有隐式连接这种表达方式;SQL 92标准增加了对外部连接的支持,这才有了JOIN表达式。

也就是说,

SELECT *
FROM   employee 
       INNER JOIN department 
          ON employee.DepartmentID = department.DepartmentID

等价于:

SELECT *  
FROM   employee,department 
WHERE  employee.DepartmentID = department.DepartmentID

至于哪个效率高一点,其实两者是一回事,没有区别。只是内连接是由SQL 1999规则定的书写方式而已。

另外,在写sql语句测试4种join的时候,发现mysql对于full join返回的结果和inner join一模一样。经查阅资料,才发现原来mysql不支持full join啊。

见:http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql

参考资料:

1.维基百科 https://zh.wikipedia.org/wiki/%E8%BF%9E%E6%8E%A5_(SQL)

2.w3school http://www.w3school.com.cn/sql/sql_join.asp

3.CSDN博客最后一段话 http://www.cnblogs.com/huangfr/archive/2012/06/20/2555530.html

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。