注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

程序员小站

J2EE丨Spring | JVM | Scala

 
 
 

日志

 
 

多表查询笔记  

2012-02-11 01:35:00|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

多表查询的基本概念

在之前所使用的查询操作中,都是从一张之中查出所有内容,那么如果需要在一个查询语句中显示多张表的数据,则就要用到多表查询。

select * from emp;

如果此时数据量很大的话 会造成系统死机。

老鸟的做法:

select count(*) from emp;

select * from emp,dept;  得到56条记录  emp14条 dept 4

问题的关键是 : 一条数据对应另一张表的所有数据 也就是总共 14*4

这个积在数据库中成为笛卡尔积。这种查询结果不是用户希望的数据。

最简单的方式是采用关联字段的形式。

select * from emp ,dept where emp.deptno=dept.deptno;

如果不同表中有相同字段,则需要用 表.字段 || 也可以用别名

这种方式虽然能得到需要的数据 , 但没有消除笛卡尔积的问题

性能差有一个前提:数据量大。

sh用户的大数据表为

select count(*) from sales,costs where sales.prod_id=costs.prod_id

单表查询比多表查询性能好。不到万不得已的时候不要用多表查询

select * from emp e,dept d where e.deptno=d.deptno;

有连接条件,就不是笛卡尔集了,只有在无条件连接,才会出现笛卡尔集 

像上面的大数据 ,虽然得到了想要的结果 ,但是两个表的prod_id并不是关联字段 所以照样会产生笛卡尔积。

查询出每一位雇员的编号,姓名,职位,部门名称,位置。

|- emp 表:可以查询编号,姓名,职位 

|-dept  表:部门名称,位置。

select e.empno,e.ename,e.job,d.dname,d.loc from emp e ,dept d where e.deptno=d.deptno;

查询 每一位雇员的姓名 职位 领导的姓名    自身关联

第一步每一位每一位雇员姓名职位

select e.ename,e.job from emp e;

第二步 查询领导信息

select e.ename,e.job,m.ename from emp e,emp m where e.mgr=m.empno;

只得到13条数据 其中一条数据没有领导 ; 需要用到左右关联。

select e.empno,e.ename,e.sal,m.ename from emp e,emp m where e.mgr = m.empno;

select e.empno,e.ename,e.sal,m.ename,d.dname,d.loc 

from emp e,emp m,dept d

where e.mgr = m.empno AND e.deptno=d.deptno;

确定工资等级。

1确定所需的数据库表,

确定已知的关联字段。

select e.empno,e.ename,e.sal,d.dname,s.grade

from emp e,dept d,salgrade s

where e.deptno=d.deptno and e.sal between s.losal and s.hisal;

select e.empno,e.ename,e.sal,d.dname,DECODE(s.grade,1,'第一等工资',2,'第二等工资',3,'第三等工资',4,'第四等工资',5,'第五等工资')

from emp e,dept d,salgrade s

where e.deptno=d.deptno and e.sal between s.losal and s.hisal;

只要是表关联,用于消除笛卡尔积,只是这种关联字段需要根据情况使用不同的限定符号。

左右连接:

关于左右连接指的就是查询判断条件的参考方向,例如:

select * from emp e,dept d where e.deptno=d.deptno; //14条记录

没有DEPTNO=40 的数据项,说明现在查询是以emp为参考方向的,改变参考方向就需要左右连接

select * from emp e,dept d where e.deptno(+)=d.deptno; //15条记录

(+)=  :左连接

=(+)  :右连接

没必要刻意的记,查询时再调试即可。

  评论这张
 
阅读(266)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018