您的位置:首页 > 数据库 > Oracle

Oracle学习_3 sql子查询,自连接,单行select总结

2011-02-23 09:29 776 查看
单条Select语句要点总结:

Select avg(sal)
From emp
Where sal > 1200
Group by deptno      //按照部门编号分组
Having avg(sal) >1500  //having加限制条件
Order by avg(sal) desc  //查询结果升序排列

子查询:即是在一个查询语句嵌套另一个查询语句。
例:查询emp表中工资最高的人的姓名
select ename,max(sal)
From emp;

这个查询将报错,因为max(sal)只有一个输出而相对应的ename可能有多个,所以这个查询应该这样写:
Select ename,sal
From emp
Where sal = (select max(sal)
	     From emp);

例:查询各个部门薪水最高的人的姓名,薪水,部门号
Select ename,sal,deptno
From emp
Where sal = (select max(sal)
	     From emp
	     Group by deptno);

这种写法是错误的,因为单行子查询中返回多个行,所以可能会做出如下修改:
Select ename,sal,deptno
From emp
Where sal  in (select max(sal)
	       From emp
	       Group by deptno);

这个查询语句没问题,但是它的查询结果是有问题的,原因很简单,它会将每个部门薪水是子查询的3个值的人都选出来,这与我们的要求不相符。正确写法:
Select ename ,sal 
From emp
Join (select max(sal) max_sal,deptno
      From emp
      Group by deptno) t    //为子查询的查询结果取一个别名
On(emp.sal=t.max_sal and emp.deptno = t.deptno);

理解子查询的关键可以将子查询看做一张表,然后做连接查询就好
自连接
只需要为同一张表起一个别名就可以了,即是将一张表当成两张表来用
例如:查询每一个员工的经理人
Select e1.ename,e2.ename
From emp e1,emp e2
Where e1.mgr=e2.empno;

注:文中所用表为oracle的示例数据库
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: