sql用逗号连接多张表对应哪个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

时间: 2024-12-16 07:52:07

sql用逗号连接多张表对应哪个join?的相关文章

SQL中的每一张表都必须设有主键吗

主键的作用: 1)保证实体的完整性; 2)加快数据库的操作速度 3)在表中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复. 4) 数据库自动按主键值的顺序显示表中的记录.如果没有定义主键,则按输入记录的顺序显示表中的记录. 主键不是非要不可,可以从: 1.是否满足业务要求 2.数据查询效率(主键可以提高查询效率,当然合理的索引替代也可以) 这两个角度权衡是否需要主键. 这要看表的功能. 利用来存储大量数据,并需要经常查询的,建立主键可以加快查询效率从而降低服务器的

sql server2008怎么给一张表加一个用户

有时候我们要对数据库进行权限管理,防止有人误操作或者窃取数据,那么小编这篇文章就是实现这个的操作过程. 百度经验:jingyan.baidu.com 工具/原料 sql server2008数据库 电脑 百度经验:jingyan.baidu.com 方法/步骤 1 1.打开数据库,进入--安全性--登录名--新建登录名 步骤阅读 2 2.在常规这个选项卡中,创建登陆名,并设置默认的数据库 步骤阅读 3 3.在用户映射这个选项中,单击勾选你需要设置的数据库,然后设置架构,单击确认,这样就完成了创建

sql中如何 将一张表的数据 更新到另外一张表的字段中

今天操作数据库       有个需求需要从一张流水表中有用户付款金额    还有一张  是用户的结算金额    每个用户的付款和结算费率和手续费等都不一样   需要将剩余可以结算的金额查询出来  进行更新到各自对应的用户后面  花了几分钟写出来去测试了一下  没问题 万变不离其中   依然还是  在 update  +表(及其关联表) +set  +更改字段 +where 条件 update merchant m join ( select pc.cp_channel channelId,0.0

Sql省市三级联动一张表

CREATE TABLE [dbo].[region]( [region_id] [int] NULL, [region_name] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, [parend_id] [int] NULL, [sort_id] [int] NULL, [region_mome] [varchar](500) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] INSERT INTO REGI

查看Sql Server库中某张表的结构

--快速查看表结构(比较全面的) SELECT CASE WHEN col.colorder = 1 THEN obj.name ELSE '' END AS 表名, col.colorder AS 序号 , col.name AS 列名 , ISNULL(ep.[value], '') AS 列说明 , t.name AS 数据类型 , col.length AS 长度 , ISNULL(COLUMNPROPERTY(col.id, col.name, 'Scale'), 0) AS 小数位数

Mysql两张表相同ID匹配,输出到新表,删除旧表匹配

0x00:前言. 有两张表,一张表字段是ID-Email,另一张表字段是ID-PWD,想用SQL脚本把这两张表合并合并,因为有相同的ID才可以匹配. 0x01:示例. 一个字段ID:Email 另一个字段是ID:PWD 想要的输出就结果ID:Email:PWD 0x02:Mysql语句. 注意:因为MySQL为了安全,不允许一行执行两条语句(如:LINUX下用&&). 执行前将语句写入SQL脚本文件,文件后缀用.sql,tttt_test是数据库名. 以下是文本. CREATE TABLE

深入理解Oracle表(5):三大表连接方式详解之Hash Join的定义,原理,算法,成本,模式和位图...

Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集       Hash Join的执行计划第1个是hash表(build table),第2个探查表(probe table),一般不叫内外表,nested loop才有内外表       Hash表也就是所谓的内表,探查表所谓的外表       两者的执行计划形如:       nested loop           outer table    

mysql left join 左连接查询关联n多张表

eft join 左连接即以左表为基准,显示坐标所有的行,右表与左表关联的数据会显示,不关联的则不显示.关键字为left join on. **基本用法如下: select table a left join table b on a.id = b.ta_id** 注意:1??其中on后面关联的字段应该是同一字段(两表关联的外键) 2??由于以左表为基准,左表一条记录如果对应右表多条记录,那查出的数据中右表的数据也只显示一条,如果要都显示,可以用group_contact()将字段用逗号隔开显示

CROSS JOIN连接用于生成两张表的笛卡尔集

将两张表的情况全部列举出来 结果表: 列= 原表列数相加 行= 原表行数相乘 CROSS JOIN连接用于生成两张表的笛卡尔集. 在sql中cross join的使用: 1.返回的记录数为两个表的记录数乘积. 2.将A表的所有行分别与B表的所有行进行连接. 例如: tableA r1 r2 A B C D tableB r3 r4 1 2 3 4 select * from tableA cross join tableB; return: r1 r2 r3 r4 r1 r2 1 2 r1 r2