sql多表查询(out join,inner join, left join, right join)
left join以左表为基准显示所有左表的信息,在on中有符合条件的其他表也显示出来
right join则相反
inner join的只显示on中符合条件的
1 使用多个表格
在「world」资料库的「country」表格中,储存世界上所有的国家资料,其中有一个栏位「Capital」用来储存首都资料,不过它只是储存一个编号;另外在「city」表格中,储存世界上所有的城市资料,它主要的栏位有城市编号和城市的名称:
虽然「country」表格自己没有储存城市名称,不过它可以使用「Capital」栏位的值,对照到「city」表格中的「ID」栏位,也可以知道城市的名称。在这样的表格设计架构下,如果你想要查询「所有国家的首都名称」:
这样的查询需求就称为「结合查询」,也就是你要查询的资料,来自于一个以上的表格,而且两个表格之间具有上列讨论的「对照」情形。
2 Inner Join
「Inner join」通常称为「内部结合」,它可以应付大部份的结合查询需求,内部结合有两种写法,差异在把结合条件设定在「WHERE」子句或「FROM」子句中。
2.1 使用结合条件
下列是在「WHERE」子句中设定结合条件来执行结合查询的语法:
虽然这里会先介绍使用结合条件的结合查询,不过不管使用哪一种写法,在使用结合查询时都会有一样的想法。首先是你想要查询的栏位:
把需要查询的栏位列在「SELECT」之后,「FROM」子句后面该需要哪一些表格就很清楚了:
最后把表格与表格之间「对照」的结合条件放在「WHERE」子句中:
这样的叙述就可以查询「所有国家的首都名称」。
2.2 指定表格名称
在上列的讨论中,因为使用到多个表格了,所以在使用表格的栏位时,都特别提醒你要在栏位名称前面加上表格名称。其实并不是全部都要指定表格名称,你只有在一种情况下,才「一定要」在栏位名称前指定表格名称:
在查询叙述的「FROM」子句中用到的表格,如果有一样的栏位名称,而且你在查询叙述中也用到了这些栏位,就「一定要」在栏位名称前指定表格名称,否则都可以省略:
所以省略掉一些表格名称以后,查询叙述就简短多了,不过它执行查询后的结果也是一样的:
- SELECT Code, Capital, city.Name
- FROM country, city
- WHERE Capital = ID
如果不小心违反上列的规则,你的查询叙述在执行以后就会发生错误:
2.3 表格别名
如果你想要查询「国家和首都的人口和比例」:
这样的结合查询刚好都使用到两个表格中,有同样名称的栏位,所以你一定要指定表格名称:
- SELECT country.name, country.Population coPop,
- city.Name, city.Population ciPop,
- city.Population / country.Population * 100 Scale
- FROM country, city
- WHERE Capital = ID
这样的查询叙述就会比较长一些,也比较容易打错;所以在结合查询的叙述中,通常为帮「FROM」子句后面的表格都取一个「表格别名」:
使用表格别名以后:
帮「FROM」子句中使用到的表格都取一个表格别名,这样的查询叙述通常也可以比较简短一些了。
2.4 使用「INNER JOIN」
执行结合查询除了使用上列讨论的方式外,还有另外一种结合查询语法:
虽然这两种写法看起来的差异很大,不过它们的想法会是一样的。首先是需要查询的栏位:
接下来是需要用到的表格,不过你要使用「INNER JOIN」把两个表格「结合」起来:
最后是结合条件:
上列使用「INNER JOIN」的结合查询执行以后,跟之前使用结合条件的结合查询,所得到的结果是完全一样的。所以查询「国家和首都的人口和比例」的结合查询,也可以改用下列的写法:
- SELECT a.name, a.Population coPop,
- b.Name, b.Population ciPop,
- b.Population / a.Population * 100
- FROM country a INNER JOIN city b ON Capital = ID
使用「INNER JOIN」的结合查询还有另外一种选择:
下列是使用「ON」或是「USING」来设定结合条件的情况:
所以如果想要查询「cmdev」资料库中,员工资料和他们的部门名称,就会有三种写法可以选择了:
3 Outer Join
在「cmdev」的员工资料(emp)表格中,部门编号(deptno)栏位是用来储存员工所属的部门用的;不过有一些员工并没有部门编号:
所以如果你使用「内部结合」的作法执行下列的查询,你会发现少了两个员工的资料:
这是因为使用「内部结合」的查询,一定要符合「结合条件」的资料才会出现:
如果你想查询的资料是「包含部门名称的员工资料,可是没有分派部门的员工就不用出现了」,那使用「内部结合」就可以完成你的工作了;可是如果你想要查询的资料是「包含部门名称的员工资料,没有分派部门的员工也要出现」,那你就要使用「OUTER JOIN」,这种结合查询通常称为「外部结合」:
除了多一个「LEFT」或「RIGHT」,还有把「INNER」换成「OUTER」外,其它的部份与内部结合的作法都是一样的。
3.1 LEFT OUTER JOIN
所以在结合查询的应用中,如果你想要查询的资料是「包含部门名称的员工资料,没有分派部门的员工也要出现」,也就是希望不符合结合条件的资料也要出现的话,就要换成使用「LEFT OUTER JOIN」来执行结合查询。OUTER JOIN分为LEFT和RIGHT两种,在这个范例中,要使用LEFT才符合查询的需求:
3.2 RIGHT OUTER JOIN
其实使用「LEFT OUTER JOIN」或是「RIGHT OUTER JOIN」并没有差异,以上列的需求来说,要查询「包含部门名称的员工资料,没有分派部门的员工也要出现」,就是要以「cmdev.emp」表格的资料为主,所以下列两种写法所得到的结果是完全一样的:
了解两种「OUTER JOIN」的后,下列这两个看起来会有点混淆的查询,虽然只有「LEFT」与「RIGHT」的差异,它们所完成的查询需求,却是完全不一样的:
所以使用「RIGHT OUTER JOIN」的查询需求,就成为「部门名称与该部门的员工资料,没有员工的部门也要出现」:
4 合并查询
在关联式资料库中,因为表格的设计,你常会使用结合查询来取得需要的资料,结合查询指的是在「一个」查询叙述中使用「多个」资料表。而现在要讨论的「合并、UNION」查询,指的是把一个以上的查询叙述所得到的结果合并为一个,有这样的需求时,你会在多个查询叙述之间使用「UNION」关键字:
以下列这两个独立的查询来说,它们在执行以后会得到各自传回查询的纪录:
如果使用「UNION」关键字把这两个查询合并起来的话,就只会得到一个查询结果,不过这个查询结果会包含两个查询所得到的纪录:
在执行合并查询的时候,有一些规则要知道与遵守。第一个规则是回传结果的栏位名称:
第二个规则是所有查询叙述的栏位数量一定要一样:
上列的范例比较看不出为什么要使用合并查询,一般来说,你大概会因为下列的原因,把原来的查询叙改用合并查询的写法来完成你的需求:
sql多表查询(out join,inner join, left join, right join)的更多相关文章
- sql多表查询之一:Where 和 On的秘密
原文 sql多表查询之一:Where 和 On的秘密 对于还在SQL初级阶段的朋友来说,sql多表查询问题是一个比较有趣也容易出错的技术.什么时候会用到sql多表查询呢?是在两张或两张以上表单中通过某 ...
- oracle SQL多表查询
SQL多表查询 1.集合理论 1.1 什么是集合 具有某种特定性质的事物的总体. 集合的特性:无序性.互异性.确定性. 一个集合可以小到从一个表中取出一行中的一列. 1 ro ...
- SQL联表查询
数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(tab ...
- Sql Server的艺术(四) SQL多表查询
表的基本连接 SQL的一个重要特性就是能通过JOIN关键词,从多个交叉表中查询.分析数据. 连接表的目的 在关系数据库中,数据表设计的一个重要原则就是要避免冗余性. 减少了冗余信息,节省了数据库存储空 ...
- sql多表查询(单表查询略过)
表library: 表borrow: 表reader: 1.等值连接:(常用) 原理:将多张表组合成一个逻辑大表,即字段相加记录相乘(笛卡尔积). 语法:select * from 表A,表B whe ...
- SQL多表查询总结
前言 连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要.只有真正了解它们之间的区别,才能正确使用. 一.Union UNION 操作符用于合并两个或多个 SELE ...
- 【数据库】sql连表查询
SQL总结 连表查询 连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要. 只有真正了解它们之间的区别,才能正确使用. 1.Union UNION 操作符用于合并两 ...
- Server Sql 多表查询、子查询和分页
一.多表查询:根据特定的连接条件从不同的表中获取所需的数据 多表查询语法: SELECT table1.column, table2.column FROM table1, table2 WHERE ...
- sql 两表查询后 更新某表中部分字段
这是上一个sql更新某表字段的一个延伸,在更新表数据时,实际上会有多表数据查询场景,查询后,只需要更新某一个表中的数据,以下提供两个方法, 第一种使用update 两表查询 update api_ma ...
随机推荐
- http://blinkfox.com/shi-yong-spring-aoplai-tong-ji-fang-fa-de-zhi-xing-shi-jian/
http://blinkfox.com/shi-yong-spring-aoplai-tong-ji-fang-fa-de-zhi-xing-shi-jian/ spring-aop.xml @Com ...
- C#中override和overload的区别
重载应该叫overload,重写叫override:重载某个方法是在同一个类中发生的!重写是在子类中重写父类中的方法. 1.override: 父类:public virtual string T ...
- Maven 迁移local repository
1.1 Maven仓库主要有2种: remote repository:相当于公共的仓库,大家都能访问到,一般可以用URL的形式访问,一般默认的地址:http://search.maven.org/ ...
- 使用sh-x调试shell脚本_转
参考:http://blog.chinaunix.net/uid-20564848-id-73502.html 1. 通过sh -x 脚本名 #显示脚本执行过程2.脚本里set -x选项,轻松跟踪调 ...
- 在一个Label上设置多种颜色字体
#import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL ...
- nginx地址重写
1. 域名重定向 server_name wx.he.com weixin.ha.com; if ($http_host !~* "wx\.he\.com"){ rewrite ^ ...
- jquery的ajax同步和异步
之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题.最近的项目用了到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去 ...
- eclipse启动无响应,停留在Loading workbench状态
做开发的同学们或多或少的都会遇到eclipse启动到一定程度时,就进入灰色无响应状态再也不动了.启动画面始终停留在Loading workbench状态.反复重启,状态依旧. 多数情况下,应该是非正常 ...
- tomcat war包部署
平常的开发我们都是通过IDE进行项目的部署,但有时候我们不得不进行手工部署(例如在Server上). 手工部署分为以下几步: 第1步: 用maven打war包 (假如得到的war包名为: appkit ...
- MJRefresh简单处理
//下拉刷新 默认 self.bottomTableVeiw.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ [self he ...