复杂查询
用这两张雇员表和员工表将为一下案例做演示
1.多表查询
多表查询:多表查询是指基于两个或两个以上的表或者视图的查询。
//查询员工名,工资,以及员工所在部门的名称
select a1.ename,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno=a2.deptno;
//查询部门编号为10的部门名称,员工名称,工资
select a1.ename,a1.sal,a2.dname from emp a1,dept a2 where a2.deptno=a1.deptno and a2.deptno =10;
//查询员工名称,工资,部门名称,并且按照部门名称升序排列
select a1.ename,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno=a2.deptno order by a2.deptno;
2.自连接
自连接:自连接是指在同一张表上的连接查询
//查询员工的姓名以及员工所对应老板的姓名
select employee.ename employees,boss.ename bosss from emp employee,emp boss where employee.mgr=boss.empno;
3.子查询
子查询:子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
单行子查询
//查询与SMITH在同一部门的员工
select * from emp where deptno=(select deptno from emp where ename='SMITH');
多行子查询
多行子查询是指返回多行数据的查询。
在多行子查询中使用all操作符
//查询与10号部门工作相同的员工名称,工作,工资,部门编号
select ename,job,sal,deptno from emp where job in (select job from emp where deptno=10);
//查询比30号部门所有人工资高的员工姓名,职位,工资,部门编号
select ename,sal,job,deptno from emp where sal>all(select sal from emp where deptno=30);
在多行子查询中使用any操作符
//查询比30号部门任意人工资高的员工姓名,职位,工资,部门编号
select ename,sal,job,deptno from emp where sal>any(select sal from emp where deptno=30);
多列子查询
单行子查询是指子查询返回单行,单列的数据
多行子查询是指子查询返回多行,单列的数据
多列子查询是指子查询返回多列数据的查询
//查询与SMITH的部门和职位完全相同的员工信息
select * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');
在from子句中使用子查询
在from子句中使用子查询时,该子查询会被当做一个视图来对待,因此也就叫做内嵌图,当在from子句中使用子查询时,必须给子查询起别名。(换句话说就是把子查询查出来的数据作为一张新表,在进行查询)
分页查询
第一步:需要查询的列
select * from em;
第二步:显示行数
select a.,rownum rn from (select * from emp) ;
第三步:添加条件继续查询
select * from (select a.,rownum rn from (select * from emp) a where rownum<=10) where rn>=5;
select * from (select a.*,rownum rn from (select * from emp) a where rownum<=10) where rn>=5;
可以修改,不管是想添加选择列,排序,其他操作,只需要修改最内层的查询语句就行。