博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle_4 sql标准 连接 select小结
阅读量:5082 次
发布时间:2019-06-13

本文共 1969 字,大约阅读时间需要 6 分钟。

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条语句那样执行,所以在具体的数据库中他们的效率还要看具体情况

 

 

 

 

 

 

转载于:https://www.cnblogs.com/springside6/archive/2011/02/24/2525464.html

你可能感兴趣的文章
阿里云:linux 一键安装web环境
查看>>
开启新的篇章——2018我的梦想
查看>>
grpc类型
查看>>
C#程序如何捕捉未try/catch的异常——不弹“XXX已停止工作”报错框
查看>>
Maven运行测试
查看>>
JS:export 与export default的区别,结合import的用法
查看>>
正则表达式
查看>>
浅谈树状数组
查看>>
Oracle 数据库表分区
查看>>
Django Template
查看>>
java中的算术运算符、赋值运算符、比较运算符、逻辑运算符、条件运算符
查看>>
Android常用开发使用全局Application
查看>>
Impala查询详解
查看>>
第九章、使用枚举和结构创建值类型
查看>>
Codevs_1230_元素查找_(set/Hash)
查看>>
计算几何基础
查看>>
Java开发环境搭建
查看>>
c# 初识WPF
查看>>
[寻路][导航][算法][地图开发]寻路算法的对比优势2
查看>>
dll和ocx的简单理解
查看>>