连接分为条件连接、等值连接和自然连接三种。
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 。
natural join:自然连接(不允许带on/using)
内连接:两个表(或连接)中某一数据项相等的连接称为内连接。等值连接一般用where字句设置条件,内连接一般用on字句设置条件,但内连接与等值连接效果是相同的。
内连接与等值连接其实是一回事情(等效)。可以查看:https://blog.csdn.net/huanghanqian/article/details/52847835
经常有人会问到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规则定的书写方式。两个说的是一码事。
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子句来指定连接条件,连接条件中指出某两字段相等(可以不同名)。