- 浏览: 465443 次
- 性别:
- 来自: 潘多拉
文章分类
最新评论
-
lijunwyf:
代码好像不完整,后端没串起来的感觉
Json-RPC for java首次尝试 -
jerry.chen:
我用这种方式去,貌似没啥效果,楼主!
Xfire开发的webservice客户端超时问题解决 -
漫步邃思:
这个问题常遇到,老是想不起来解决方法,记住了
resin3.1.0无法解析EL表达式问题解决 -
dampce032:
在不删掉integratedSecurity=true;的情况 ...
JDBC 连接SQLServer数据库(Failed to load the sqljdbc_auth.dll) -
kill_e680:
取CPU号和取硬盘号,在linux下可以用吗?
sigar使用:在web中应用sigar取得系统信息
集合运算
集合运算
集合运算组合两个或多个部分查询的结果到一个结果中。包含集合运算的查询称为复合查询。
集合运算
集合运算组合两个或多个部分查询的结果到一个结果中。包含集合运算的查询称为复合查询。
Operator Returns UNION(联合) 由每个查询选择的所有不同的行(无重复值) UNION ALL 由每个查询选择的所有的行,包括所有重复的行 INTERSECT(交叉) 由两个查询选择的所有不同的行 MINUS 由第一个查询选择的所有不同的行 所有的集合运算与等号的优先级相同,如果SQL语句包含多个集合运算并且没有圆括号明确地指定另一个顺序,Oracle服务器将以从左到右的顺序计算。你应该使用圆括号来明确地指定带另外的集合运算的INTERSECT (相交) 运算查询中的赋值顺序。 注:在幻灯片中,图中的亮色代表查询结果。 INTERSECT (相交) 和MINUS (相减) 运算不是ANSI SQL-99兼容的,他们是Oracle特定的。 在下面要用到的表: :: EMPLOYEES: 提供所有在职雇员当前的详细资料 :: JOB_HISTORY:当一个雇员改变工作时,记录他的以前的工作的开始日期和结束日期、 departmentID和job ID的详细资料 SQL> desc employees; 名称 是否为空? 类型 ----------------------------------------- -------- ------------- EMPLOYEE_ID NOT NULL NUMBER(6) FIRST_NAME VARCHAR2(20) LAST_NAME NOT NULL VARCHAR2(25) EMAIL NOT NULL VARCHAR2(25) PHONE_NUMBER VARCHAR2(20) HIRE_DATE NOT NULL DATE JOB_ID NOT NULL VARCHAR2(10) SALARY NUMBER(8,2) COMMISSION_PCT NUMBER(2,2) MANAGER_ID NUMBER(6) DEPARTMENT_ID NUMBER(4) QL> desc job_history 名称 是否为空? 类型 ---------------------- -------- ------------- EMPLOYEE_ID NOT NULL NUMBER(6) START_DATE NOT NULL DATE END_DATE NOT NULL DATE JOB_ID NOT NULL VARCHAR2(10) DEPARTMENT_ID NUMBER(4) [b]联合运算[/b] 联合(UNION) 运算从两个查询返回除去重复值后的结果 UNION(联合)运算 UNION运算返回所有由任一查询选择的行。用UNION运算从多表返回所有行,但除去任何重复的行。 原则./././././ :: 被选择的列数和列的数据类型必须是与所有用在查询中的SELECT语句一致。列的名字不必相同。 :: 联合运算在所有被选择的列上进行。 :: 在做重复检查的时候不忽略空(NULL)值。././././ :: IN运算有比UNION运算高的优先级。 :: 在默认情况下,输出以SELECT子句的第一列的升序排序。./././././ [b]使用联合集合运算[/b] 显示当前和以前所有雇员的工作岗位。每个雇员仅显示一次 SELECT employee_id, job_id FROM employees UNION SELECT employee_id, job_id FROM job_history; 使用联合集合(UNION SET)运算 联合运算消除重复记录,如果有相同的记录同时出现在EMPLOYEES和JOB_HISTORY表中,该记录只显示一次,观察幻灯片的输出显示雇员号为200的雇员的雇员号虽然显示了两次,但每一行的JOB_ID是不同的。 考虑下面的例子: SELECT employee_id, job_id, department_id FROM employees UNION SELECT employee_id, job_id, department_id FROM job_history; EMPLOYEE_ID JOB_ID DEPARTMENT_ID 100 200 AC_ACCOUNT 90 200 AD_ASST 10 200 AD_ASST 90 ... 600 使用联合集合(UNION SET)运算 (续) 在前面的输出中,雇员200出现了3次,为什么?注意雇员200的DEPARTMENT_ID值,一行是90,另一行是10,第三行是90,因为这些job_id和department_id的唯一组合,对于每行的雇员200是唯一的,因此他们是不重复的。 观察输出以SELECT子句的第一列的升序排序,即以EMPLOYEE_ID排序。 [b]全联合运算[/b] 全联合(UNION ALL) 运算从两个查询返回包括所有重复值的结果 全联合(UNION ALL)运算 用全联合运算从多个查询中返回所有行。 原则 ./././././././././ :: 和联合不同,重复的行不被过滤,并且默认情况下输出不排序。 :: 不能使用DISTINCT关键字。 注:除了上面的两点,UNION ALL的原则与UNION相同。 [b]使用全联合运算[/b] 显示当前和以前所有雇员所在的部门 SELECT employee_id, job_id, department_id FROM employees UNION ALL SELECT employee_id, job_id, department_id FROM job_history ORDER BY employee_id; EMPLOYEE_ID JOB_ID DEPARTMENT_ID 100 200 AD_ASST 10 200 AD_ASST 90 200 AC_ACCOUNT 90 ... 600 [b] 全联合(UNION ALL)运算 (续)[/b] 在例子中,有30行被选择,两个表组合到共30行中,全联合运算不会消除重复的行,在幻灯片中重复的行被突出显示,联合返回任一查询所选择的所有不重复的行,而全联合返回任一查询所选择的所有行,包括所有重复。 现在用联合子句来写: SELECT employee_id, job_id,department_id FROM employees UNION SELECT employee_id, job_id,department_id FROM job_history ORDER BY employee_id; 上面的查询返回29行,这是因为下面的行被除去了(因为它是一个重复行): 176 SA_REP 80 [b] 相交运算 [/b] 相交(INTERSECT) 运算返回多个查询中所有相同的行 相交运算 用相交运算返回多个查询中所有的公共行。 原则 ./././.列数和数据类型 :: 在查询中被 SELECT 语句选择的列数和数据类型必须与在查询中所使用的所有的 SELTCT 语句中的 一样,但列的名字不必一样。 :: 颠倒相交的表的排序不改变结果。 :: 相交不忽略空值。 [b]使用相交运算[/b] 显示雇员表的employee_ID 和job_ID,这些雇员当前所做的工作是以前他们做过一端时间,后来有变化,现在又在做的工作。 SQL> SELECT employee_id, job_id 2 FROM employees 3 INTERSECT 4 SELECT employee_id, job_id 5 FROM job_history; EMPLOYEE_ID JOB_ID ----------- ---------- 176 SA_REP 200 AD_ASST 相交运算 (续) 在幻灯片的例子中,查询仅返回在两个表的被选择的列中有相同值的记录。 如果你从EMPLOYEES表添加DEPARTMENT_ID列到SELECT语句中,并且从JOB_HISTORY表添加DEPARTMENT_ID列到SELECT语句中,然后运行该查询,将返回什么?其结果可能是不同的,因为在加入的另一个列中,其值可能是重复的,也可能不重复。 例子 SELECT employee_id, job_id, department_id FROM employees INTERSECT SELECT employee_id, job_id, department_id FROM job_history; EMPLOYEE_ID JOB_ID DEPARTMENT_ID ----------- ---------- ------------- 176 SA_REP 80 雇员200不再是结果的一部分,因为EMPLOYEES.DEPARTMENT_ID值不同于 JOB_HISTORY.DEPARTMENT_ID值。 [b]相减运算 [/b] 相减(MINUS) 运算返回在第一个查询中而不在第二个查询中的行 相减运算 用相减运算返回由第一个查询返回的行,那些行不出现在第二个查询中 (第一个SELECT语句减第二个SELECT语句)。 原则 ./././././././ :: 在查询中被SELECT语句选择的列数和数据类型必须与在查询中所使用的所有的SELTCT语句中的一样 ,但列的名字不必一样。 :: 对于MINUS运算,在WHERE子句中所有的列都必须在SELECT子句中。 相减运算 显示那些从来没有改变过他们的工作的雇员显示那些从来没有改变过他们的工作的雇员ID SELECT employee_id,job_id FROM employees MINUS SELECT employee_id,job_id FROM job_history; //由存在于EMPLOYEES表中但不存在于JOB_HISTORY表中的行所表示(结果只是employees表的减少,没有第二个表的记录.) 相减运算 (续) 上述例子中,JOB_HISTORY表的employee_id列和job_id列被从EMPLOYEES表的那些列中减去。结果集显示相减后剩余的雇员,他们由存在于EMPLOYEES表中但不存在于JOB_HISTORY表中的行所表示。这些行是那些从未改变过工作的雇员的记录 雇员200未出现,因为他换过工作。(即,在第一个,第二个表中都出现了) [b]集合运算的原则[/b] /././././././ :: 在两个SELECT列表中的表达式必须在数目上和数据类型上相匹配 :: 可以用圆括号改变执行的顺序 :: ORDER BY子句: /./././././ –只能出现在语句的最后 –从第一个SELECT语句接收列名、别名,或者位置记号 集合运算的原则 :: 在两个查询的选择列表中的表达式在数目上和数据类型上必须匹配。使用UNION、UNION ALL、INTERSECT和MINUS SET运算的查询,在它们的WHERE子句中必须有与它们的SELECT列表相同的列数和列数据类型。 例如: SELECT employee_id, department_id FROM employees WHERE (employee_id, department_id) IN (SELECT employee_id, department_id FROM employees UNION SELECT employee_id, department_id FROM job_history ); :: ORDER BY子句: - 只可以出现在每个语句的末尾 - 将接受列、别名或位置记号 :: 列名或别名,如果用在ORDER BY子句中,必须来自第一个SELECT列表。 :: 集合运算可以用在子查询中。 [b]Oracle 服务器和集合运算[/b] :: 除了UNION ALL,重复行自动被清除 :: 在结果中的列名是第一个查询中出现的列名 /./././ :: 除了UNION ALL(无排序),默认情况下按升序顺序输出 /././ Oracle服务器和集合运算 当一个查询使用集合运算时,除了UNION ALL运算,Oracle服务器会自动消除重复的行。输出中的列名由第一个SELECT语句的列表确定。默认情况下,输出以SELECT子句的第一列的升序排序。 在一个复合查询的各查询组成部分的选择列表中相应的表达式必须在数目和类型上匹配。如果查询的组成部分选择字符数据,返回值的数据类型被如下决定: :: 如果查询选择的数据类型的值为CHAR,那么,返回值的数据类型也为CHAR。 :: 如果查询选择的两者之一或两者的数据类型值为VARCHAR2,那么,返回值的数据类型也是VARCHAR2。 你可能需要提及,输出以第一个SELECT子句的第一列的升序被排序,然后是第二列,等等。 匹配SELECT语句 //凑数 使用UNION运算,显示所有雇员的department ID、location、和受雇日期 SELECT department_id, TO_NUMBER(null) location, hire_date FROM employees UNION SELECT department_id, location_id, TO_DATE(null) FROM departments; DEPARTMENT_ID LOCATION HIRE_DATE ------------- ---------- ---------- 80 21-4月 -00 90 1700 90 17-6月 -87 90 21-9月 -89 90 13-1月 -93 100 1700 100 16-8月 -94 100 17-8月 -94 100 28-9月 -97 100 30-9月 -97 100 07-3月 -98 匹配SELECT语句 由于在两个查询的SELECT列表中的表达式必须在数量上匹配,你可以使用虚拟列和转换函数数据类型来满足该规则。在幻灯片中使用了虚拟列,在第一个查询中的TO_NUMBER函数被用以匹配第二个查询中返回的LOCATION_ID列的数字数据类型,同样地,第二个查询中的TO_DATE函数被用于匹配 第一个查询返回的日期数据类型。 [b]匹配SELECT语句[/b] :: 使用UNION运算,显示所有雇员的employee ID、job ID 和salary SELECT employee_id, job_id,salary FROM employees UNION SELECT employee_id, job_id,0 FROM job_history; EMPLOYEE_ID JOB_ID SALARY ----------- ---------- ---------- 192 SH_CLERK 4000 193 SH_CLERK 3900 194 SH_CLERK 3200 195 SH_CLERK 2800 196 SH_CLERK 3100 197 SH_CLERK 3000 198 SH_CLERK 2600 199 SH_CLERK 2600 200 AC_ACCOUNT 0 200 AD_ASST 0 200 AD_ASST 4400 匹配SELECT语句:例 EMPLOYEES和JOB_HISTORY表中有一些列是公有的;例如,EMPLOYEE_ID, JOB_ID和DEPARTMENT_ID,但如果你想要用UNION运算查询他们以显示EMPLOYEE_ID、JOB_ID和SALARY时,知道薪水仅存在于EMPLOYEES表中吗? 在幻灯片中的代码例子匹配EMPLOYEES表和JOB_HISTORY表中的EMPLOYEE_ID和JOB_ID列。一个0值被添加到JOB_HISTORY的SELECT语句中以匹配在EMPLOYEES的SELECT语句中的数字的SALARY列。 在前面的结果中,在输出中的每一行相对应于JOB_HISTORY表的一条记录,包括SALARY列值为0的列。 [b]控制行顺序[/b] 用两个UNION运算产生一个英语句子 COLUMN a_dummy NOPRINT SELECT 'sing' AS "My dream", 3 a_dummy FROM dual UNION SELECT 'I''d like to teach', 1 FROM dual UNION SELECT 'the world to', 2 FROM dual ORDER BY 2; ORDER BY 只能用列、别名或第一个查询的列位置。 控制行顺序 在默认情况下,输出以第一列的升序排序,你可以用ORDER BY子句来改变顺序。 使用ORDER BY来改变行的顺序 ORDER BY子句在复合查询中只能用一次。如果使用了,ORDER BY子句必须放在最后面的查询中。ORDER BY子句接受列名、别名或位置记号。如果没有ORDER BY子句,幻灯片中的代码例子将按第一列的字母顺序产生下面的输出: My dream i'd like to teach sing the world to /././././ 注:考虑一个多次使用UNION SET运算的复合查询,在这种情况下,ORDER BY子句中只能用位置而不能显式表示。在幻灯片的例子中3个SELECT列表的第二个位置分别是3、1、2。另外,因为输出按照第一个SELECT列表,所以别名My dream定义在第一行;指示第二列不输出的a_dummy也在第一列。
发表评论
-
ORACLE函数 非著名函数之单值函数
2011-07-13 18:23 1318注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数 ... -
ORACLE 著名函数之单值函数
2011-07-13 18:22 1055注:N表示数字型,C表 ... -
Oracle9i 对 DML 和 DDL 语句的扩展
2011-07-13 18:16 21INSERT 语句回顾 用 INSERT 语句添加新行 ... -
ORACLE 高级子查询
2011-07-13 18:15 10351:: 写多列子查询 :: 在返回空值时描述并解释子查询的行为 ... -
ORACLE 分组和时间函数
2011-07-13 18:13 2620使用下面的日期时间函数: -TZ_OFFSET -CUR ... -
ORACLE 权限和角色
2011-07-13 18:09 1764控制用户访问 在多 ... -
ORACLE 约束&&视图
2011-07-13 18:05 1571什么是约束? :: 约束强制规则在表级 :: 如果有从属关系, ... -
ORACLE 操作和管理表
2011-07-13 18:04 1407数据库对象: :: Table:存储数据 :: View: ... -
ORACLE 操纵数据&&锁&&事务
2011-07-13 18:03 2017INSERT语句语法 使用INSERT语句添加新行到表中 ... -
ORACLE 表连接总结
2011-07-13 17:59 2227多表连接 使用一个连接从多个表中查询数据 SELECT ta ... -
ORACLE 单行函数和分组统计总结Top-N
2011-07-13 17:58 5587alter session set nls_date_lang ...
相关推荐
### Oracle位运算详解 #### 一、概述 在Oracle数据库中,位运算提供了一种高效的方式来处理二进制数据。位运算通常应用于整数类型的数据,通过对这些整数的二进制表示进行操作来实现特定的功能。本文将详细介绍...
本资源涵盖知识(包括使用案例):Oracle集合运算,交集、并集、补集、差集. 集合运算就是将多个结果集组合成一个结果集。
在Oracle数据库中,表达式是用于计算或比较值的组合,它们可以由常量、变量、函数、操作符以及子查询组成。Oracle SQL中的表达式主要用于SELECT、INSERT、UPDATE和DELETE语句,以定义列的值、筛选行或计算新值。在本...
### 离散制造业的MRP运算执行代码详解(ORACLE存储过程) #### 一、概述 在离散制造业中,物料需求计划(Material Requirements Planning, MRP)是生产管理的重要组成部分,它通过精确计算物料需求量及时间来指导...
Oracle数据库的SQL开发教程中,第08章主要讲解了集合运算,这是SQL查询中的一个重要概念,用于合并来自多个查询的结果集。集合运算包括联合(UNION)、完全联合(UNION ALL)、相交(INTERSECT)和相减(MINUS)四种...
### Oracle 查询相邻上下行值 #### 背景与需求 在处理时间序列数据或具有某种排序的数据时,经常需要查询某一行记录与其相邻行(前一行或后一行)的数据。这种需求在财务分析、时间序列分析等领域非常常见。例如,...
在oracle中利用函数实现计算公式解析|在oracle中利用函数实现计算公式解析
临时表空间主要用途是在数据库进行排序运算、管理索引、访问视图等操作时提供临时的运算空间。当 oracle 里需要用到 sort 的时候,而 pga 又没有足够大的时候,将会把数据放入临时表空间里进行排序。如果有异常情况...
2. 超过400个空间运算函数,如质心计算和空间聚合。 3. GeoRaster数据类型,原生支持地理参照栅格图像。 4. 支持多种文件格式的导入导出,以及元数据和数据类型。 5. 网络(图形)数据模型,用于存储和分析大型空间...
Oracle数据库是世界上最广泛使用的数据库系统之一,其强大的功能和高效的数据管理能力深受企业青睐。在Oracle数据库中,存储过程和函数是重要的编程元素,用于执行复杂的数据库操作和业务逻辑。本篇文章将深入探讨这...
在掌握了基础查询后,可以深入学习子查询、联接(INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN)、集合运算(UNION, INTERSECT, EXCEPT)以及窗口函数(ROW_NUMBER, RANK, DENSE_RANK)等,这些功能使得SQL在数据...
- **Oracle**: 可以直接对日期列进行加减运算,如`datecolumn +/- value`,也可以使用`ADD_MONTHS`函数。 - **SQL Server**: 使用`DATEADD`函数进行日期加减运算。 3. **获取日期部分** - **Oracle**: 使用`TO_...
除了基本的数据存储之外,Oracle Spatial还提供了丰富的函数和操作符,可以用于执行空间数据之间的各种运算,如距离计算、空间关系判断等。这些操作使得开发者可以在SQL语句中直接处理空间数据,而无需编写额外的...
Oracle数据库学习总结资料.pdf 是一份关于 Oracle 数据库的学习总结资料,涵盖了 Oracle 数据库的各个方面,包括 Oracle 的简介、简单查询、标量函数和算数运算、多表查询、列函数和分组、子查询、表的更新操作、表...
其中`string`是要进行哈希运算的原始字符串。这个函数会返回一个32位的16进制字符串,表示原始数据经过MD5算法处理后的哈希值。由于MD5是单向的,即从原始数据计算出哈希值容易,但从哈希值反推出原始数据非常困难,...
4. **实时数据转换和数据运算**:允许在数据流动过程中进行转换,以适应不同的目标系统和分析需求。 5. **事件流分析**:结合Oracle Streaming Analytics,能够处理大规模实时信息,利用复杂的关联模式和机器学习...
Oracle 函数大全(字符串函数,数学函数,日期函数,逻辑运算函数,其他函数)
【Oracle Spatial空间数据库】是Oracle数据库的一个重要组件,专门用于处理和分析空间数据。它提供了一整套功能,包括空间信息的存储、访问和高级分析,使得用户能够进行复杂的空间查询和空间操作。 1. **Oracle ...
通常,你需要一个支持64位运算的Linux发行版,例如Red Hat Enterprise Linux或Ubuntu。同时,确保系统已更新至最新补丁,并安装了必要的依赖库,如gcc、make、libaio、compat-libstdc++-33等。 2. **下载与解压**:...