韩老师oracle上课视频,韩老师听课笔记2

Oracle的复杂查询

1.子查询:select ename,sal from emp where sal=(select max(sal) from emp);(显示emp表里最高工资的人的姓名和工资)(max(sal)这是分组函数)

2.select * from emp where sal

3.select avg(sal),max(sal),deptno from empgroup bydeptno having avg(sal)>1500;(having后面的表示只显示avg大于1500的值)

4.先group by,然后having,然后order by

5.多表查询:

a)select a1.empno,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno=a2.deptno;(查询emp表和dept表里deptno相同的数据)

b)多表查询的条件是不能少于表的个数减1

c)显示各个员工的姓名、工资、及其工资的级别:select a1.ename,a1.sal,a2.grade from emp a1,salgrade a2 where a1.sal between a2.losal and a2.hisal;(工资级别里面有两个条目分别是lowsal和highsal,用个between函数搞定)

6.表内查询(自连接):select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno;(显示某个员工的上级领导的姓名)

7.子查询:嵌入在其他查询语句中的select语句

select * from emp where deptno=(select deptno from emp where ename='smith');

8.数据库查询是从后面往前面执行,所以排除数据量最大的条件放最后可以加快查询速度

9.select * from emp where job in (select distinct job from emp where deptno=20);

意思:查找所有和部门20有相同工作的员工信息,多行子查询需要用in

10.select ename,sal,deptno from emp where sal>all(select sal from emp where deptno=30);

等同于:select ename,sal,deptno from emp where sal>(select max(sal) from emp where deptno=30);

select * from emp where deptno=(select deptno from emp where ename='smith') and job=(select job from emp where ename='smith');等同于:select * from emp where (deptno,job)=(select deptno,job from emp where ename='smith');

这是多条件查询,用括号来表示

11.select * from emp a2,(select deptno,avg(sal) mysal from emp group by deptno) a1 where a2.deptno=a1.deptno and a2.sal>a1.mysal;

查询工资高于本部门平均工资的员工信息

(1)先查出个部门的平均工资,用到group by命令,

(2)再将整个select语句显示出来的表作为一张子表,并取别名为a1

(3)然后通过多表查询的命令来查询出结果

12.注意:表取别名的时候没有as,列取别名的时候as可有可无。

Oracle表查询4:

分页查询

Mysql

1.select a1.*,rownum rn from (select * from emp) a1;

3.如果要指定查询列,只需修改最里层的select条件,这样查询效率高

select * from (select a1.*,rownum rn from (select ename,salfrom emp) a1 where rownum<=6) where rn>=3;

4.rowid的效率最高,rownum效率次之(课程中用这个做的实例),row_number效率最差

5.create table myemp (id,ename,sal) as select empno,ename,sal from emp;(将老表里的数据弄到新表里,新表可以取不同的条目名称)--测试时可用

合并查询(比and什么查询速度快)

1.union是或者的关系,select语句1 union select语句2,去掉重复的行,然后输出结果。也就是结果中只要满足一个select语句就输出

select ename,sal from emp where sal>1500 union select ename,sal from emp where job='manager';

2.union all也是或者的关系,不去除重复行,两个select结果相加

3.intersect是取交集,就是输出重复的行

4.minus取只存在第一个select语句中的行,但是又不在第二个select语句中。也就是第一个select中去掉重复行,然后输出

5.

你可能感兴趣的:(韩老师oracle上课视频)