第四课 oracle表查询续

多表查询:

在多张表中进行查询:

这里是emp表和dept表:

1,  显示雇员名,工资及所在部门的名字:select a1.ename,a1.sal,a2.loc from emp a1,dept a2where a1.deptno=a2.deptno;

如果没有这句wherea1.deptno=a2.deptno;那么就会把笛卡尔集全部显示出来,也就是显示emp14条记录乘以dept4条记录,总共56条记录;

加了这句,就只把两个表里的部门号相同的列出来了,两个表的连接就是deptno;另外需要注意的是别名的应用;

2,显示部门号为10的部门名,员工号和工资: selecta1.ename,a1.sal,a1.deptno,a2.dname from emp a1,dept a2 where a1.deptno=10 anda2.deptno=10;

3,显示雇员名,工资及所在的部门名字,并且按照部门排序:

select  a1.ename,a1.sal,a1.deptno,a2.dname from empa1,dept a2  where a1.deptno=a2.deptno order by a1.deptno;

注意:between and =大于,小于;


自连接:

自连接其实就是在同一张表进行查询,但是把一张表起两个别名,这样就相当于两张表了,看例子:

查询所有员工的上级领导的姓名:select a1.ename 职员,a2.ename 上级 from emp a1,emp a2where a1.mgr=a2.empno;


     子查询:

   简单的讲,子查询就是select 里面嵌套select:

   子查询分为单行子查询,多行子查询,多列子查询:

单行子查询:子查询只返回一行数据:

  例子:显示与smith同一个部门的所有员工:select * from emp wheredeptno=(select deptno from emp where ename='SMITH');

多行子查询:返回多行,例子:查询和部门10的工作有相同的雇员信息:select * from emp wherejob in(select job from emp where deptno=10);

在多行子查询中还常用到关键字all,any等:

如all:显示工资比部门30的所有员工高的员工信息:select * from emp where sal> all(select sal from empwhere deptno=30);

                                               或者: select * from emp where sal>((select max(sal)from emp where deptno=30));

 

如any:显示工资比部门30的任意员工的工资高员工信息;select * from emp where sal> any(select sal from empwhere deptno=30);

                                         或者select * from emp where sal>((select min(sal) from empwhere deptno=30));

多列子查询:返回多列数据:例子:查询与smith的部门和岗位完全相同的所有员工:

select * from emp where(deptno,job)=(select deptno,job  from empwhere ename='SMITH');

 

例子:显示高于自己部门平均工资的员工信息:

select * from emp a1,( SELECT deptno,avg(sal) avgsal from emp group by deptno) a2

 where a1.sal>a2.avgsal anda1.deptno=a2.deptno order by a1.sal;

 上面这句比较复杂,需注意一点:可以把子查询结果作为一个试图或者说表来对待,必要时对他起别名如a2,可以实现复杂查询;


分页查询:

oracle的分页查询时比较复杂和奇怪的,

这里介绍一种简单的分页查询方法:分页查询是对表中的每条记录从上到下给一个行号,行号递增,然后我们根据行号随意取出其中的几条记录,这就叫分页查询;

 第一步:rownum 方法:oracle分配的行号:

Select a1.*,rownumrn from (select * from emp) a1;

第二步:按照行号rownum取出记录,分页显示:注意rownum在where里不能用两次;下面写法是错误的;

Selecta1.*,rownum rn from (select * from emp) a1 where rownum<=10;

不能写成:Select a1.*,rownum rn from (select * from emp) a1 whererownum<=10 and rownum>=4;//rownum不能再where里用两次,这就是oracle的怪;

 若要查询4-10的数据,只能写成:

SQL> select a2.* from(Selecta1.*,rownum rn from (select * from emp) a1 where rownum<=10)a2 wherern>4;

不能写成:SQL> select a2.*from(Select a1.*,rownum rn from (select * from emp) a1 where rownum<=10)a2where rownum>4;//rownum不能用两次

 如果要修改查询的记录,顺序等,只需修改最低层的select语句即可;


小技巧,用查询结果来建一张新表:

Create tableemp2 (id,name,sal,job,deptno) as selectempo,ename,sal,job,deptno from emp;

Insert into  emp3  values(“”,””,””)select “”,””,”” from emp:   把一张表中查询到的数据插入批量插入到另外一张表中;

Update emp set(empno,ename) select empno,ename from emp where ename=’SMITH’ :对表进行批量更新;


合并查询:用到union(并集),unionall(也是并,但是不删除重复行),intersect(交集),minus(差集);

合并查询不太重要:oracle特有的

并:select   ename , sal, job from emp  where sal>2000 union select ename,sal,job emp where job='MANAGER';

Unionall:select   ename , sal, job from emp  where sal>2000 unionall select ename,sal,job emp where job='MANAGER';  不消除重复行;

Intersect: select   ename , sal, job from emp  where sal>2000 intersect select ename,sal,job emp where job='MANAGER';

Minus:select   ename , sal, job from emp  where sal>2000  minus  select ename,sal,job emp where job='MANAGER';


创建另外一个数据库实例:

 第一种方法:通过oracle提供的向导工具:DatabaseConfiguration Assistant(数据库配置助手)完成,也可以通过它删除实例。

添加实例时注意,在其中选择时,一般选择new database;其他傻瓜式的下一步就可以了;

第二种方法:手工创建,不会




 

你可能感兴趣的:(oracle,select,应用,表查询)