数据库表的连接有:
1.内连接(自然连接):只有两个表相匹配的行才能在结果集中显示出来
2.外连接,包括三种:
2-1 左外连接(左表是基表,右表是匹配表,左表全部显示,右表只显示匹配的记录)
2-2 右外连接(右表是基表,左表是匹配表,右表全部显示,左表只显示匹配的记录)
2-3 全外连接(左右两表所有的记录都显示出来)
3.自连接(连接发生在一张基表内)
inner join 表示内连接;left join表示左外连接;right join表示右外连接;full join表示完全外连接。on 子句用于指定连接条件。
注意:如果使用from子句指定内、外连接,则必须使用on子句指定连接条件;如果使用(+)操作符指定外连接,则必须使用where子句指定连接条件。
如果主表的 主键列 和从表的 外部键列 名称相同,那么可以使用 natural join 关键字自动执行内连接操作
select id,name from table1 natural join table2;
举例子
create table1(a int,b int);
create table2(a int,b int);
内连接 select * from table1 a,table2 b where a.a=b.a;
左连接 select * from table1 a,table2 b where a.a=b.a(+);
右连接 select * from table1 a,table2 b where a.a(+)=b.a;
完全连接 select * from table1 a,table2 b where a.a=b.a(+)
union
select * from table1 a,table2 b where a.a(+)=b.a;
笛卡尔积 select * from table1,table2;
如果a表有5行,b表有10行,则笛卡尔积之后一共有5*10=50行。
Oracle外连接
(1)左外连接(左边的表不加限制)
(2)右外连接(右边的表不加限制)
(3)全外连接(左右两边的表都不加限制)
外连接(Outer Join)
外连接会返回每个满足第一个(顶端)输入与第二个(底端)输入的连接的行。它还会返回 任何在第二个输入中没有匹配行的第一个输入中的行。外连接有三种:左外连接、右外连接、全外连接,对应的SQL语句是LEFT/RIGHT/FULL OUTER JOIN。通常我们省略outer这个关键字,写成:LEFT/RIGHT/FULL JOIN.
在左外连接和右外连接的时候都会以一张表作为基表,该表的内容会全部显示,然后在加上两张表匹配的内容。如果基表的数据在另一张表中没有记录,那么在相关联的结果集行中列显示为空值。
对于外连接,也可以使用(+)来表示,使用(+)号时要注意一些事项:
1>(+)号操作符只能出现在where子句中,并且不能和outer join语法同时使用。
2>当使用(+)操作符执行外连接时,如果在where子句中包含多个条件,则必须所有的条件都包含(+)操作符。
3>(+)操作符只适用于列,不能用在表达式上。
4>(+)操作符不能与or和in操作符一起使用.
5>(+)操作符只能用于实现左外连接和右外连接,不能用于实现完全外连接。
举例子:
这里有两张表:dava表(左表)和bi表(右表)
select * from bi;
ID NAME
1 dave
2 bi
3 big bird
4 exc
9 怀宁
select * from dave
ID NAME
8 安庆
1 dava
2 bl
1 bl
2 dava
3 dba
4 sf
5 dmm
1.左外连接( left join)
left join是以左边表的记录为基础,它的结果集是dave表中的数据,再加上dave表和bi表匹配的数据。话句话说,左表(dave)的记录会全部显示出来,而右表(bl)只会显示出符合搜索条件的记录,bi表记录不足的地方均为null。
写法示例:select * from dave a left join bi b on a.id=b.id;
ID NAME ID NAME
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf 4 exc
5 dmm --此处B表为null,没有匹配到
8 安庆 --此处B表为null,没有匹配到
写法示例:select * from dave a left outer join bl b on a.id = b.id;
ID NAME ID NAME
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf 4 exc
5 dmm
8 安庆
用(+)来实现,+号表示补充,即哪个表有+号,这个表就是匹配表。因此,加号写在右表,则右表是匹配表,左表是基表,左表全部显示,即是左连接。
写法示例:select * from dave a,bl,b where a.id=b.id(+); --注意,使用(+)就要使用关键字where
ID NAME ID NAME
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf 4 exc
5 dmm
8 安庆
2.右外连接
右外连接是以右表(bl)为基础,因此,会显示bl表的所有记录,再加上dave和bl匹配的结果,dave表不足的地方使用null填充。
写法示例:select * from dave a right join bl b on a.id=b.id;
左表 右表
ID NAME ID NAME
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 怀宁 --此处左表不足用Null 填充
(+)的写法示例:select * from dave a,bi b where a.id(+)=b.id;
左表 右表
ID NAME ID NAME
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 怀宁
3.全外连接
左表的右表都不做限制,所有的记录都显示,两表不足的地方用null表示。全外连接不支持(+)这种写法。
写法示例:select * from dave a full join bl b on a.id=b.id;
ID NAME ID NAME
8 安庆
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf 4 exc
5 dmm
9 怀宁