七月网

oracle交集(oracle交集查询)

七月网3760

一、oracle中INTERSECT,MINUS用法

intersect就是交集,minus就是差集。

oracle交集(oracle交集查询)

1、分别创建两张表,TEST_A及TEST_B;

3、编写INTERSECT语句,select* from TEST_A t INTERSECT select* from TEST_B t;可以发现只有交集结果1、2;

4、编写MINUS语句,select* from TEST_A t MINUS select* from TEST_B t;可以发现只有差集结果3;

1、交集就是两个结果集中都有的元素。假设有两个数集A和B,A包含1、2、3,B包含1、2,这两个数集都有1、2,那么A和B交在一起的部分1、2,就是A和B的交集。

2、差集就是A中存在,但是B中不存在的数据集。假设有两个数集A和B,A包含1、2、3,B包含1、2,这两个数集差集就是1。

二、Oracle之查询详解

查询是数据的一个重要操作。用户发送查询请求,经编译软件变异成二进制文件供服务器查询,后返回查询结果集给用户,查询会产生一个虚拟表,看到的是表形式显示的结果,但结果并不真正的存储,每次执行查询只是从数据表中提取数据,并按照表的形式显示出来。

[WHERE<查询条件表达式>]

[HAVING<分组查询表达式>]

[ORDER BY<排序的列名>[ASC或DESC]]

group by用于对查询的结果分组统计,通过对group by后面的名字进行分组后输出结果。

group by后面还可以跟多列表示多列分组,在多列分组时放前面的优先分组。

having子句用于限制分组显示结果,其只能和group by一起连用。在where中没有办法直接使用聚合函数,即sum avg等无法使用,所以引用了having,在having中可以使用这些函数。

order by表示排序,后跟列名和排序方式。如果什么都不加默认为升序。ASC表示升序,DESC表示降序。

前面的为主要排序,后面的为次一级排序。

注:碰到自己与自己比较的情况下,不能用having,可以创建一个新列。

注:如果select语句同时包含group by,having,order by,按group by,having,order by排序

分组和聚合一起使用,目的是为了统计信息。

where是为了from服务的,只能跟真实的字段,用来筛选from子句中指定的操作所产生的行

group by用来分组where子句的输出

having用来从分组的结果中筛选行

order by用来对筛选的结果进行排序

(1)分组函数:max min avg sum count

max表示该列的最大值,min表示该列的最小值,avg表示该列的平均值,sum表示该列的和,count表示该列的行数。

注:分组函数(max、min、avg、count、sum)只能出现在选择列表中having子句、order by子句、不能出现在where子句和group by子句中。

多表查询是指两个和两个以上的表或者是视图的查询,在实际应用中,当查询单个表不能满足需求时,一般使用多表查询。如:显示sales部门位置和其员工的姓名,这种情况下需要使用到(dept表和emp表)。

多表查询的连接一般可以分为:内连接、左外连接、右外连接、全连接。

注:在使用多表查询的时候每个表可以设置别名,如果表指定了别名,那么语句中所有语句必须使用别名,而不能再使用实际表名。且在写属性的时候如果属性为其中一个表特有的属性则不需要写别名,如果是两个表都有则必须指定是哪一个表的哪个属性格式为:表名.属性名。

select列名 from表1别名,表2别名...

注:e是emp的别名,d是dept的别名。

但如果对表进行了操作则需要设置别名,如:查询每个部门中工资高于该部门平均工资的员工人数。在其中有一个avg表,这个表必须设置别名(提醒:如果仅有一个被修改的表,则可以不设置别名,但如果有多个表则必须设置别名)。

内连接通过使用比较运算符来使每个表的通用列中的值匹配来组成一个新表,即:把两个表中间共有的那些行拿出来进行连接,如果某些行不是两个表共有的,则不进行连接。

左外连接与内连接的区别是:设置左外连接的时候设置了主表和附表,主表在前,附表在后。内连接是将两个表匹配的地方输出出来,而左外连接则是主表全写,附表一一对应,附表有则加上,没有不写。

右外连接和左外连接基本相同只是右外连接的主表写在后边。

全连接是在等值连接的基础上将左表和右表的未匹配数据都加上,使用的关键字为full outer join或者full join。

还有一种特殊情况即自连接,在Oracle中一个表无法与自己进行比较,所以当需要自己表的两个信息做比较的时候也需要使用连接来连接,即同一张表的连结查询。

子查询是指嵌套在其他sql语句中的select语句,也叫嵌套查询。sql语句执行顺序为从右到左执行,所以在执行查询时会先执行左侧的子查询后进行主查询。

子查询分为单行子查询和多行子查询,单行子查询是指返回一行数据的子查询语句,多行子查询是指返回多行数据的查询语句。子查询还可以分为多列子查询、多行子查询、多列多行子查询。

在进行子查询时如果内部查询不返回任何记录,则外部条件中字段DEPTNO与NULL比较永远为假,也就是说外部查询不返回任何结果。

单行子查询是指子查询只返回单列、单行数据

多行子查询是指返回单列多行数据,都是针对单列而言的

多列子查询则是指查询返回多个列数据的子查询语句

where(job,deptno)=(select job,deptno from emp where ename='KING')

where(job,deptno) in(select job,deptno from emp where ename='KING')

在单行子查询的外部查询中可以使用=、>、<、>=、<=、<>等比较运算符。

内部查询返回的结果必须与外部查询条件中字段(DEPTNO)相匹配。

在WHERE子句中使用多行子查询时,可以使用多行比较运算符(IN,ALL,ANY)。

ALL:和子查询返回的所有值比较。例如:sal>ALL(1,2,3)等价于sal>3,即大于所有。

ANY:和子查询返回的任意一个值比较。例如:sal>ANY(1,2,3)等价于sal>1,即大于任意一个就可以。

注:ANY运算符必须与单行比较运算符结合使用,并且返回行只要匹配子查询的任何一个结果即可。

多列子查询和多行子查询相同,只是使用多列子查询的时候会有多列进行匹配。

为了合并多个select语句的结果,可以使用集合操作符号union,union all,intersect,minus。

union:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行

union all:该操作与union相似,但是它不会取消重复行,而且不会排序

intersect:使用该操作符用于取得两个结果集的交集

minus:使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据

总结为集合运算就是将两个或者多个结果集组合成一个结果集。

intersect 交集返回两个查询共有的记录

union all 并集返回各个查询的所有记录,包括重复的记录

union   交集返回各个查询的所有记录,不包括重复的记录

MINUS 补集返回第一个查询检查出的记录减去第二个查询检索出来的记录之后剩余的记录

注意:当使用集合操作的时候,查询所返回的列数以及列的类型必须匹配,列名可以不同。

在Oracle中,可能出现若干相同的情况,那么可以用Distinct消除重复行

(2)多表查询与单行子查询可以实现相同的功能

查询出销售部(sales)下面的员工姓名,工作,工资

(3)显示高于自己部门平均工资的员工信息

select deptno,avg(sal) from emp group by deptno;

select ename,sal,deptno from emp;

3.把两个结果集使用多表连接组合组合起来

select* from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno;

4.去掉低于平均工资的那些数据即可:

select* from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno and sal>avgsal;

字段       类型               描述

empno     NUMBER(4)        表示雇员编号,是唯一编号

ename     VAECHAR2(10)     表示雇员姓名

job        VARCHAR2(9)      表示工作职位

mgr       NUMBER(4)        表示一个雇员的领导编号

hiredate    DATE              表示雇佣日期

sal        NUMBER(7,2)       表示月薪,工资

comm     NUMBER(7,2)       表示奖金,或者称为佣金

deptno     NUMBER(2)        部门编号

三、oracle 里面的intersect 是什么意思

INTERSECT的意思是对两个 SQL语句所产生的结果做处理的。是求两个结果的交集。

语法如下:SELECT PERSON_NAME FROM PERSON WHERE ROWNUM<=5 INTERSECT SELECT PERSON_NAME FROM PERSON WHERE ROWNUM<=8。

1、所有查询中的列数和列的顺序必须相同。

2、比较的两个查询结果集中的列数据类型可以不同但必须兼容。

3、比较的两个查询结果集中不能包含不可比较的数据类型(xml、text、ntext、image或非二进制 CLR用户定义类型)的列。

4、返回的结果集的列名与操作数左侧的查询返回的列名相同。ORDER BY子句中的列名或别名必须引用左侧查询返回的列名。

5、不能与 COMPUTE和 COMPUTE BY子句一起使用。

6、通过比较行来确定非重复值时,两个 NULL值被视为相等。

参考资料来源:百度百科-Oracle数据库

好了,文章到此结束,希望可以帮助到大家。