1、NEW YORK20 RESEARCHDALLAS30 SALESCHICAGO40 OPERATIONSBOSTON select * from emp;EMPNO ENAMEJOBMGR HIREDATESALCOMMDEPTNO- - - - - - - -7369 SMITHCLERK7902 17-DEC-80800207499 ALLENSALESMAN7698 20-FEB-811600300307521 WARD7698 22-FEB-8112505007566 JONESMANAGER7839 02-APR-8129757654 MARTIN7698 28-SEP-81140
2、07698 BLAKE7839 01-MAY-8128507782 CLARK7839 09-JUN-812450107788 SCOTTANALYST7566 19-APR-8730007839 KINGPRESIDENT17-NOV-8150007844 TURNER7698 08-SEP-81150007876 ADAMS7788 23-MAY-8711007900 JAMES7698 03-DEC-819507902 FORD7566 03-DEC-817934 MILLER7782 23-JAN-821300当然了,为了将来能够方便操作,我们通常会在表上建立主外键约束关系(不是必须的
3、),并通过主外键的对应关系来找到我们想要的数据,在上面的两张表中deptno是dept表的主键,而deptno是emp表的外键。这其实就是Oracle的等值连接(或者称为内连接)想要达到的目的。比如我们有这样一个需求,找到员工表中的员工编号和员工名称以及他所在的部门编号、部门名称和部门所在地,我们来看一下实现的语句: select dept.deptno,dname,loc,empno,ename2from emp,dept3where emp.deptno=dept.deptno;LOCEMPNO ENAME- - - - -DALLAS7369 SMITHCHICAGO7499 ALLEN
4、7521 WARD7566 JONES7654 MARTIN7698 BLAKENEW YORK7782 CLARK7788 SCOTT7839 KING7844 TURNER7876 ADAMS7900 JAMES7902 FORD7934 MILLER这就是Oracle的等值连接,不过对于这样的一个语句来说,有三个地方最好做一些调整:1.不同表的列使用表的名称作为前缀(如果表使用了别名,前缀就不能再用表的真实名字)2.不使用表的原名称而使用表的别名,这样语句会更简短(有用吗?当然,oracle会把语句的完整文本放到内存中,语句越短,占内存越小)3.格式化语句,考虑折行、语句区分大小写(如果
5、你的语句有问题,没人愿意为你的乱七八糟的语句给出建议)以下是我的书写习惯,仅供参考select d.deptno,d.dname,d.loc,e.empno,e.enamefrom empe,dept dwhere e.deptno=d.deptno;以上的连接方法是Oracle自己的语法,当然对于这样的需求使用SQL99语法也非常的容易,并且可以使用其中的几种语法来实现,在这里我们仅以自然连接(natural join)来举一个小例子: select deptno,456e natural join dept d;当然对于自然连接,Oracle有一些限制,比如要求两个表的列的名称和数据类型一
6、样,另外,在做查询的时候,连接的列不能使用前缀,否则会报错ORA-25155: column used in NATURAL join cannot have qualifier,如果列的类型不一样的话,我们可以选择使用join using语法。等值连接是oracle数据库当中最简单也是使用最多的一种关联方式。我们再来看一下Oracle的外连接操作,凭心而论,Oracle的语法实现比SQL99外连接语法要简单一些,不过没有SQL99语法具体和完善,比如Oracle没有全外连接的概念。还是先来看一下为什么要使用外连接吧!如果我们有这样的一个需求,列出公司里所有的部门和部门下的员工,很显然,用上面
7、的等值连接是实现不了的。我们看到40部门是存在的,但是等值连接里并不能显示这样的记录,道理很简单,40部门没有一个员工,所以在和员工表做等值连接的时候无法显示出来,那如何来实现这样的需求呢?很简单Oracle提供了(+)这样的外连接方法我们来看下面的句子: select d.deptno,78where d.deptno=e.deptno(+);我们看到40部门(OPERATIONS)被显示出来了,当然由于他没有员工所以在员工信息部分会补空值。也许有人会有这样的疑问,where d.deptno=e.deptno(+)中的(+)符号是应该出现在那个表的列后面呢?是随意的吗?我们来稍微总结一下:
8、1.(+)只能在关联条件的一端出现,本例中是e.deptno(+),也可以说是e表的一边2.如果在where后面有其他的条件,那其他的所有条件都要使用(+)3.(+)出现在值少的一端,比如本例中,员工表没有员工能和40部门对应,我们认为员工表记录少我们来看部门表记录少的一个例子: update emp set deptno=null where empno=7369;1 row updated. commit;Commit complete.800通过修改,我们把7369(SMITH)的部门号置为空,这就意味着,当我们使用部门号deptno做等值查询时,7369不会显示出来,因为部门表没有一条记录可以和7369对应,现在的情况是员工表记录多,如果我们想要把7369显示,就要在少的一端(部门表列)上添加(+)where d.deptno(+)=e.deptno;- -
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1