SQLCookBook第三章学习日记10
2016-11-16 21:39
253 查看
3.11从多个表中返回丢失的数据
问题:同时返回多个表中丢失的数据。要从表dept中返回emp不存在的行(所有没有员工的部门)需要做外联结。考虑下面的查询。它返回表dept中的deptno和name字段,以及每个部门中所有员工的姓名。(如果该某个部门有员工的话):
select d.deptno, d.dname, e.ename from dept d left outer join emp e on (d.deptno = 3.deptno)
最后一行operations部门,尽管该部门没有员工,还是返回了这一行,因为表emp被外联结到了表dept。现在,假设有一个员工没有部门,那么如何得到在上述的结果集,并未该没有部门的员工返回一行呢?换句话说,要在同一个的查询中国同时外联接到表emp和dept。在创建新员工之前,开始可能会这么做:
insert into emp (empno,ename,job,mgr,hiredae,sal,comm,deptno) select 1111,'YODA','JEDI',null,hiredate,sal,comm,null from emp where ename = 'KINg'
select d.deptno,d.name,e.ename from dept d right outer join emp e on (d.deptno = e.deptno)
使用外联结是想返回新创建的员工,但却将原结果集中的operations部门丢掉了。最终的结果集萤微员工YODA和部门operations各返回一行。
解决方案:使用基于公共之的完全外联结来返回这两个表中丢失的数据。
DB2,MySQL,PostgreSQL和SQL Server
显示使用full outer join命令返回两个表中丢失的行为以及所有匹配的行;
select d.deptno,d.name,e.ename from dept d full outer join emp e on (d.deptno = e.deptno)
或者,合并两个不同外联结的结果:
select d.deptno,d.dname,e.ename, from dept d right outer jin emp e on(d.deptno = e.deptno) union select d.deptno ,d.dname,e.ename from dept d, emp e on (d.deptno = e.deptno)
Oracle
如果使用Oracle9iDatabase及以后的版本,上树的两种解决方案都可以使用,也可以使用Oracle所持有的外联结语法,在Oracle9i Database及其以前的版本中,只能应用此语法来解决上述问题。
select d.deptno, d.name, e.ename from dept d, emp e where d.deptno = e.deptno(+) union select d.deptno, d.dname, e.ename from dept d, emp e where d.deptno(+) = e.deptno
讨论
完全外联结就是所有的表的外联结简单的合并,想要知道完全外联结的详细内幕只需运行每个外联结,然后合并结果集即可。下面的查询返回表dept的所有行及表emp中与之匹配的行(如果有的话):
select d.deptno ,d.dname,e.ename from dept d left oter join emp e on (d.deptno = e.deptno)
下面的查询返回表emp的所有行及表dept中与之匹配的行(如果有的话):
select d.deptno, d.dname, e.ename from dept d right outer jpin emp e on (d.deptno = e.deptno)
这两个查询合并的结果就是最终的结果集。
3.12在运算和比较时使用NULL值
问题:NULL值永远不会等于或不等于任何值,也包括NULL值自己,但是需要像计算真实值一样计算可为空列的返回值。例如,需要在表emp中查出所有比“WARD”提成(COMM)低的员工,提成为NULL(空)的员工也应当包括在其中。
解决方案:
使用coalesce函数将NULL值转换为一个可以用来作为标准值进行比较的真实值:
select ename,comm from emp where coalesce(comm,0) < ( select comm from emp where ename = 'WARD' )
讨论:
coalesce函数从值列表中返回第一个非NULL值。当遇到NULL值是将其替换为0,这样就可以同Ward的提成进行比较了,也可以将coalesce函数放置在select列表中:
select ename,comm,coalesce(comm ,0) from emp where coalesce(comm , 0) < ( select comm from emp where ename = 'WARD' )
相关文章推荐
- SQLCookBook第三章学习日记5
- SQLCookBook第三章学习日记7
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记10)
- SQLCookBook第三章学习日记6
- SQLCookBook第三章学习日记9
- SQLCookBook第三章学习日记8
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记5)
- java学习日记10——Unicode编码
- 黑马程序员--Java学习日记10_交通灯系统
- 黑马程序员_Java学习日记10_集合框架2
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记3)
- 我的java学习日记(10)
- 黑马程序员--网络编程--java学习日记10(基础知识)
- testng学习日记-10/21
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记1)
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记2上)
- android学习日记10--裁剪裁剪 -
- 黑马程序员_学习日记10_复习C#(基础)
- testng学习日记-10/19
- Entity Framework Code First 学习日记(10)-兼容遗留数据库