SQL中 LEFT JOIN ,RIGHTJOIN,INNER JOIN 的使用及优先级浅析
首先了解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 的使用及优先级浅析的更多相关文章
- 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>先创建 ...
- sql中的inner join ,left join ,right join
左连接LEFT JOIN, 也就是说,左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的数据是否满足连接条件,均输出左端表中的内容.不满足连接条件的 ,连接字段栏位将对 ...
- SQL中inner join、outer join和cross join的区别
对于SQL中inner join.outer join和cross join的区别简介:现有两张表,Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同 ...
- my sql中join的操作
SQL标准中的Join的类型: 首先,设置表employees和department的数据为: 1.inner join … on操作类型 内连接inner join是基于连接谓词将两张表(如A和 ...
- SQL中JOIN 的用法
关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create table table1(id int ...
- Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式
当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left ...
- sql语句中left join、inner join中的on与where的区别
table a(id, type): id type ---------------------------------- 1 1 2 1 3 2 table b ...
- SQL中join的用法
关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create table table1(id int ...
- Access SQL中Left Join、Right Join和Inner Join的使用
1.表结构 表A 表B 2.Left Join 示例:2.1 Select * From A left join B on A. ...
随机推荐
- Python开发简单爬虫(一)
一 .简单爬虫架构: 爬虫调度端:启动爬虫,停止爬虫,监视爬虫运行情况 URL管理器:对将要爬取的和已经爬取过的URL进行管理:可取出带爬取的URL,将其传送给“网页下载器” 网页下载器:将URL指定 ...
- 浅析CQRS的应用部署
CQRS,中文翻译命令和查询职责分离,它是一种架构,不仅可以从数据库层面实现读写分离,在代码层面上也是推荐读写分离的.在接口上可以更为简单 命令端定义 ICommandResult Execute(I ...
- RecyclerView-------之GridView模式加载更多
随着RecyclerView的出现,Listview.GridView的使用率相对有些减少,废话不多说,先看一下效果: 代码如下: 1.自定义的RecyclerView(根据自己的需要) public ...
- springmvc 前端 发ajax请求的几种方式
一.传json单值或对象 1.前端 var data = {'id':id,'name':name}; $.ajax({ type:"POST", url:"user/s ...
- POJ 2195 Going Home (带权二分图匹配)
POJ 2195 Going Home (带权二分图匹配) Description On a grid map there are n little men and n houses. In each ...
- CentOS的改变系统启动级别
CentOS7改变系统启动级别 systemctl命令: 文本模式:systemctl set-default multi-user.target 图形模式:systemctl set-def ...
- nyoj_78:圈水池(凸包入门)
题目链接 将所有点按从左至右顺序排序,然后将所有点先从左到右扫描再从右到左扫描,逐渐将凸包轮廓"勾勒"出来 (凸包轮廓满足,轮廓上连续的三个点按先后顺序给出的话呈逆时针方向) 最后 ...
- (转)css内边距与外边距的区别,精辟啊
css内边距与外边距的区别 (2012-05-02 13:54:54) 转载▼ 标签: 杂谈 分类: css 本文也是网上看了后收藏的,忘了原地址(以后收藏文章得注意) 你真的了解margin吗?你知 ...
- 微信小程序框架探究和解析
何为框架 你对微信小程序的技术框架了解多少? 对wepy 框架进行一系列的深入了解 微信小程序框架解析和探究 小程序组件化框架WePY 在性能调优上做出的探究 开发者培训班上海专场PPT分享:小程序框 ...
- cin问题 分类: c++ 2014-08-02 21:13 38人阅读 评论(0) 收藏
string s: while(cin>>s){ cout<<s<endl; } 当输入ss w ww w w 按enter时 输出为 ss w ww w ...