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

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

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

    转自:http://blog.csdn.net/huanghanqian/article/details/52847835 四种join的区别已老生常谈: INNER JOIN(也可简写为JOIN): ...

  2. 【转】sql用逗号连接多张表对应哪个join?

    逗号连接查询(用where连接条件): select order.id, order.orderdate,employee.id,employee.name from order,employee w ...

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

    问题描述: 公司的数据库表有时候会看到没有主键的,SQL中的每一张表都必须设有主键吗? 主键的作用: 1)保证实体的完整性: 2)加快数据库的操作速度: 3)在表中添加新记录时,数据库ACCESS会自 ...

  4. Azure SQL Database (21) 将整张表都迁移到Azure Stretch Database里

    <Windows Azure Platform 系列文章目录>  Azure SQL Database (19) Stretch Database 概览      Azure SQL Da ...

  5. sql语句 怎么从一张表中查询数据插入到另一张表中?

    sql语句 怎么从一张表中查询数据插入到另一张表中?  ----原文地址:http://www.phpfans.net/ask/MTc0MTQ4Mw.html 比如我有两张表 table1 字段 un ...

  6. 自关联映射:一个表自己关联自己,此时从同一个表中查询,通过起别名将一张表变成两张表,使用join语句。

    实例1:id自关联. 隐式内连接: 实例二:编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id .返回结果 不要求顺序 . 查询结果格式如下例: Weather +--- ...

  7. [转载] SQL获取所有数据库名、表名、储存过程以及参数列表

    查询一个数据库中所有表字段属性的sql语句       1.获取所有用户名: SELECT name FROM Sysusers where status='2' and islogin='1' is ...

  8. SQL 把数据从一张表更新到另一张表

    代码写多了,有些使用过的方法和技巧会一时半会想不起来,平日记录下来,方便自己和有需要的人日后查阅. UPDATE tb1 SET tb1.fieldOne = tb2.fieldOne /* 将原始表 ...

  9. SQL数据库查询出一张表中重复的数据,按某个字段来查找。

    例如表名为Course 需要查询出name重复的有那些??? 解答如下: 补充: 如:查询每个姓名出现大于2次,SQL如下 SELECT COUNT(NAME) as '出现次数',  NAME FR ...

随机推荐

  1. WPF 改变Datagrid的选中行的颜色

    主要通过设置DataGrid的RowStyle和CellStyle即可. <Style TargetType="DataGridRow" x:Key="gridRo ...

  2. iis部署 .net core webapi

    iis部署 .net core webapi 1.修改应用程序池: IIS 发布站点,这里就不介绍 IIS 安装等.这里要修改的是应用程序池,选择“无托管代码”: 2.下载安装.net core托管捆 ...

  3. 附2 volatile

    注:在阅读本章之前,先要了解Java内存模型,见上一章<附1 Java内存模型与共享变量可见性>,链接如下: http://www.cnblogs.com/java-zhao/p/5124 ...

  4. 20164317《网络对抗技术》Exp4 恶意代码分析

    1.实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systr ...

  5. Map-560. Subarray Sum Equals K

    Given an array of integers and an integer k, you need to find the total number of continuous subarra ...

  6. 一个MySQL 5.7 分区表性能下降的案例分析

    告知MySQL5.7.18的使用者分区表使用中存在的陷阱,避免在该版本上继续踩坑.同时通过对源码的讲解,升级MySQL5.7.18时分区表性能下降的根本原因,向MySQL源码爱好者展示分区表实现中锁的 ...

  7. spring定时任务的注解实现方式

    STEP 1:在spring配置文件中添加相应配置,以支持定时任务的注解实现 (一)在xml里加入task的命名空间 <!-- beans里添加:--> xmlns:task=" ...

  8. checkbox选中事件

    在前端中,往往需要根据后台数据的返回选中多选框.可以根据后台返回的数据转化为数组,然后又val([数组])进行选中. 例子: html代码: <!DOCTYPE html> <htm ...

  9. Advanced Debugging and the Address Sanitizer

    A debug trick 在异常端点处运行 po $arg1,找出异常信息.  Address Sanitizer 概述 是一个运行时检测工具 发现内存问题 可以用于模拟器和设备 可以发现的问题 ...

  10. 神策Loagent数据收集 windows部署的坑

    部署可以修改bin文件夹下的bat文件.. java改为javaw..无窗口运行 重新启动的时候..要保证上次运行到的日志文件要还在..或者同名文件.. 保证要比之前的文件大些..所以最好是之前的文件 ...