

与查询出表的联合查询,对多个查询结果分页,输出指定条数的记录,取并,交,差集,用默认工具建数据库,统计表中所有记录个数,用查询结果建新表,
一、与子表或内嵌视图的多表查询,另一表是通过SQL语句查询出来的,不是真实存在的
如何显示高于自己部门平均工资的员工信息
select deptno,avg(sal) [as] mysal from emp group by deptno; //首先查询各部门的部门号和平均工资,自己部门平均工资命别名mysal,并按部门号分组
select a2.ename,a2.sal,a2.deptno,a1.mysal from emp a2, (select deptno,avg(sal) [as] mysal from emp group by deptno) a1 where a1.deptno=a2.deptno and a2.sal>a1.mysal;
注:把子查询看做是一张子表,即内嵌视图来使用,必需为其取一个别名,这里命名为a1,oracle表取别名建议不能加as,否则会报错,列取别名可加可不加。
二、分页查询,oracle中有rownum,rowid,分析函数三种分页方式,这里只讲rownum分页
1.rownum分页公式,注:rownum可以用来分页或给查询结果增加一个序号列
1) 公式:select a1.*,rownum rn from (select * from 表名) a1; //这里的rn是自取的,可以命任意名
//把子查询当做内嵌视图并命别名为a1,a1.*代表子查询所有信息,rownum rn是作用是给子查询中每行分配行ID,查询的结果会有个名叫rn列,列中是行ID
例1,查询前10条记录:select a1.*,rownum rn from (select * from emp) a1 where rownum<=10;
例2,查询6到10的记录:select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) where rn>=6;
注:rownum的分页使用二分机制,在一个查询中rownum只能用一次,要查某段间要使用两次查询
2) 设置rownum分页查询只显示指定的列,只需改最里层的子查询,例:
select * from (select a1.*,rownum rn from (select ename,sal from emp) a1 where rownum<=10) where rownum>=6;
3) 给rownum分页查询结果排序,只需给里里层的子查询排序,例:
select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal [desc]) a1 where rownum<=10) where rownum>=6;
4)显示某条到某条之间的记录
select * from (select a1.*,rownum rn from (select ename,sal from emp) a1 where rownum<=9) where rn>=4; //显示第4-9条记录
2.其它两种分页方式:
用rowid来分页,语句复杂,效率级高,7万条0.03秒
按分析函数来分 效率最低,7万条1.01秒
三、用count(*)查询表所有记录个数,同sql2000
select count(*) from table;/select count(字段名) from table;
四、用查询结果创建新表
create table myemp2 (id,name,sal) as select empno,ename,sal from emp; //创建一个有id,name,sal字段的名为myemp2的新表,然后把查询出emp表empno,ename,sal字段的所有内容依次插入其中,
desc myemp2; //显示表结构,查看创建myemp2表是否成功
select * from myemp2; //查询新表myemp2中的所有数据查看是否插入成功。
五、union, union all,intersect,minus,用于对多个查询取并集、交集,差集,相减。查询速度会比用and 和or快的多,特别是大表
1.union, 取并集,把查询的两个结果合并在一起,会自删除重复的部分。
例:查询薪资大于2500的或岗位为MANAGER的并在一起并去掉重复的行
select ename,sal,job from emp where sal>2500 union select ename,sal,job from emp where job='MANAGER';
select ename,sal,job from emp where sal>2500 or job='MANAGER'; //和这个查询结果相同
2.union all, 取并集,把查询的两个结果合并在一起,不会删除重复的部分。
例:查询薪资大于2500的或岗位为MANAGER的并保留重复的行
select ename,sal,job from emp where sal>2500 union all select ename,sal,job from emp where job='MANAGER';
3.intersect 取交集,只取两个集盒的交集,只取两个查询的结果都有的记录
例:查询薪资大于2500的或岗位为MANAGER的结果只保留重复的行
select ename,sal,job from emp where sal>2500 intersect select ename,sal,job from emp where job='MANAGER';
4.minus取差集,对查询的结果相减,主要作用是把后一个查询结果中有的记录从前一个查询的结果中删除,最后只会保留前一个查询有,而后一个查询没有的记录。
注:如果前面的查询结果小于后面的,结果就会是空积。
例:查询薪资大于2500的和岗位为MANAGER的并去掉重复的行
select ename,sal,job from emp where sal>2500 minus select ename,sal,job from emp where job='MANAGER';
先查询select ename,sal,job from emp where sal>2500的记录,再查询select ename,sal,job from emp where job='MANAGER'的记录
后一个查询有前一个查询也有的记录,就把这个记录就前一个查询结果的删除,如果后一个查询有,前一个查询没有的记录,不作处理,最后结果里也没有这条记录。
六、使用oracle默认工具dbca创建新数据库的方法
1.用工具向导,Database Configuration Assistant 数据库配置助手 创建删除数据库
一般选new database 具体详见视频 ,安装10分钟
2.用手工步骤