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.