您的位置:首页 > 数据库 > Oracle

oracle数据库sql语句left join,right join,inner join的条件on和where的区别

2017-06-14 16:56 856 查看
1.left join,right join

select * from a left join b on a.id = b.id and a.id ='12'  

此sql语句效果:结果中a表筛选无效(即a表不是意愿中只有id='12'的行,而是a表全表记录依然都在,a.id='12'条件筛选无效果)

原因:a和b左连接的时候,无论条件是什么,都会把a的所有记录呈现出来,on后面的条件只能对b进行筛选,对a筛选无效。

同样右连接:select * from a right join b on 条件1 and 条件2 中

无论条件是什么,b中的所有记录都会呈现,条件1和条件2甚至更多的条件,只能对表a进行筛选,对b筛选同样无效。

 

2,inner join

select * from a inner join b on a.id = b.id and a.id='12' (或b.id='12')

在左连接和右连接中,由于一边的表不受条件会限制呈现出所有记录,故而条件只能针对另一边的表进行筛选。而内连接却不同,它呈现出的记录中两表完全受条件限制,条件既可以针对a表进行筛选,同样也可以针对b表进行筛选。

此连接效果等同于:select * from a,b where a.id=b.id and a.id='12'(或b.id='12')

 

总结:

左连接和右连接on条件只能筛选一边,内连接可以筛选任何一边的表,和对笛卡尔积进行的等值连接效果一样。

在左连接中,若要对左表的结果进行筛选,可以在on后加入where条件,如同:

select * from a left join b on a.id = b.id where a.id='12'

此时结果左表记录将仅剩下id='12'的行集,同样适用此方法也可对右连接的右表进行筛选。

事实上select * from a left join b on a.id = b.id 执行后,其结果存放在一个临时表中,where 条件则是针对临时表中的记录集进行筛选,故而最后结果中左表才会被成功筛选。


数据库外连接,自然连接,内连接,条件连接,等值连接关系及详解

Join操作基本分为3大类:外连接(细分为:左连接、右连接、全连接)、自然连接、内连接

Join操作的共性:第一步均为将所有参与操作的表进行了一个笛卡儿积,然后才依据各连接

条件进行记录的筛选

SQL> select * from employees;
NAME
DEPARTMENT_ID
SALARY
Getz
10
3000
Davis
20
1500
King
20
2200
Davis
30
5000
Kochhar
 
5000
SQL> select * from departments;
DEPARTMENT_ID
DEPARTMENT_NAME
10
Sales
20
Marketing
30
Accounts
40
Administration
------------------Left outer join----------------

SQL> select * from employees e left outer join departments d on e.department_id=d.department_id;

 

附加:Oracle9i以前版本中左连接的写法如下:

SQL> select * from employees e ,departments d on e.department_id=d.department_id(+);

---------------------------Right outer join------------------------

SQL> select * from employees right outer join departments using(department_id);

 

附加:Oracle9i以前版本中左连接的写法如下:

SQL> select * from employees e ,departments d where e.department_id(+)=d.department_id;

--------------------------------Full join----------------------------

SQL> select * from employees full join departments using(department_id);

 

说明:[1]外连接必须使用on或using子句提供相应的连接条件

[2]不能为using子句中所列举的列指定表别名,即使在group by和select子句中也是如此

[3]外连接规则:左连右补,右连左补,全连左右合并

如:对表departments表进行右连接时,在两表完成笛卡儿积后再依据连接条件 using(department_id)来筛选两表中department_id值相同的记录,但对DEPARTMENT_ID=40

employees表中没有与之匹配的记录,按常理此DEPARTMENT_ID=40所对应的记录将被抛

弃,但就是为了保全连接表(departments表)中的所有记录就必须在employees表中虚拟出

一条与之匹配的记录来保全连接表的所有记录,当然这条虚拟的记录显示时值全为null

 

 

--------------------------Natural join-----------------------------

SQL> select * from employees natural join departments;

 

说明:自然连接是通过对参与表关系中所有同名的属性对取等(即相等比较)来完成的,故无须自己添加连接条件

与外连接的区别在于对于无法匹配的记录外连接会虚拟一条与之匹配的记录来保全连接表中的所有记录,但自然连接不会

----------------------Inner join----------------

SQL> select * from employees inner join departments using(department_id);

 

说明:内连接与自然连接基本相同,不同之处在于自然连接只能是同名属性的等值连接,而内连接可以使用using或on子句来指定连接条件,连接条件中指出某两字段相等(可以不同名)。


 

-------------------------------------------------------------------------------------------------------------------

连接的概念:

连接分为条件连接、等值连接和自然连接三种。

1、条件连接就是在多个表的笛卡尔积中选取满足条件的行的连接,例如 select * from A,B where A.a > A.b 之类的有条件的查询。

2、等值连接就是特殊的条件连接,当条件为某字段=某字段时,即为等值连接。如SELECT ename,sal,dname FROM emp,dept WHERE emp.deptno=dept.deptno;

3、自然连接是一种特殊的等值连接,他要求多个表有相同的属性字段,然后条件为相同的属性字段值相等,最后再将表中重复的属性字段去掉,即为自然连接。如A中a,b,c字段,B中有c,d字段,则select * from A natural join B 相当于 select A.a,A.b,A.c,B.d from A.c = B.c 。

 

内连接与等值连接的区别:

内连接:两个表(或连接)中某一数据项相等的连接称为内连接。等值连接一般用where字句设置条件,内连接一般用on字句设置条件,但内连接与等值连接效果是相同的。

内连接与等值连接其实是一回事情(等效)。

经常有人会问到select a.id,b.name from a,b where a.id=b.pid 与

select a.id,b.name from a inner join b on a.id=b.pid 有什么区别,哪个效率更高一些。

实际上一回事情了。只是内连接是由SQL 1999规则定的书写方式。两个说的是一码事。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: