Oracle集合查询详解加练习题

#集合查询
概念:将不同的数据集合(SQL查询语句)按照集合的规则,拼接一个临时的,新的数据集合(表)
在这里插入图片描述

1.集合:并集、交集、差集
并集 union all
语法:select column1,COLUMN2…from table_name
UNION ALL
select column1,COLUMN2…from table_name
UNION ALL
select column1,COLUMN2…from table_name

UNION ALL 查询结果为合并结果,不去重,不排序
union 语法:
select column1,COLUMN2…from table_name UNION
union查询结果为合并结果,并去重,并默认根据第一行正序排序
2.交集
INTERSECT
语法:select column1,COLUMN2…from table_name
INTERSECT
select column1,COLUMN2…from table_name
INTERSECT
select column1,COLUMN2…from table_name
intrsect 查询结果为:获取两个结果中的相同部分,并去重,并默认第一行正序排序
3.差集
MINUS
语法:select column1,COLUMN2…from table_name
minus
select column1,COLUMN2…from table_name
minus
minusselect column1,COLUMN2…from table_name

minus 查询结果为:第一个结果减去第二个中相同部分,只获取结果中独有的数据,并去重,并默认根据第一列正序排序

—查询工资等于1250和等于3000的员工的编号,姓名,工资
select empno,ename,sal from emp where sal=1250 or sal=3000;
select empno,ename,sal from emp where sal in(1250,3000);
select empno,ename,sal from emp where sal= any(1250,3000);

select empno,ename,sal from emp where sal = 1250
union ALL
SELECT empno,ename,sal from emp where sal = 3000;

select empno,ename,sal from emp where sal = 1250
union
SELECT empno,ename,sal from emp where sal = 3000;

—查询工资大于1600的员工信息和工资小于3000的员工信息的同样部分
select * from emp where sal>1600 and sal<3000;

SELECT * from emp where sal>1600
INTERSECT
SELECT * from emp where sal<3000;

SELECT job from emp where sal>1600
INTERSECT
SELECT job from emp where sal<3000;

SELECT empno,job from emp where sal>1600
INTERSECT
SELECT empno,job from emp where sal<3000;

—查询工资大于1300的员工和工资小于3000的员工中查询小于1300的独有的信息

select * from EMP where sal>1300
MINUS
SELECT * from EMP where sal<3000;

select * from EMP where sal<3000
MINUS
select * from EMP where sal>1300

----查询集合结果的显示
select empno 员工编号,ename,job from emp where sal>1000
UNION
select empno,enme,job from emp where sal<1600;

—如果查询列数不一致——————不可以,结果列数不一致,报错
select empno ,ename,job,sal from emp where sal>1000
UNION
select empno,enme,job from emp where sal<1600;

—数据类型不一致,报错
select empno ,ename,job,sal from emp where sal>1000
intersect
select ename,empno,job,sal from emp where sal<3000;

select empno ,ename,job,sal from emp where sal>1000
MINUS
select sal,job,empno,empno from emp where sal<3000;
注意:
查询结果列名为第一个查询结果列名为准
2.查询结果列数必须一致
3.查询结果顺序要一直,数据类型要一致

重点:
1.UNION 和 union ALL union :排序去重,union all :不排序 不去重
2.union/intersect/minus 均会按照第一个列升序去排序,去重
3.minus 用于查询集合中的独有数据
4.minus签后集合的顺序不同影响返回结果
5.集合操作时候注意:集合的列的数据类型和个数要一致

附加:
查询10号部门独有的工作和查询20号部门独有的工作并吧这些合并查询

#练习题
1.查询部门编号是10,20的员工信息
select * from EMP where deptno=10 or deptno=20;
select * from EMP where deptno in(10,20);
select * from emp where deptno=any(10,20);

select * from EMP where deptno=10
union all
select * from EMP where deptno=20;

2.查询员工信息,职位是CLERK或者SALESMAN或者ANALYST
select * from emp where job=‘CLERK’
UNION
SELECT *from EMP where job=‘SALESMAN’
union
SELECT *from EMP where job=‘ANALYST’
3.查询薪资是800 950 的员工信息
select * from emp where sal=800
union ALL
select * from emp where sal=950
4.查询上级编号7902、7698的员工信息
select * from EMP where empno=7902
union all
select * from EMP where empno=7698
5.员工工资不是 800和1600的员工信息
select * from emp where sal!=800
INTERSECT
select * from emp where sal!=1600

6.查询员工薪资为1000到3000的员工信息
select * from EMP where sal>1000
INTERSECT
select * from emp where sal<3000;

7.查询员工编号在7500到7700之间的员工
select * from emp where empno>7500
INTERSECT
select * from emp where empno<7700;

8.查询姓名是以A开头的、薪资在1000到1500之间的员工
select * from emp where ename like ‘A%’
INTERSECT
select * from EMP where sal>1000
INTERSECT
select * from emp where sal<1500;

9.查询薪资在1000-3000之间,并且部门编号是10或者20
select * from EMP where sal>1000
INTERSECT
select * from emp where sal<3000
INTERSECT
select * from EMP where deptno=10
UNION all
select * from EMP where deptno=20;

10.查询(部门编号是20并且工作岗位是CLERK的员工) ,或者薪资大于3000的员工
select * from EMP where deptno =20
INTERSECT
select * from EMP where job=‘CLERK’
union all
select * from emp where sal>3000

11.查询没有员工的部门编号
SELECT * from dept where deptno not in (select DISTINCT deptno from emp)

12.查询30号部门中有,10部门没有的岗位名称
select DISTINCT job from EMP where deptno=30
MINUS
select DISTINCT job from EMP where deptno=10

13查询10号部门独有的工作和查询20号部门独有的工作并把这些合并查询

select DISTINCT JOB from emp where deptno=10
MINUS
select DISTINCT JOB from emp where deptno=20
MINUS
select DISTINCT JOB from emp where deptno=30
union

select DISTINCT JOB from emp where deptno=20
MINUS
select DISTINCT JOB from emp where deptno=10
MINUS
select DISTINCT JOB from emp where deptno=30

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.desc table_name 可以查询表的结构 2.怎么获取有哪些用户在使用数据库 select username from v$session; 3.如何在Oracle服务器上通过SQLPLUS查看本机IP地址 ? select sys_context('userenv','ip_address') from dual; 如果是登陆本机数据库,只能返回127.0.0.1 4.如何给表、列注释? SQL>comment on table 表 is '表注释'; 注释已创建 SQL>comment on column 表.列 is '列注释'; 注释已创建。 查询该用户下的注释不为空的表 SQL> select * from user_tab_comments where comments is not null; 5.如何在ORACLE中取毫秒? select systimestamp from dual; 6.如何在字符串里回车? 添一个||chr(10) select 'Welcome to visit'||chr(10)||'www.CSDN.NET' from dual ; 7.怎样修改oracel数据库的默认日期? alter session set nls_date_format='yyyymmddhh24miss'; 8.怎么可以看到数据库有多少个tablespace? select * from dba_tablespaces; 9.如何显示当前连接用户? SHOW USER 10.如何测试SQL语句执行所用的时间? SQL>set timing on ; 11.怎么把select出来的结果导到一个文本文件中? SQL>SPOOL F:\ABCD.TXT; SQL>select * from table; SQL >spool off; 12.如何在sqlplus下改变字段大小? alter table table_name modify (field_name varchar2(100)); 改大行,改小不行(除非都是空的) 13.如果修改表名? alter table old_table_name rename to new_table_name; 14.如何搜索出前N条记录? (desc降序) SELECT * FROM Tablename WHERE ROWNUM < n ORDER BY column; 15. 如何在给现有的日期上2年? select add_months(sysdate,24) from dual; 16.Connect string是指什么? 应该是tnsnames.ora中的服务名后面的内容 17.返回大于等于N的最小整数值? SELECT CEIL(-10.102) FROM DUAL; 18.返回小于等于N的最大整数值? SELECT FLOOR(2.3) FROM DUAL; 19.返回行的物理地址 SELECT ROWID, ename FROM tablename WHERE deptno = 20 ;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值