内外连接union
来源:互联网 发布:达索有eea软件吗 编辑:程序博客网 时间:2024/04/30 06:18
QL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
下面的例子中使用的原始表:
Employees_China:
Employees_USA:
使用 UNION 命令
实例
列出所有在中国和美国的不同的雇员名:
SELECT E_Name FROM Employees_ChinaUNION
SELECT E_Name FROM Employees_USA
结果
注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。
UNION ALL
UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。
SQL Statement 1
UNION ALL
SQL Statement 2
使用 UNION ALL 命令
实例:
列出在中国和美国的所有的雇员:
SELECT E_Name FROM Employees_ChinaUNION ALL
SELECT E_Name FROM Employees_USA
结果
Gates, Bill
SQL语句的并集UNION,交集JOIN(内连接,外连接),交叉连接(CROSS JOIN笛卡尔积),差集(NOT IN)
1.
a. 并集UNION SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2
b. 交集JOIN SELECT * FROM table1 AS a JOIN table2 b ON a.name=b.name
c. 差集NOT IN SELECT * FROM table1 WHERE name NOT IN(SELECT name FROM table2)
d. 笛卡尔积 SELECT * FROM table1 CROSS JOIN table2 与 SELECT * FROM table1,table2相同
2.
SQL中的UNION 与UNION ALL的区别是,前者会去除重复的条目,后者会仍旧保留。
a. UNION SQL Statement1 UNION SQL Statement2
b. UNION ALL SQL Statement1 UNION ALL SQL Statement2
3.
SQL中的各种JOIN SQL中的连接可以分为内连接,外连接,以及交叉连接(即是笛卡尔积)
a. 交叉连接CROSS JOIN 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积; 举例 SELECT * FROM table1 CROSS JOIN table2 等同于 SELECT * FROM table1,table2 一般不建议使用该方法,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。 因此,如果两个需要求交际的表太大,将会非常非常慢,不建议使用。
b. 内连接INNER JOIN 如果仅仅使用 SELECT * FROM table1 INNER JOIN table2 没有指定连接条件的话,和交叉连接的结果一样。 但是通常情况下,使用INNER JOIN需要指定连接条件。 -- 等值连接(=号应用于连接条件, 不会去除重复的列) SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column -- 不等连接(>,>=,<,<=,!>,!<,<>) 例如 SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column<>b.column -- 自然连接(会去除重复的列)
c. 外连接OUTER JOIN 首先内连接和外连接的不同之处: 内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。 指定条件的内连接,仅仅返回符合连接条件的条目。外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表(右连接时)或者两边连接(全外连接时)的所有数据行。 1)左外连接LEFT [OUTER] JOIN 显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL 例如 SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column 2)右外连接RIGHT [OUTER] JOIN 显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL 例如 SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column 3)全外连接显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL
对于SQL中的连接操作在实现业务需求的时候比较方便和高效,这里针对“全外连接”展示一下在Oracle中的几种写法。
每种写法因人而异,以满足需求为目的。
有关内连接,左连接和右连接的简单演示请参考:《【实验】内连接,左连接,右连接,全外连接》http://space.itpub.net/519536/viewspace-563019
1.创建实验表并初始化实验数据
SQL> create table a (a number(1),b number(1),c number(1));
SQL> create table b (a number(1),d number(1),e number(1));
SQL> insert into a values(1,1,1);
SQL> insert into a values(2,2,2);
SQL> insert into a values(3,3,3);
SQL> insert into b values(1,4,4);
SQL> insert into b values(2,5,5);
SQL> insert into b values(4,6,6);
SQL> commit;
2.查看一下初始化数据内容
sec@ora10g> select * from a;
A B C
---------- ---------- ----------
1 1 1
2 2 2
3 3 3
sec@ora10g> select * from b;
A D E
---------- ---------- ----------
1 4 4
2 5 5
4 6 6
3.第一种写法,这也是标准SQL的写法。功能明确,不过理解有点小障碍。
sec@ora10g> select * from a full outer join b on a.a = b.a;
A B C A D E
---------- ---------- ---------- ---------- ---------- ----------
1 1 1 1 4 4
2 2 2 2 5 5
3 3 3
4 6 6
4.第二种写法
思路:“a到b的全外连接”=“a到b的内连接” + “b到a的反连接” + “a到b的反连接”。
sec@ora10g> select *
2 from a, b
3 where a.a = b.a
4 union all
5 select *
6 from a, b
7 where a.a(+) = b.a
8 and a.a is null
9 union all
10 select *
11 from a, b
12 where a.a = b.a(+)
13 and b.a is null
14 /
A B C A D E
---------- ---------- ---------- ---------- ---------- ----------
1 1 1 1 4 4
2 2 2 2 5 5
4 6 6
3 3 3
5.第三种写法
思路:“a到b的全外连接”=“b到a的外部连接” + “a到b的反连接”。
sec@ora10g> select *
2 from a, b
3 where a.a(+) = b.a
4 union all
5 select *
6 from a, b
7 where a.a = b.a(+)
8 and b.a is null
9 /
A B C A D E
---------- ---------- ---------- ---------- ---------- ----------
1 1 1 1 4 4
2 2 2 2 5 5
4 6 6
3 3 3
6.小结
注意,改写方法中的“union all”也可以修改为“union”,之所以上面改写方法中我们使用union all,原因是出于性能方便的考虑,union all的执行效率远大于union操作。
这里展示的是一种转换思路,可一看了之。
-- The End --
- 内外连接union
- 内外连接
- 内外连接
- 内外连接
- 内外连接
- 内外连接
- 内外连接
- SQL 内外连接
- SQL 中的内外连接
- SQL 内外连接
- 数据库左右内外连接
- DB2sql中的内外连接
- Oracle的内外连接
- 数据库查询内外连接
- sql之内外连接
- 内外连接inner outer
- sql内外连接总结
- 内外网连接
- struts actionform date beanutils
- Linux下删除并重建Oracle实例
- Java编程的常见问题
- Drawable、Bitmap、Canvas和Paint的关系以及部分使用方法
- ORACLE用户连接的管理
- 内外连接union
- RPC和Socket的区别
- vi的查找功能
- ACE在VC中的配置攻略
- Asp.net 2.0 中将网站首页生成静态页的一个比较好的方法
- probe 调用流程
- 各种排序算法C++源代码
- Oracle物化视图简介及实战
- Domino邮件服务器防垃圾邮件中转(转)