oracle union详解,Oracle中的union和join
有时候,我们需要把很多表的查询结果给合并在一起显示或者导出,有时候呢我们又需要几张表联合一些条件进行查询,所以我们常会用到join和union语句。
官方说明
包含UNION [ALL], INTERSECT, MINUS三个操作符,具有相同的优先级(可以用(...)进行改变优先级),含有多个的时候,自左至右进行计算。
在每个组成UNION查询的子查询中,其select list(选择列表)必须具有相同的数量和数据组类型。
如果子查询选择的是字符数据,其返回值的数据类型由下决定:所有的子查询选择的char值具有相同的length,返回值就是char(length)。如果查询的值类型分别是char(length1), char(length2)...,其返回值是varchar2(max(length1,length2,...))
如果子查询选择的值都是varchar2,那么返回值就是varchar2。
对于选择的是数值数据:
任何一个查询选择的值是binary_double,其返回值就是binary_double。
任何一个查询选择的值是binary_float,其返回值就是binary_float。
所有查询选择的值是number,其返回值才是number。
使用这几个集操作符的时候,Oracle不会进行隐含的数据类型组之间的转换。所以,如果查询包含number和char类型的话,Oracle返回一个错误。
比如:select '3' from dual
intersect
select 3f from dual;
会返回一个错误。但:select 3 from dual
intersect
select 3f from dual;
则会被在类型组内隐含进行转换成:select to_binary_float(3) from dual
intersect
select 3f from dual;
限制
集操作符服从以下限制:对列类型为BLOB, CLOB, BFILE, VARRAY或者嵌套表无效。
UNION, INTERSECT, MINUS对LONG列无效。
在集操作符前的选择列表包含表达式的话,那么必须得对列设置别名以便后面在order by clause内使用。
不能用for_update_clause共用
在这些操作符的子查询内不能使用order_by_clause
You cannot use these operators in SELECT statements containing TABLE collection expressions.
Example查询中to_char(null)用在当表中没有某列的时候来匹配数据类型。SELECT location_id, department_name "Department",
TO_CHAR(NULL) "Warehouse" FROM departments
UNION
SELECT location_id, TO_CHAR(NULL) "Department", warehouse_name
FROM warehouses;
union操作符联合结果中不重复的结果,union all联合所有的结果。SELECT product_id FROM order_items
UNION
SELECT product_id FROM inventories;
SELECT location_id FROM locations
UNION ALL
SELECT location_id FROM departments;
INTERSECT相交操作符联合子查询中都有的行。SELECT product_id FROM inventories
INTERSECT
SELECT product_id FROM order_items;
MINUS相减操作符联合第一个查询的行并且没有在第二个查询中出现的行(同时会去重)。SELECT product_id FROM inventories
MINUS
SELECT product_id FROM order_items;
JOIN
官方说明
JOIN用来从两或多个表、视图、物化视图中结合数据。在FROM后面的表都会进行一个JOIN操作,这样我们就可以用SELECT语句查询这个JOIN中的任意列。当然,如果这些表中有相同名的列,就要用tbl.col这样的形式来来完整引用列了。
Join Conditions
大多数join查询有一个Join Condition,可能出现在FROM或WHERE语句中,其会比较从不同表中的两列。对Join Contidion为TRUE的行,就把两个表中那一行组合成一行。需要注意的是不能出现在select list中。
对与join三个或以上的表,Oracle首先Join根据Join ConditionJoin前两个表,然后再把表这个结果和新表根据Join Conditon进行Join,直到把所有表都Join完。Oracle的Optimizer了决定Join的顺序。
Equijoins
一个equijoin就是Join Condition包含一个等号,对指定的列具有相等的值的行进行Join。
Self Joins
表本身进行Join。在FROM后出现两次,并且跟随别名。
Cartesian Products(笛卡尔乘积)
如果一个Join查询不包含Join Conditon,那么Oracle返回的就是一个他们的Cartesian product。这个结果一般没有什么用,所以Join的时候最后都指定Join Conditon。
Inner Joins(simple join)
只Join满足的行。
Outer Joins
Outer Join扩展了simple join的结果。一个outer join返回所有满足Join Conditon的行,同时从一个不满足条件的表返回一些或所有行。
LEFT [outer] JOIN
想要Join表 A,B,同时返回A的所有行。在FROM后面使用left [outer] join语句,或者在WHERE语句中的Join Conditon对B的所有列使用outer join operator(+)。对A在B中没有匹配行,在B的列中就会返回NULL。
举个例子
有一个属地代码表md_area(areano, name)。
有一个用户表users(mdn,areano,….)。
我现在要统计users表中各属地的用户数,还要根据代码显示出属地名称,以便更加直观的进行统计。select area, areaname, ct from
(select areano as area, count(*) as ct from users group by areano) t1
left join
(select areano, name as areaname from md_area t2) on t2.areano = t1.area;
Right [outer] Join
接上例,其等于:select area, areaname, ct from
(select areano, name as areaname from md_area t2)
right join
(select areano as area, count(*) as ct from users group by areano) t1
on t2.areano = t1.area;
Antijoins (反连接)
Semijoins (半连接)
oracle union详解,Oracle中的union和join相关推荐
- oracle scur,详解Oracle游标的简易用法
下面看下Oracle游标的简易用法,具体代码如下所示: create or replace procedure NW_DelYW(iOPERATION_ID number, sUserID varch ...
- oracle union详解,oracle union用法 oracle中union的用法
oracle中union的用法 只知道是用来左联接的,还有类似union all,谁有这个例子,要解释详细一点的一生中要有两次冲动,一次奋不顾身的爱情,一次为说走就走的旅行. UNION 指令的目的是 ...
- oracle dataguard详解,Oracle 19c 新特性详解:DataGuard 中ADG的自动DML重定向
Oracle 19c 新特性详解:DataGuard 中ADG的自动DML重定向 在前面的文章<Oracle 19c 十大新特性一览>中,我们曾经提到 Oracle 19c的一个重要增强, ...
- 【ORACLE】详解oracle数据库UTL_RAW包各个函数的模拟算法
前言 这篇文章可能是你至今(2022-02-11)能在互联网看到的,关于utl_raw包的逻辑说得最深入的一篇文章了. 由于最近在复刻oracle中自带的包到其他数据库,因此需要对oracle中的包的 ...
- mysql union详解_MySQL 联合查询union详解-Fun言
一.UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行. UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须 ...
- oracle union详解,oracle union 及union all用法及差异
oracle union 及union all用法及区别 union 用法 union指令的目的是将两个sql语句的结果合并起来,可以查看你要的查询结果. 使用uniton需要满足的条件. 1 所有查 ...
- oracle recyclebin详解,oracle recyclebin详解
今天在SOA应用数据库上运用DBMS_REDEFITION包进行在线非分区表转换分区表操作时,本想DROP掉建的临时表cube_scope_temp不小心后面忘记加"temp"直接 ...
- oracle dataguard详解,Oracle DataGuard数据备份方案详解
Oracle DataGuard是一种数据库级别的HA方案,最主要功能是冗灾.数据保护.故障恢复等. 在生产数据库的"事务一致性"时,使用生产库的物理全备份(或物理COPY)创建备 ...
- oracle sum详解,oracle sum()聚合函数
原文链接:https://blog.csdn.net/cizatu5130/article/details/100291347 oracle sum()聚合函数 2016-05-13 20:08:00 ...
最新文章
- MSSQL Server 导入/导出到远程服务器
- 陈松松:如何锁定细分领域,视频营销才更容易持续做下去
- P3810 【模板】三维偏序(陌上花开)
- windows 下 安装mysql 出现 “ ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password
- linux mysql 共享存储空间_Linux UDEV和为MySQL InnoDB共享表空间配置裸设备
- 8 stark组件 展示数据
- 冬日圣诞节海报还没灵感?看这里!
- 百一测评c语言两个数求和程序,2017计算机二级C语言考前测试题与答案
- mysql binlog解析 c_解析MYSQL BINLOG二进制格式(9)--infobin解析binlog帮助文档
- CodeForces 689E (离散化+逆元+组合)
- RISC-V 能打 50 年!不必期待 RISC-VI —— 对话 RISC-V CTO Mark Himelstein
- enclosing type java_Java ResolvedJavaType.getEnclosingType方法代码示例
- 大话数据结构 - 串
- 高一物理必修第二册公式整理
- Vagrant设置局域网访问
- Java: Unresolved compilation problem的解决方法
- SCI论文写作的学习与总结
- 宝塔BT面板专业版(付费)和免费版有什么区别?
- css单位vw vh,css3自适应布局单位vw,vh详解
- pol点获取及火星坐标系转换