首先了解JOIN的基本概念:

join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

INNER JOIN:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。

FULL JOIN 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。

通俗的解释是INNER JOIN就类似于查询多个表并且在WHERE之后加上联接这些表的唯一限定条件,以下两句SQL语句,返回相同的结果:

select * from tb_Course as c,tb_CourseType as ct where c.ctpID=ct.ID

select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID

以此类推,LEFT JOIN 返回左表的所有行,也就是即使右表中无法找到对应左表记录的数据,也会返回数据。RIGHT JOIN 类似。而FULL JOIN就是LEFT 和 RIGHT 的并集,只要存在匹配就返回行。

而本文需要解决或者验证的问题是在进行多表查询的时候,LEFT JOIN ,RIGHT JOIN 会不会有优先级。

为了方便,就拿最简单的三表查询进行检验。在三表查询中,可能出现的情况也就是9种(暂时不考虑FULL JOIN)。

首先运行下面语句:

select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID

得到的结果如图:

当在上面语句之后再JOIN一张表的时候:

select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID
inner join tb_Teacher as t on t.CID=c.ID

得到的结果如图:

由此得到猜想,第二条语句首先进行了第一个JOIN,然后将此结果进行第二次JOIN,也就是是按照从左到右的顺序进行JOIN。而为了验证此猜想,就要进行其他的检验。方法很简单,依次按照先LEFT JOIN 后LEFT JOIN或者先RIGHT JOIN后LEFT JOIN的顺序进行检验,当检查完每个结果集时,是否遵循先前的猜想。

SQL中 LEFT JOIN ,RIGHTJOIN,INNER JOIN 的使用及优先级浅析的更多相关文章

  1. Linq表连接大全(INNER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN、CROSS JOIN)

    我们知道在SQL中一共有五种JOIN操作:INNER JOIN.LEFT OUTER JOIN.RIGHT OUTER JOIN.FULL OUTER JOIN.CROSS JOIN 1>先创建 ...

  2. sql中的inner join ,left join ,right join

    左连接LEFT JOIN, 也就是说,左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的数据是否满足连接条件,均输出左端表中的内容.不满足连接条件的 ,连接字段栏位将对 ...

  3. SQL中inner join、outer join和cross join的区别

    对于SQL中inner join.outer join和cross join的区别简介:现有两张表,Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同 ...

  4. my sql中join的操作

    SQL标准中的Join的类型:  首先,设置表employees和department的数据为:  1.inner join … on操作类型 内连接inner join是基于连接谓词将两张表(如A和 ...

  5. SQL中JOIN 的用法

    关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create table table1(id int ...

  6. Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式

    当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left ...

  7. sql语句中left join、inner join中的on与where的区别

    table a(id, type): id     type ---------------------------------- 1      1 2      1 3      2 table b ...

  8. SQL中join的用法

    关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create table table1(id int ...

  9. Access SQL中Left Join、Right Join和Inner Join的使用

    1.表结构 表A                                     表B 2.Left Join 示例:2.1 Select * From A left join B on A. ...

随机推荐

  1. WebAssembly:随风潜入夜

    What? WebAssembly 是一种二进制格式的类汇编代码,可以被浏览器加载和并进一步编译成可执行的机器码,从而在客户端运行.它还可以作为高级语言的编译目标,理论上任何语言都可以编译为 WebA ...

  2. MyBatis源码解析【1】准备工作

    终于迎来了这一天,我觉得现在的我在经历了长时间的学习和开发之后有了一定的经验,所以准备开始学习源码. 今天我将做好充足的准备,在接下来的一个月中,努力的爬过这座大山.(可能不用一个月,但是我觉得需要仔 ...

  3. 谈谈tableView的重要属性内边距

    全屏穿透效果需要做到两点 tableView的可视范围占据整个父控件(或者屏幕)--设置contentsize滚动范围. 所有的cell都可以被看到,也就是说tableView中的cell不会被导航栏 ...

  4. OpenCV 之 网络摄像头

     1  RTSP RTSP (Real Time Streaming Protocol),是一种语法和操作类似 HTTP 协议,专门用于音频和视频的应用层协议. 和 HTTP 类似,RTSP 也使用 ...

  5. Mysql连接出错问题

    1.java 提示:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 处理:导入mysql-connector-java-5.1.7-bi ...

  6. 求从n个数组任意选取一个元素的所有组合

    最近做项目碰到这个问题,如题从n个数组任意选取一个元素的所有组合.比如已知数组是[1, 3]; [2, 4]; [5]; 最后组合结果是[1, 2, 5]; [1, 4, 5];  [3, 2, 5] ...

  7. 部分转载[C#性能优化实践]

    全文出处:http://www.infoq.com/cn/articles/C-sharp-performance-optimization 1.性能 主要指两个方面:内存消耗和执行速度.性能优化简而 ...

  8. python新手之一环境安装

    今天开始学习python,首先环境安装 1.在https://www.python.org/downloads/下载python2.X或者3.X(ps:这里建议下载32位的python ,因为64位p ...

  9. React Native App设置&Android版发布

    React Native系列 <逻辑性最强的React Native环境搭建与调试> <ReactNative开发工具有这一篇足矣> <解决React Native un ...

  10. C# 实现语音听写

    本文系原创,禁止转载. 分享如何使用c#对接科大讯飞语音听写服务,简单高效地实现语音听写. 实现语音听写主要分为录音和语音识别两部分:录音是指获取设备声卡端口的音频数据并将之保存为音频文件,语音识别就 ...