用户名:  密码:   
您当前的位置:首页 > SQL数据库 >  Oracle > 

第10讲 多表查询使用and,between,order by,同表自连接查询,嵌套查询,多行子查询加in,all,any操作符,比较多例的子查询

上次修改时间: 2015-10-14 15:39:03      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\SQL数据库相关\Oracle数据库学习\韩顺平.玩转oracle教程笔记1_30讲\      下一页

多表查询使用and,between,order by,同表自连接查询,嵌套查询,多行子查询加in,all,any操作符,比较多例的子查询

一、多表查询加and,between,order by
1.加and,例:查询部门号为10员工的部门名,员工名和工资(因为部门名保存在dept表,其它保存在emp表,所在要用到多表查询)
  select a1.dname,a2.ename,a2.sal from dept a1,emp a2 where a1.deptno=a2.deptno and a2.deptno=10;
2.加between,例:显示各员工的名字,工资,工资级别,按部门排序
  select a1.ename,a1.sal,a2.grade from emp a1,salgrade a2 where a1.sal between a2.losal and a2.hisal; //salgrade为表名
3.加order by,例:员工名,部门名,工资,并按部门号排序
  select a1.ename,a2.dname,a1.sal from emp a1,dept a2 where a1.deptno=a2.deptno order by a1.deptno;

二、同一表的自连接查询
类似多表查询,把同一表分别命不同别名,看成两张表再用多表查询法来查
例:显示某员工的上级领导为‘ford’,的员工:
select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno and boss.ename='FORD';  //这里把emp表分别命名为worker和boss。

三、子查询或嵌套查询,
也叫嵌套查询,有多个select在同一个sql语句中 。
例:查询与SMITH在同一部门的所有员工
首先查询smith的部门号:select deptno from emp where ename='SMITH';
再查拥有这个部门号的人员:select * from emp where deptno=(select deptno from emp where ename='SMITH'); //查询部门号等于smith所在部门号的所有人员
   //嵌套查询效率提高方法:数据执行sql语句是从左到右,应把能过滤最多记录的语句写在最左边(这里的左和右好象有点不同)

四、多行子查询加in操作符
返回多行数据的子查询(注:前面的单行子查询,只反回一行数据)
例:查询与部门号是10员工的岗位相同的雇员的所有信息
select job from where deptno=10; //查询部门是10的
select distinct job from where deptno=10; //使用distinct过滤掉重复的内容,因为同一部门中可能有多人为同一岗位
select * from emp where job in (select distinct job from emp where deptno=10); //注:从多个记录中查询要用到in

五、多行子查询加all操作符
例:显示工资比部门号为30的所有员工的工资都高的员工的姓名,工资和部门
方法一:select ename,sal,deptno from emp where sal>all(select sal from emp where deptno=30);  //查询部门号为30人员的所有人员工资
方法二:select * from emp where sal>(select max(sal) from emp where deptno=30); //先查出部门为30人员的最高工资,再查询大于这个工资的人员,这个是单行子查询

六、多行子查询加any操作符
例:显示工资比30号部门任意员工的工资高员工的姓名,工资和部门
方法一:select ename,sal deptno from emp where sal>any(select sal from emp where deptno=30); //先查询部门为30的所有人员工资,效率低,可加disinct效率稍高
方法二:select * from emp where sal>(select min(sal) from emp where deptno=30); //此查询效率高,先查询最低工资。

七、多列子查询,返回多列,比较多列
例:查询与smith的部门和岗位完全相同的雇员
首先查询smith的部门和岗位:select deptno,job from emp where ename='SMITH';
再查询部门和岗位:select * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH'); //这里的子查询会输出两列
//注:这里外面查询的deptno,job和子查询中的deptno,job前后顺序要一样