现在的位置: 首页 > 综合 > 正文

Oracle学习<四>

2012年03月20日 ⁄ 综合 ⁄ 共 2146字 ⁄ 字号 评论关闭

六、having 语句

    

    Having 对分组结果筛选

    Where是对单条纪录进行筛选,Having是对分组结果进行筛选.

    select avg(sal),deptno from emp group by deptno having avg(sal)>2000;

    查询工资大于1200雇员,按部门编号进行分组,分组后平均薪水大于1500,按工薪倒充排列.
    select * from emp where sal>1200 group by deptno having avg(sal)>1500 order by avg(sal) desc;

 

  

七、子查询

  谁挣的钱最多(谁:这个人的名字, 钱最多)

  select 语句中嵌套select 语句,可以在where,from后.

  问那些人工资,在平均工资之上.

  select ename,sal from emp where sal>(select avg(sal) from emp);

  查找每个部门挣钱最多的那个人的名字.
  select ename ,deptno from emp where sal in(select max(sal) from ename group by deptno) 查询会多值.

  应该如下:

  select max(sal),deptno from emp group by deptno;当成一个表.语句如下:
  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);

   每个部门的平均薪水的等级.
  分析:首先求平均薪水(当成表),把平均薪水和另外一张表连接.

  join是连接两个表,而on是表示这两个表通过某种条件连接

 

 

 

 八、self_table_connection 自连接

    把某个人的名字以及他的经理人的名字求出来(经理人及这个人在表中同处一行)

    分析:首先求出这个人的名字,取他的编号,然后从另一张表与其相对应编号,然后找到经理的名字.

    select e1.ename ,e2.ename from emp e1,emp e2 where e1.mgr= e2.empno.

    empno编号和MGR都是编号.

 

  

九、SQL1999_table_connections 

  select ename,dname,grade from emp e,dept d, sqlgrade s
  where e.deptno = d.deptno and e.sql between s.losal and s.hisal and
  job<>'CLERK';

  有没有办法把过滤条件和连接条件分开来? 出于这样考虑,Sql1999标准推出来了.有许多人用的还是
  旧的语法,所以得看懂这种语句.

  select ename,dname from emp,dept;(旧标准).
  select ename,dname from emp cross join dept;(1999标准)

  select ename,dname from emp,dept where emp.deptno=dept.deptno (旧)
  select ename,dname from emp join dept on(emp.deptno = dept.deptno); 1999标准.没有Where语句.
  select ename,dname from emp join dept using(deptno);等同上句,但不推荐使用.

  select ename,grade from emp e join salgrade s on(e.sal between s.losal and s.hisal);
  join 连接语句, on过滤条件。连接,条件一眼分开。如果用Where语句较长时,连接语句和过滤语句混在一起。

  三张表连接:
  slect ename,dname, grade from
  emp e join dept d on(e.deptno=d.deptno)
  join salgrade s on(e.sal between s.losal and s.hisal)
  where ename not like '_A%';
  把每张表连接 条件不混在一起,然后数据过滤条件全部区分开来。读起来更清晰,更容易懂一点。

  select e1.ename,e2.ename from emp e1 join emp e2 on(e1.mgr = e2.emptno);

  左外连接:会把左边这张表多余数据显示出来。
  select e1.ename,e2,ename from emp e1 left join emp e2 on(e1.mgr =e2.empno);left 后可加outer
  右外连接:
  select ename,dname from emp e right outer join dept d on(e.deptno =d.deptno); outer可以取掉。

  即把左边多余数据,也把右边多余数据拿出来,全外连接。
  select ename,dname from emp e full join dept d on(e.deptno =d.deptno);

 

抱歉!评论已关闭.