oracle中的多表连接

ⅰ亾dé卋堺 提交于 2020-03-26 15:00:59

3 月,跳不动了?>>>

简单连接:

简单连接仅仅是通过select子句和from子句来连接多个表,其查询结果是一个通过笛卡尔积所生成的表。在实际需求中,由于笛卡尔积包含了大量的冗余信息,一般没有任何意义,通常为了避免这种情况,在select语句提供一个连接条件,过滤无意义的数据。例如:


--学生表和性别表关联,拿学生表的性别id和性别表的id来关联过滤
select * from student s,gender g where s.gender = g.id;



Join连接:

1.内连接

内连接是一种常见的连接,用关键字inner join.innner可以省略,也就是说,只使用join连接的为内连接。连接的条件必须用on来进行条件匹配。如果还想进一步限制,则可以加where条件句。

如:

select * from student s join gender g on s.gender = g.id where s.name='张三';



2.自然连接

自然连接与内连接的功能类似,在使用自然连接查询多个表时,oracle会降低一个表中的那些列与第二个表中具有相同名称的列进行连接。在自然连接中,用户不需要明确指定进行连接的列。系统自动完成这一任务。自然连接在实际应用中很少。因为有个限制条件,连接的各个表之间必须有相同名称的列。但这在实际应用中可能和实际引用的含义发生矛盾。

3.外连接

外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,还列出左表(左外连接时候)、右表(右外连接时)或两个表(全外连接时)中所有复合搜索条件的数据行。完全外连接相当于同时执行一个左外连接和一个右外连接。然后将结果集合并,并消除重复记录行。

其中外连接还可以采用一种写法:

--这两种写法一致(右外连接)
select * from student s,gender g where s.gender(+) = g.id;
select * from student s right join gender g on s.gender = g.id;
--这两种写法一致(左外连接)
select * from student s,gender g where s.gender = g.id(+);
select * from student s left join gender g on s.gender = g.id;

4.自连接

自连接是在from子句中两次指定了同一个表,为了在其他子句中区分,分别为表指定了表别名。这样oracle就可以将两个表看作是分离的两个数据源,并且从中获取相应的数据。







易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!