多表查询

在聊到多表查询前,我们不得不谈到笛卡尔乘积的概念。在sql查询中,如果出现了笛卡尔乘积,一般都会大幅度的降低查询效率。所以我们一般在进行多表查询的时候尽量避免出现笛卡尔乘积。

笛卡尔乘积的出现主要是因为在进行多表查询的时候:1、省略了连接条件,2、查询条件无效,3、所有表的所有行都互相连接。

为了避免出现笛卡尔乘积,我们在加入where条件的时候注意条件的有效性。


在进行多表查询的时候,需要注意不同表之间出现的重复列名。此时最好添加表名前缀区分多表中相同的列名,并且,使用表名可以提高效率。在不同表中具有相同列名的列可以用别名加以区分。其实使用别名不但可以简化查询,并且使用表名前缀可以提高查询效率。连接n个表则至少需要n-1个连接条件。

非等值连接:

eg:SELECT e.last_name, e.salary, j.grade_level FROM   employees e, job_grades j WHERE  e.salary  BETWEEN j.lowest_sal AND j.highest_sal;

外连接:

左外连接:left  (outer)  join;右外连接:right  (outer)  join;full (outer) join ;oracle 也可以用+号来表示,+ 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示,故是左连接。

如图就显示e和d表条件关联的数据和d表中有,e表中没有的数据。


自然连接:nature join

虽然natural join(自然连接)实际上的用的比较少,但实际上这个连接是非常有用的,若能经常使用一下,实际上是非常方便的。

自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。

来看一下自然连接的例子。

Select emp.ename,dept.dname

From emp natural join dept;

这里我们并没有指定连接的条件,实际上oracle为我们自作主张的将,emp中的deptno和dept中的deptno做了连接。

也就是实际上相当于

Select emp.ename,dept.dname

From emp join dept on emp.deptno = dept.deptno;

因为这两张表的这两个字段deptno的类型个名称完全相同。所以使用natural join时被自然的连接在一起了。

另外:

1.如果做自然连接的两个表的有多个字段都满足有相同名称个类型,那么他们会被作为自然连接的条件。

2.如果自然连接的两个表仅是字段名称相同,但数据类型不同,那么将会返回一个错误。

3.由于oracle中可以进行这种非常简单的natural join,我们在设计表时,应该尽量在不同表中具有相同含义的字段使用相同的名字和数据类型。以方便以后使用natural join

最后我们在前面举的例子都得到以下的结果:

SQL> Select emp.ename,dept.dname

2 From emp natural join dept;

ENAME DNAME

——————– —————-

SMITH RESEARCH

ALLEN SALES

WARD SALES

JONES RESEARCH

MARTIN SALES

BLAKE SALES

CLARK ACCOUNTING

SCOTT RESEARCH

KING ACCOUNTING

TURNER SALES

ADAMS RESEARCH

JAMES SALES

FORD RESEARCH

MILLER ACCOUNTING


使用 USING 子句创建连接

在NATURAL JOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的列。
使用 USING 可以在有多个列满足条件时进行选择。
不要给选中的列中加上表名前缀或别名。
NATURAL JOIN 和 USING 子句经常同时使用。



使用ON 子句创建连接:

自然连接中是以具有相同名字的列为连接条件的。
可以使用 ON 子句指定额外的连接条件。
这个连接条件是与其它条件分开的。
ON 子句使语句具有更高的易读性。









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值