Oracle_4 sql标准 连接 select小结

sql标准

        sql92标准中的连接条件和数据过滤条件都是混在where语句中,这样使人很同意混淆,如下面语句:

Select ename,dname From emp,dept Where dmp.deptno = dept.deptno;  

        为了解决这个问题,sql99标准改善了这个问题,用join语句表示连接条件,where中只剩下数据过滤

    条件。新的语法定义比较清晰,语句更容易读,如以下语句:

Select ename,dname From emp Join dept on (emp.deptno = dept.deptno);  

若是等值连接还有另一种简便的写法,如以上可写成:

Select ename,dname From emp Join dept using (deptno);  

但是不推荐这一种写法,因为这种写法不易让人理解,也容易出错join连接3个表,这种写法比用

     where更容易理解,如下:

Select 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%’;  

左外连接:会把左边那张表的多余的数据(不能和另外一张表产生连接的数据)显示出来

     左向外联接的结果集包括left子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某

     行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

Select e1.ename,e2.ename From emp e1 left join emp e2 On (e1.mgr = e2.emptno);  

右内连接: 右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有

     匹配行,则将为左表返回空值

Select ename,dname From emp e right join dept d on (e.deptno = d.deptno);  

完整连接: 完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的

    选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值

Select ename,dname From emp e full join dept d on (e.deptno = d.deptno);  

select小结:select实例:

--求部门中哪些人的薪水最高

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 deptno,avg_sal,grade From (select deptno,avg(sal) From emp Group by deptno) t Join salgrade s On (t.avg_sal between s.local and s.hisal)  

--比普通员工的最高薪水还要高的经理人名称

select ename from emp where empno in ( select distinct mgr from emp where mgr is not null ) and sal > ( select max(sal) from emp where empno not in( select distinct mgr from emp where mgr is not null ) )  

最后说一个面试题:比较下面两条语句的执行效率:

Select * from emp where deptno = 10 and ename like ‘%A%’; Select * from emp where ename like ‘%A%’ and deptno = 10;  

       两条语句在执行时理论上是第一条效率较高,因为匹配数字比匹配字符串更快,所以先过滤掉数字效率

   会更高些但是在实际应用中,比如oracle数据库中,在使用第2条语句时,oracle会自动优化查询,它仍

   然会像第1条语句那样执行,所以在具体的数据库中他们的效率还要看具体情况

 

 

 

 

 

 

你可能感兴趣的:(JOIN,oracle,sql,数据库,面试,null)