fullouterjoin用法(full join 和full outer join)
SQL常用的几种连接查询
一、内连接(Inner Join)
select?*?from?a?inner?join?b?on?a.name=b.name;
此语句的结果为同时匹配表a和表b的记录集。即内连接取的是两个表的交集。
二、全外连接(full outer join)
select?*?from?a?full?outer?join?b?on?a.name=b.name;
此语句的结果为表a与表b的并集,即任意一个表的内容都将被查询出来,如果另一个表无对应的项,则显示为null
select?*?from?a?full?outer?join?b?on?a.name=b.name?where?a.name?is?null?or?b.name?is?null;
此语句的结果为表a与表b的并集除去两表的交集。即除去了两表都有的部分,剩余的是两表各自不同的部分
三、左外连接(left outer join)
select?*?from?a?left?outer?join?b?on?a.name=b.name;
此语句的结果为表a的所有项加表b与a相匹配的项,b中没有与a匹配的项时显示为null
select?*?from?a?left?outer?join?b?on?a.name=b.name?where?b.name?is?null;
此语句的结果为表a的所有项除去两表的交集
四、右外连接(right outer join)
select?*?from?a?right?outer?join?b?on?a.name=b.name;
此语句的结果为表a与表b匹配的项加表b的所有项,a中没有与b匹配的项时显示为null
select?*?from?a?right?outer?join?b?on?a.name=b.name?where?a.name?is?null;
此语句的结果为表b的所有除去两表的交集

数据库中join的用法
数据库中join的用法的用法你知道吗?下面我就跟你们详细介绍下数据库中join的用法的用法,希望对你们有用。
数据库中join的用法的用法如下:
一、join的用法
内连接、外连接
示例用表:
雇员表(Employee)
LastNameDepartmentID
Rafferty31
Jones33
Steinberg33
Robinson34
Smith34
JasperNULL
部门表(Department)
DepartmentID部门
31销售部
33工程部
34书记
35市场部
1、内连接:相等连接、自然连接、交叉连接
1)、显式的内连接与隐式连接(inner join == join )
显示连接:SELECT ?* from ? employee join ?department on employee.DepartmentID = department.DepartmentID
等价于:
隐式连接:SELECT ?* from ? employee,department WHERE employee.DepartmentID = department.DepartmentID
注:当DepartmentID不匹配,就不会往结果表中生成任何数据。
2)、相等连接
提供了一种可选的简短符号去表达相等连接,它使用 USING 关键字。
SELECT ?* from ? employee join ?department ?using (DepartmentID)
注:与显式连接不同在于:DepartmentID只显示一列
3)、自然连接
比相等连接的进一步特例化。两表做自然连接时,两表中的所有名称相同的列都将被比较,这是隐式的。
自然连接得到的结果表中,两表中名称相同的列只出现一次.
select * from employee natural join department
注:在 Oracle 里用 JOIN USING 或 NATURAL JOIN 时,如果两表共有的列的名称前加上某表名作为前缀,
则会报编译错误: "ORA-25154: column part of USING clause cannot have qualifier"
或 "ORA-25155: column used in NATURAL join cannot have qualifier".
4)交叉连接(又称笛卡尔连接)
如果 A 和 B 是两个集合,它们的交叉连接就记为: A × B.
显示连接:
select * from employee cross join department
等价于
隐式连接:
select * from employee,department
2、外连接
并不要求连接的两表的每一条记录在对方表中都一条匹配的记录。
1)左连接(left outer join == left join)
若A表与B表左连接,A表对就的B表没有匹配,连接操作也会返回一条记录,对应值为NULL。
如:
Jaspernull null null
Jones3333工程部
Rafferty3131销售部
Robinson3434书记
Smith3434书记
Steinberg3333工程部
若A表对应B表中有多行,则左表会复制和右表匹配行一样的数量,并组合生成连接结果。
如:select * from department ?left join employee ?on employee.departmentId = department.departmentId
31销售部Rafferty31
33工程部Jones33
33工程部Steinberg33
34书记Robinson34
34书记Smith34
35市场部nullnull
2)、右连接(right outer join == right join)
与左连接同(略)
3)、全连接(full outer join ==full join)
是左右外连接的并集. 连接表包含被连接的表的所有记录, 如果缺少匹配的记录, 即以 NULL 填充。
select * from employee full outer join department on employee.departmentId = department.departmentId
注:一些数据库系统(如 MySQL)并不直接支持全连接, 但它们可以通过左右外连接的并集(参: union)来模拟实现.
和上面等价的实例:
select * from employee left join department on employee.departmentId = department.departmentId
union all
select * from employee right join department on employee.departmentId = department.departmentId
注:SQLite 不支持右连接。
SQL中的左外连接和+号的用法
SQL中的左外连接和+号的用法
Oracle 左连接、右连接、全外连接、(+)号作用
Oracle? 外连接
(1)左外连接 (左边的表不加限制)
?????? (2)右外连接(右边的表不加限制)
?????? (3)全外连接(左右两表都不加限制)
外连接(Outer Join)
outer join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。外连接分为三种: 左外连接,右外连接,全外连接。 对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我们省略outer 这个关键字。 写成:LEFT/RIGHT/FULL JOIN。
在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。
对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:
?????? 1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
?????? 2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符
?????? 3.(+)操作符只适用于列,而不能用在表达式上。
?????? 4.(+)操作符不能与or和in操作符一起使用。
?????? 5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
在做实验之前,我们先将dave表和bl里加一些不同的数据。 以方便测试。
SQL select * from bl;
ID NAME
---------- ----------
1 dave
2 bl
3 big bird
4 exc
9 怀宁
SQL select * from dave;
ID NAME
---------- ----------
8 安庆
1 dave
2 bl
1 bl
2 dave
3 dba
4 sf-express
5 dmm
2.1 左外连接(Left outer join/ left join)
left join是以左表的记录为基础的,示例中Dave可以看成左表,BL可以看成右表,它的结果集是Dave表中的数据,在加上Dave表和BL表匹配的数据。换句话说,左表(Dave)的记录将会全部表示出来,而右表(BL)只会显示符合搜索条件的记录。BL表记录不足的地方均为NULL.
示例:
SQL select * from dave a left join bl b on a.id = b.id;
ID NAME?????????????? ID NAME
--------- ---------- ---------- ----------
1 bl????????????????? 1 dave
1 dave??????????????? 1 dave
2 dave??????????????? 2 bl
2 bl????????????????? 2 bl
3 dba???????????????? 3 big bird
4 sf-express????????? 4 exc
5 dmm???????????????????????????? -- 此处B表为null,因为没有匹配到
8 安庆???????????????????????????? -- 此处B表为null,因为没有匹配到
SQL select * from dave a left outer join bl b on a.id = b.id;
ID NAME?????????????? ID NAME
---------- ---------- ---------- ----------
1 bl????????????????? 1 dave
1 dave??????????????? 1 dave
2 dave??????????????? 2 bl
2 bl????????????????? 2 bl
3 dba???????????????? 3 big bird
4 sf-express????????? 4 exc
5 dmm
8 安庆
用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示,故是左连接。
SQL Select * from dave a,bl b where a.id=b.id(+);??? -- 注意: 用(+) 就要用关键字where
ID NAME?????????????? ID NAME
---------- ---------- ---------- ----------
1 bl????????????????? 1 dave
1 dave??????????????? 1 dave
2 dave??????????????? 2 bl
2 bl????????????????? 2 bl
3 dba???????????????? 3 big bird
4 sf-express????????? 4 exc
5 dmm
8 安庆
2.2 右外连接(right outer join/ right join)
和left join的结果刚好相反,是以右表(BL)为基础的, 显示BL表的所以记录,在加上Dave和BL 匹配的结果。 Dave表不足的地方用NULL填充.
示例:
SQL select * from dave a right join bl b on a.id = b.id;
ID NAME?????????????? ID NAME
---------- ---------- ---------- ----------
1 dave??????????????? 1 dave
2 bl????????????????? 2 bl
1 bl????????????????? 1 dave
2 dave??????????????? 2 bl
3 dba???????????????? 3 big bird
4 sf-express????????? 4 exc
9 怀宁??? --此处左表不足用Null 填充
已选择7行。
SQL select * from dave a right outer join bl b on a.id = b.id;
ID NAME?????????????? ID NAME
---------- ---------- ---------- ----------
1 dave??????????????? 1 dave
2 bl????????????????? 2 bl
1 bl????????????????? 1 dave
2 dave??????????????? 2 bl
3 dba???????????????? 3 big bird
4 sf-express????????? 4 exc
9 怀宁? --此处左表不足用Null 填充
已选择7行。
用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在左表,右表就是全部显示,故是右连接。
SQL Select * from dave a,bl b where a.id(+)=b.id;
ID NAME?????????????? ID NAME
---------- ---------- ---------- ----------
1 dave??????????????? 1 dave
2 bl????????????????? 2 bl
1 bl????????????????? 1 dave
2 dave??????????????? 2 bl
3 dba???????????????? 3 big bird
4 sf-express????????? 4 exc
9 怀宁
2.3 全外连接(full outer join/ full join)
左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充。 全外连接不支持(+)这种写法。
示例:
SQL select * from dave a full join bl b on a.id = b.id;
ID NAME?????????????? ID NAME
---------- ---------- ---------- ----------
8 安庆
1 dave??????????????? 1 dave
2 bl????????????????? 2 bl
1 bl????????????????? 1 dave
2 dave??????????????? 2 bl
3 dba???????????????? 3 big bird
4 sf-express????????? 4 exc
5 dmm
9 怀宁
已选择9行。
SQL select * from dave a full outer join bl b on a.id = b.id;
ID NAME?????????????? ID NAME
---------- ---------- ---------- ----------
8 安庆
1 dave??????????????? 1 dave
2 bl????????????????? 2 bl
1 bl????????????????? 1 dave
2 dave??????????????? 2 bl
3 dba???????????????? 3 big bird
4 sf-express????????? 4 exc
5 dmm ?
最初由 ghc_x 发布
[B]有两个表T1和T2,两个表除了主键索引外均无其他索引,这两个表由T1.F1(主键),T2.F2(主键)进行左连接,SQL语句有两种写法:
1. SELECT * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
当查看1的执行计划时发现T1为全表扫描,T2为索引扫描。
当查看2的执行计划时发现两个表均为全表扫描。
有人知道这是为什么吗? [/B]
我一直以来也是认为这两种写法是一样的,没想到楼主特意去看了它们的执行计划,而且发现了它们的不同,这使得我比较惊讶。
按照书上的讲法,这两种写法是没有什么区别的,后一种写法只不过是前一种写法的新版本。
为什么两者的执行计划会不一样呢?
我仔细看了一下两者的执行计划,发现了为什么后一种要两个表都全表 扫描,而前一个表有一个索引扫描。
原来前者选择的优化器是RULE,而后者选择的优化器是CBO的ALL ROWS。
不过,似乎要后者的效率高。
1. SELECT /*+RULE*/ * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT /*+RULE*/ * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
这样再看下执行计划吧
关系数据库外连接的语法与语法对应的执行过程
SQL 联接---完整外联接 (完整外部联接 ..full outer join..on) 收藏
SQL 联接---完整外联接 (完整外部联接 ..full outer join..on)
有表 titles(书信息表) 如下图
有表 publishers(出版社) 如下图
执行完整外联接代码:
select titles.titles_id,titles.title,publishers.pub_name from titles full outer join publishers on titles.pub_id=publishers.pub_id 结果如下图:
大家看明白了吗? 现在要讲关于完整外联接的 理论了 要顶住呀!不带睡觉啊! 不听话按行规 剁两脚指头!
一、联接( join)
通过联接,可以根据各个表之间的逻辑关系从两个或多个表中检索数据。联接表示应如何使用一个表中的数据来选择另一个表中的行。
联接条件通过以下方法定义两个表在查询中的关联方式:
指定每个表中要用于联接的列。典型的联接条件在一个表中指定外键,在另一个表中指定与其关联的键。指定比较各列的值时要使用的逻辑运算符(=、 等)。
二、联接类型
当联接表时,创建的联接类型影响出现在结果集内的行。联接类型:
三、内联接
内连接也叫自然连接,它是组合两个表的常用方法。自然连接将两个表中的列进行比较,将两个表中满足连接条件的行组合起来,作为结果。自然连接有两种形式的语法。
语法一:
SELECT 列 FROM 表1 [insert] JION 表2 ON 表1.列=表2.列
语法二:
SELECT 列 FROM 表1,表2 WHERE表1.列=表2.列
【例】从titles、authors和titleauthor表中查询书的书号、书名、作者号和作者名。
select titles.title_id, title, authors.au_id, au_lname from titles join titleauthor on titles.title_id=titleauthor.title_id join authors on authors.au_id=titleauthor.au_id
四、外连接(Outer join)
在自然连接中,只有在两个表中匹配的行才能在结果集中出现。而在外连接中可以只限制一个表,而对另外一个表不加限制(即所有的行都出现在结果集中)。
外连接分为左外连接、右外连接和全外连接。左外连接是对连接条件中左边的表不加限制;右外连接是对右边的表不加限制;全外连接对两个表都不加限制,所有两个表中的行都会包括在结果集中。
五、外连接(Outer join)语法
左外连接的语法为: SELECT 列 FROM 表1 LEFT [OUTER]JOIN 表2 ON 表1.列1=表2.列2
右外连接的语法为: SELECT select_list FROM 表1 RIGHT[OUTER]JOIN 表2 ON 表1.列1=表2.列2
全外连接(完整外部联接)的语法为: SELECT select_list FROM 表1 FULL[OUTER] JOIN 表2 ON 表1.列1=表2.列2
六、左向外联接
包括第一个命名表(“左”表,出现在 JOIN 子句的最左边)中的所有行。不包括右表中的不匹配行。
【例35】下面的 SQL 语句说明 titles 表和 publishers 表之间的左向外联接包括所有的书名,甚至包括那些没有出版商信息的书名: Use pubs SELECT titles.title_id, titles.title, publishers.pub_name FROM titles LEFT OUTER JOIN publishers ON titles.pub_id = publishers.pub_id
七、右向外联接
包括第二个命名表(“右”表,出现在 JOIN 子句的最右边)中的所有行。不包括左表中的不匹配行。
【例36】在 titles 和 publishers 表之间的右向外联接将包括所有的出版商,甚至包括那些在 titles 表中没有书名的出版商。
SELECT titles.title_id, titles.title, publishers.pub_name FROM titles RIGHT OUTER JOIN publishers ON titles.pub_id = publishers.pub_id
八、完整外部联接
包括所有联接表中的所有行,不论它们是否匹配。
【例37】 titles 表和 publishers 表之间的完整外部联接显示所有书名和所有出版商,甚至包括那些在另一个表中没有匹配值的书名和出版商。
SELECT titles.title_id, titles.title, publishers.pub_name FROM titles FULL OUTER JOIN publishers ON titles.pub_id = publishers.pub_id
九、交叉联接
没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
【例39】 阅读以下程序:
USE pubs
SELECT au_fname, au_lname, pub_name FROM authors CROSS JOIN publishers ORDER BY au_lname DESC
说明:结果集包含 184 行(authors 有 23 行,publishers 有 8 行;23 乘以 8 等于 184)。 不过,如果添加一个 WHERE 子句,则交叉联接的作用将同内联接一样。
full outer join 和 union all 的区别
SQL的Join语法有很多,
inner join(等值连接) 只返回两个表中联结字段相等的行,
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录,
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录,
假设我们有两张表。Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的,如下所示:
A表
id name
1 Pirate
2 Monkey
3 Ninja
4 Spaghetti
B表
id name
1 Rutabaga
2 Pirate
3 Darth Vade
4 Ninja
让我们看看不同JOIN的不同。
FULL [OUTER] JOIN
(1)
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
TableA.name = TableB.name 的情况,A和B的交集有两条数据,那么 FULL OUTER JOIN的结果集,
应该是2+2+2=6条,即上面的交集,再加剩下的四条数据,没有匹配,以null补全。
结果集
(TableA.) (TableB.)
id name id name
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vade
Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。
可以使用IFNULL判断。
(2)
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableA.id IS null OR TableB.id IS null
添加这个 where 条件,可以排除掉两表的数据交集。
结果集
(TableA.) (TableB.)
id name id name
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vade
产生A表和B表没有交集的数据集。
UNION 与 UNION ALL
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。
(1)SELECT name FROM TableA UNION SELECT name FROM TableB
新结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Darth Vade
选取不同值。
(2)SELECT name FROM TableA UNION ALL SELECT name FROM TableB
新结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Pirate
Darth Vade
Ninja
全部列出来。
希望对你有帮助~
sql语句中的full join具体是怎么回事啊?
1、Join有时为了得到完整的结果,需要从两个或更多的表中获取结果。就需要执行join数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。
2、引用两个表,可以通过引用两个表的方式,从两个表中获取数据。
3、SQL INNER JOIN 关键字,在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
4、SQL LEFT JOIN 关键字,LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
5、最后SQL RIGHT JOIN 关键字,RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。