Oracle-27-集合操作(交集、并集、差集)&子查询之单行子查询

一、集合操作

1.UNION:并集运算。

语法结构:

SQL>select
表1的列1, 表1的列2 from 表1 union select表2的列1, 表2的列2 from表2;

其中表1的列1和表1的列2是来自于表1的两列,表2的列1和表2的列2是来自于表2的两列,需要注意的是,如果union前面是n列,那么后面也必须是n列,即union前后列数必须相同。而且查询结果的列名是按照union前面n列的名称命名(如例1)。

2.INTERSECT:交集运算。

语法结构:

SQL>select empno, enmaefromemp
intersect select empno, ename from empwhere sal > 1500;

intersect前面是对emp表全查,后面是对emp表有选择的查询,那么前后取交集就是筛选出emp表满足sal>1500条件的员工信息。

3.MINUS:找出两个给定集合之间的差异。

语法结构:

SQL>selecte mpno, ename from emp minus select empno,ename from emp where sal > 1500;

即去掉相同的部分。

例1:练习集合运算union。

解:当前student表数据:

当前course表数据:

将sno, sname,cno, cname取并集:

如果union前后列数不一样,会报错:

例2:练习交集运算intersect。

解:先查看student表和course表:

取两者交集:

因为没有交集,所以显示“未选定行”。

例3:继续交集运算intersect。

解:

intersect前面是对student表全查,后面是查出sno>’s005’的数据,那么前后取交集,结果如上图所示。

如果这时候对于student表和sc表取交集:

其中sc表数据:

交集运算没结果,是因为intersect前面列名和后面列名要相同,本例中前面sno和sname,后面sno和cno,不一样,所以交集无结果。

例4:练习差集运算minus。

解:对于student表,刨除sno<’s005’部分:

二、子查询

到目前位置介绍查询语句都只包含一条SELECT语句。

1.子查询的基本类型:

(1)单行子查询:不向外部的SQL语句返回结果,或者只返回一行;

①where子句中可使用单行子查询,即子查询可以放在另外一个查询的where子句中;(总结:where关键字后可用单行子查询)

比如:查询小于整个员工平均工资的员工信息。

SQL>select empno, ename from emp where sal <(select avg(sal) from emp);

②having子句中可使用单行子查询。(总结:having关键字后可用单行子查询)

比如:查询哪些职位的平均工资大于整个员工的平均工资。

SQL>select job, avg(sal) from emp group by job

2 having avg(sal) >(select avg(sal) from emp);

③from子句中可使用单行子查询,这种子查询称为内联视图。(总结:from关键字后可用单行子查询)

比如:查询哪些员工的工资高于所任职位的平均工资,就是比如a员工是IT行业,其工资15000大于IT行业平均工资8000,那么就把这个a员工查出来,如果b员工工资1200小于其行业平均工资1500,那么查询结果中就不包含b员工……

SQL>select ename, sal, b.c from emp a,(select job,avg(sal) c from emp group by job) b where a.sal > b.c and a.job =b.job;

其中a,b,c是别名,(select job, avg(sal) c from emp group by job)是子查询,查出每个行业的平均工资,后面where判断a.sal是员工工资,b.c是行业平均工资。

(2)多行子查询:向外部的SQL语句返回一行或多行;

(3)多列子查询;

(4)关联子查询;

(5)嵌套子查询。

 

例5:练习子查询(对应:二-1-(1)-①)

解:基于现有的student表,查询小于整个学生平均年龄的学生学号和姓名。

上图中,where中有子查询,即查询出当前学生表中的平均年龄,然后如果sage<平均年龄,符合条件,在查询结果中显示。

where后面的子查询是供外部select使用的查询。

【注意】以下这种语法错误:

因为聚合函数是要由select语句显示结果,这么直接用是错误的。

例6:练习子查询(对应:二-1-(1)-②)

解:查询某些课程的平均成绩,要求该成绩大于所有学生成绩的平均分。

对于上图中的命令有如下说明:

(1)groupby cno是将表中数据按照cno相同的分为一组,即同一门课程为一组;

(2)having子句用了子查询,即(selectavg(score) from sc)可以查到sc表score列所有数据的均值,即所有学生成绩的均分;

(3)先select查询到每门课程的均分avg(score)后,去having子句判断是否满足条件,若满足条件,则在查询结果中显示。

【切记】子查询不能包含排序,即不能包含group by子句。

时间: 2024-11-03 20:47:31

Oracle-27-集合操作(交集、并集、差集)&子查询之单行子查询的相关文章

C# 取两个集合的交集\并集\差集

交集:Intersect 并集:Union 差集:Except var A= new List() { 1, 2, 3, 4, 5, 6 }; var B= new List() { 3, 4, 5, 6,7,8,9 }; var C= A.Intersect(B); //交集 { 3, 4, 5, 6 } var D= A.Union(B); //并集 { 1, 2, 3, 4, 5, 6,7,8,9 } var E= A.Except(B); //差集 { 1, 2 } var F= B.E

Python 求两个文本文件以行为单位的交集 并集 差集

Python 求两个文本文件以行为单位的交集 并集 差集,来代码: s1 = set(open('a.txt','r').readlines()) s2 = set(open('b.txt','r').readlines()) print 'ins: %s'%(s1.intersection(s2)) print 'uni: %s'%(s1.union(s2)) print 'dif: %s'%(s1.difference(s2).union(s2.difference(s1))) 原文地址:h

java的集合操作(交集、并集、差集)整理

/**     * 求ls对ls2的差集,即ls中有,但ls2中没有的     *      * @param ls     * @param ls2     * @return      */    public static List diff(List ls, List ls2) {        List list = new ArrayList(Arrays.asList(new Object[ls.size()]));        Collections.copy(list, ls

(一)Python入门-3序列:19集合-特点-创建和删除-交集并集差集运算

集合: 集合是无序可变,元素不能重复.实际上,集合底层是字典实现,集合的所有元素都是字典 中的“键对象”,因此是不能重复的且唯一的. 一:集合的创建和删除 1. 使用{}创建集合对象,并使用 add()方法添加元素 1 >>> a = {1,3,5} 2 >>> a 3 {1, 3, 5} 4 >>> a.add(7) 5 >>> a 6 {1, 3, 5, 7} 7 >>> a.add(5) 8 >>&

十二道MR习题 - 3 - 交集并集差集

题目 有两个文件A和B,两个文件中都有几百万行数字,现在需要找出A文件和B文件中数字集合的交集.并集.以及A对B的差集. 简单说一下思路: 这个问题关键在于key和value的设计.这里我将文件中的数字设置为key,将文件名称设置为value.这样在reduce阶段很容易就能找出A.B两个文件中数字的交并差集了. 并集就是reduce阶段能输出的全部记录:交集则需要做下过滤,即一个记录中的value需要同时有A.B两个文件的名称:差集则是文件名称集合中只包含A或B的记录. 看下用MapReduc

oracle之集合操作函数---minus、union、intersect

集合操作符专门用于合并多条select语句的结果,包括:UNION,UNION ALL,INTERSECT,MINUS.当使用集合操作函数时,需保证数据集的字段数据类型和数目一致. 使用集合操作符需要注意: 集合操作符不适用于log.varray和嵌套列表. union.interesect和minus操作不可作用于long列. 如果选择列中包含有表达式或者函数,那么必须为表达式或者函数定义列别名. 1.UNION 当使用union时,自动过滤到数据集中重复的列,并以第一列的结果进行升序排序.

mysql获取两个集合的交集和差集

mysql中获取两个集合的交集,我的方法如下: 1.两个集合的结构要一致,对应的字段数,字段类型 2.将两个集合用 UNION ALL 关键字合并,这里的结果是有重复的所有集 3.将上面的所有集 GROUP BY id 4.最后 HAVING COUNT(id)=1,等于1的意思是只出现了一次,所以这个是差集,如果等于2,那么就是交集 这是实现的基本原理,具体如下: 1 -- 下面的sql有明显的问题,不过这个只是一个示意,从一个表中查询不需要用到交集和差集,条件可以合并在一起直接查询出来的.能

VB.NET LINQ 操作数组代码(求交集,并集,差集,最值,平均,去重复)

Sub Main() Dim a As Integer() = {1, 2, 3, 4, 5, 6, 7} Dim b As Integer() = {4, 5, 6, 7, 8, 9, 10} Dim c As Integer() = {1, 2, 3, 3, 4, 1, 2, 4, 6, 1, 6, 5} ' 交集 Dim fuck = a.Intersect(b) ' 并集 Dim shit = a.Union(b) ' a有b没有的 Dim diff1 = a.Except(b) ' b

js Array 交集 并集 差集 去重

最劲项目需要用到js数组去重和交集的一些运算,我的数组元素个数可能到达1000以上,网上的实现方式都是2次循环,性能不适合我的需求,1000*1000那循环次数太多了,所以我这里采用对象object来做处理,用空间换时间,code 如下: ///集合取交集 Array.intersect = function () { var result = new Array(); var arrCount = arguments.length;/*数组个数,默认2个数组取交集*/ if (arrCount