在oracle中用查询集合运算实现:查询emp表的第2,4,6,8共四条记录?
发布网友
发布时间:2022-04-07 20:07
我来回答
共2个回答
懂视网
时间:2022-04-08 00:28
3 select * from emp where deptno=20;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 13-7月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7876 ADAMS CLERK 7788 13-7月 -87 1100 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择8行。
若直接合并,则会出现语法错误:
SQL> select deptno,job,sum(sal) from emp group by deptno,job
2 union
3 select deptno,sum(sal) from emp group by deptno
4 union
5 select sum(sal) from emp;
select deptno,sum(sal) from emp group by deptno
*
第 3 行出现错误:
ORA-01789: 查询块具有不正确的结果列数
集合运算
SQL> /*
SQL> 集合运算:
SQL> 1. 参与运算的各个集合,必须列数相同,且类型一致
SQL> 2. 最终结果采用第一个集合的表头作为表头
SQL> 3. order by必须在每个集合后使用相同的order by
SQL> */
对于字符添加空列,使用to_char(null)
对于数字添加空列,使用to_number(null)
union
UNION运算符返回两个集合去掉重复元素后的所有记录
UNIONALL返回两个集合的所有记录,包括重复的
SQL> select deptno,job,sum(sal) from emp group by deptno,job
2 union
3 select deptno,to_char(null),sum(sal) from emp group by deptno
4 union
5 select to_number(null),to_char(null),sum(sal) from emp;
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
DEPTNO JOB SUM(SAL)
---------- --------- ----------
30 9400
29025
已选择13行。
格式化:
SQL> break on deptno skip 2
SQL> /
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
MANAGER 2450
PRESIDENT 5000
8750
20 ANALYST 6000
CLERK 1900
MANAGER 2975
10875
DEPTNO JOB SUM(SAL)
---------- --------- ----------
30 CLERK 950
MANAGER 2850
SALESMAN 5600
9400
29025
已选择13行。
SQL> break on null
SQL> /
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
DEPTNO JOB SUM(SAL)
---------- --------- ----------
30 9400
29025
已选择13行。
SQL> host cls
打开SQL执行的时间
SQL> --打开SQL执行的时间
SQL> set timing on
SQL> select deptno,job,sum(sal)
2 from emp
3 group by rollup(deptno,job);
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
DEPTNO JOB SUM(SAL)
---------- --------- ----------
30 9400
29025
已选择13行。
已用时间: 00: 00: 00.00
SQL> select deptno,job,sum(sal) from emp group by deptno,job
2 union
3 select deptno,to_char(null),sum(sal) from emp group by deptno
4 union
5 select to_number(null),to_char(null),sum(sal) from emp;
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
DEPTNO JOB SUM(SAL)
---------- --------- ----------
30 9400
29025
已选择13行。
已用时间: 00: 00: 00.00
SQL> set timing off
这儿由于数据量太少导致时间太短无法测出,在平时可以使用此种方法来检测哪一个sql语句执行时间更短,则那个sql更为好
INTERSECT语句
INTERSECT
运算符返回同时属于两个集合的记录
显示薪水同时位于级别1(700~1300)和级别2(1201~1400)的员工信息:
SQL> select ename,sal from emp
2 where sal between 700 and 1300
3 INTERSECT
4 select ename,sal from emp
5 where sal between 1201 and 1400;
ENAME SAL
---------- ----------
MARTIN 1250
MILLER 1300
WARD 1250
minus
MINUS返回属于第一个集合,但不属于第二个集合的记录。
显示薪水同时位于级别1(700~1300),但不属于级别2(1201~1400)的员工信息:
SQL> select ename,sal from emp
2 where sal between 700 and 1300
3 minus
4 select ename,sal from emp
5 where sal between 1201 and 1400;
ENAME SAL
---------- ----------
ADAMS 1100
JAMES 950
SMITH 800
集合运算注意事项
lselect语句中参数类型和个数要一致。
l可以使用括号改变集合执行的顺序
l如果有order by子句,必须放到每一句查询语句后
l集合运算采用第一个语句的表头作为表头
Oracle学习(7):集合运算
标签:oracle sql 学习笔记 数据
热心网友
时间:2022-04-07 21:36
select语句里面where条件用in,将主键或rownum字段的值包含在里面,分别写2,4,6,8。
在oracle中用查询集合运算实现:查询emp表的第2,4,6,8共四条记录?
select语句里面where条件用in,将主键或rownum字段的值包含在里面,分别写2,4,6,8。
oracle里面更新操作能带有四则运算吗
在WHERE子句中可以用比较操作符IN(list)来取出符合列表范围中的数据。其中的参数list表示值列表,当列或表达式匹配于列表中的任何一个值时,条件为TRUE,该条记录则被显示出来。 SELECT ename, job FROM emp WHERE job IN ('MANAGER', 'CLERK');使用BETWEEN 1 AND 2 用来查询符合(1,2)值域范围之内的数据,通常...
oracle选择从m条到n条的记录
方法1:oracle的ROWNUM伪列返回查询的行序号。例如要查询表的前10条记录,可以使用 select * from tablename where ROWNUM<=10 但是要返回第11-第20条记录,尝试以下的语句 select * from tablename where ROWNUM<=20 and ROWNUM>=11;这个人报错。返回0条记录。因为ROWNUM是伪列,不能用>=条件 使用...
列举一些sql高级查询语句
MINUS 在第一个查询中,不在后面查询中,并且结果行不重复 差集所有的集合运算与等号的优先级相同,如果SQL语句包含多个集合运算并且没有圆括号明确地指定另一个顺序,Oracle服务器将以从左到右的顺序计算。你应该使用圆括号来明确地指定带另外的集合运算的INTERSECT (相交) 运算查询中的赋值顺序。Union all 效率一般比u...
如何优化SQL语句
情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询 , 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其 他表所引用的表. (2) WHERE子句中的连接顺序.: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必 须写在其他WHERE条件之前, 那些可以过...
ORACLE 中视图更新可以更新基表中数据,视图更新应该满足什么条件?
1:集合运算符 union,union all,intersect,minus 2:distinct关键字 3:group by,order by,connect by,或者start with 4:子查询 5:分组函数 6:需要更新的列不是视图定义的 7:具有连接查询(可以更新键值保存表的数据)8:违反基表的约束条件 查询视图那些列可以更新可以通过user_updatable_columns...
Linux日常维护常用命令集合整理
oracle@Station90.example.com/1211 cat 1.txt 1 4 2 5 3 6 oracle@Station90.example.com/1211 awk 'NR==2 {print $2}' 1.txt 5 每隔2s执行一次df –h watch –n 2 “df –h” ls –ltrh 人性化的显示输出 rm *删除文件报错,可通过如下方式删除文件 find ./ -type f /tmp/0110.txt for...
Java遇上SPL:架构优势和开发效率,一个不放过
解析源数据并生成序表:Orders=T("d:/Orders.csv") 按列名从原序表生成新的序表:Orders.new(OrderID, Amount, OrderDate) 计算列:Orders.new(OrderID, Amount, year(OrderDate)) 字段改名:Orders.new(OrderID:ID, SellerId, year(OrderDate):y) 按序号使用字段:Orders.groups(year(_5),_2; sum(_4)...
oracle中怎么比较2个集合是否相等
minus运算:返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。比如第一个结果是第二个结果的子集,那返回的结果是0 和我需要的是不一样的,我要的是个数,值,顺序(通过order by实现)均一样才相等 A minus B union all B minus A 这样 minus运算:返回在第一个查询结果中与第...
oracle group by 性能优化
(6) 使用DECODE函数来减少处理时间:使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.(7) 整合简单,无关联的数据库访问:如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)(8) 删除重复记录:最高效的删除重复记录方法 ( 因为使用了ROWID)例子:DELETE FROM EMP E ...