多表查询:
在多张表中进行查询:
这里是emp表和dept表:
1, 显示雇员名,工资及所在部门的名字:select a1.ename,a1.sal,a2.loc from emp a1,dept a2where a1.deptno=a2.deptno;
如果没有这句wherea1.deptno=a2.deptno;那么就会把笛卡尔集全部显示出来,也就是显示emp的14条记录乘以dept的4条记录,总共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;其他傻瓜式的下一步就可以了;
第二种方法:手工创建,不会