在聊到多表查询前,我们不得不谈到笛卡尔乘积的概念。在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 子句使语句具有更高的易读性。