8.3 多表查询
多表查询是指使用SELECT语句从多个表中查询数据,多个表之间通过主外键关系进行关联。在Oracle中,多表查询有两种写法,一种是由ANSI制定的标准的连接语法;另一种是由Oracle自由地连接语法。
8.3.1 多表查询分类
大多数情况下从一个表中很难获取到比较全面的信息,比如要查询emp表中每个员工的部门名称,由于部门名称存储在dept表中,emp表通过deptno与dept表进行了主外键关联。因此要在查询结果中包含部门名称的话,必须要同时查询emp表和dept表来获取数据。
连接其实就是一种普通的SQL语句,只是在FROM部分要指定多个表名称,同时使用表别名进行区分,Oracle将根据连接所要返回的结果数据进行分类,在Oracle中主要有3种类型的连接。
内连接:这种连接返回既满足A表又满足B表的行,只有连接(join)的条件满足才返回,否则不会返回任何数据。
外连接:外连接是内连接的扩展,外连接返回符合条件的行,同时可以根据指定的条件返回不满足连接条件的左边的表行或者是右边的表行。外连接又分为左外连接和右外连接。
自连接:是指一个表连接到自身,比如emp表中每个员工属于一个经理,经理的员工编号也存在于emp表中,因此可以说mgr和emp是自连接关系。
学习多表连接查询有一个好的办法,TOAD提供了一个名为Query Builder的可视化查询设计器,下面通过一个例子学习如何通过可视化的工具来创建多表查询,步骤如下所示:
(1)启动TOAD,使用scott/tiger用户登录进入到数据库,选择"Database|Report|Query Builder"选项,将进入到TOAD提供的查询设计器窗口,如图8.4所示。
(点击查看大图)图8.4 TOAD的查询设计器窗口
如果对象面板没有显示出来,请用鼠标右键单击设计器面板,从弹出的菜单中选择"Object Palette"选项。
(2)从对象面板中拖emp和dept表到设计器面板,可以通过"Ctrl+表名称"进行多选。此时可以看到两个表已经加入到了查询设计器面板。通过拖动emp表中的deptno字段到dept表的deptno主键字段,TOAD将自动创建两个表之间的连接,并且在"Generated Query"选项卡中显示生成的SQL语句,如图8.5所示。
(3)在设计器中,通过选中表字段左侧的复选框选择要查询的列,可以看到生成的SQL语句会自动加入所选择的字段。如果要改变emp和dept表之间的连接,可以双击表与表之间的连接线,如图8.6所示。
在弹出的"View Joins"窗口中,可以看到两个表的连接方式,同时提供了内连接(Inner Join)和外连接(Outer Join)的选择项,在"Join Test"连接测试中,可以指定deptno的连接方式。这里使用默认的内连接,如果需要更改,只需要选中单选按钮即可。
(点击查看大图)图8.5 拖动表名称产生查询语句
(点击查看大图)图8.6 更改多表查询的连接方式
(4)在设计完了连接查询后,可以单击工具栏上的 图标执行查询,或者将语句复制到SQL*Plus中执行,设计器生成的查询语句如下所示:
SELECTdept.deptno,dept.dname,dept.loc,emp.empno,emp.ename,emp.job,
emp.hiredate,emp.mgr,emp.sal,m
FROMscott.dept,scott.emp
WHERE((emp.deptno=dept.deptno))
在了解了这个方便的功能后,接下来学习一下这几种连接的实现方式和异同之处。
【责任编辑:book TEL:(010)68476606】
点赞 0