ITPub博客

首页 > 数据库 > 数据库开发技术 > 表与表之间连接式on,using以及自然连接的区别

表与表之间连接式on,using以及自然连接的区别

原创 数据库开发技术 作者:warehouse 时间:2011-11-22 19:54:07 2 删除 编辑
群内经常有人问,简单总结一下,刚接触时可能有些不太好理解:[@more@]

on比较好理解,on后面可以出现关联条件也可以出现非关联条件:

SQL> create table t1(id int) tablespace users;

表已创建。

SQL> create table t2(id int,name varchar2(10)) tablespace users;

表已创建。

SQL> select t1.*,t2.* from t1 join t2 on t1.id=t2.id and t2.name='a';

未选定行

SQL> insert into t1 values(1);

已创建 1 行。

SQL> insert into t2 values(1,'a');

已创建 1 行。

SQL> insert into t2 values(2,'b');

已创建 1 行。

SQL> insert into t2 values(2,'a');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select t1.*,t2.* from t1 join t2 on t1.id=t2.id and t2.name='a';

ID ID NAME
---------- ---------- ----------
1 1 a

--========================

下面是using:

SQL> select t1.*,t2.* from t1 join t2 using(id);
select t1.*,t2.* from t1 join t2 using(id)
*
第 1 行出现错误:
ORA-25154: USING 子句的列部分不能有限定词


SQL> select t1.id,t2.id,t2.name from t1 join t2 using(id);
select t1.id,t2.id,t2.name from t1 join t2 using(id)
*
第 1 行出现错误:
ORA-25154: USING 子句的列部分不能有限定词


SQL> select id,name from t1 join t2 using(id);

ID NAME
---------- ----------
1 a

SQL> alter table t1 add name varchar2(10) default 'a';

表已更改。

SQL> select id,name from t1 join t2 using(id,name);

ID NAME
---------- ----------
1 a

SQL> select id,name from t1 join t2 using(id);
select id,name from t1 join t2 using(id)
*
第 1 行出现错误:
ORA-00918: 未明确定义列


SQL> select id,t2.name from t1 join t2 using(id);

ID NAME
---------- ----------
1 a

SQL> select t2.id,t2.name from t1 join t2 using(id);
select t2.id,t2.name from t1 join t2 using(id)
*
第 1 行出现错误:
ORA-25154: USING 子句的列部分不能有限定词


SQL> select id,name from t1 join t2 using(id,name);

ID NAME
---------- ----------
1 a

SQL> select id,name from t1 join t2 using(id,name);

所谓不能有限定词是指using里面的字段前面不能有表别名。使用using要求表里必须有相同的字段,看的出来using和on想必灵活性差多了。

--==================================

自然连接:

SQL> select id,name from t1 natural join t2;

ID NAME
---------- ----------
1 a

SQL> select t1.id,t2.name from t1 natural join t2;
select t1.id,t2.name from t1 natural join t2
*
第 1 行出现错误:
ORA-25155: NATURAL 联接中使用的列不能有限定词


SQL>

所谓的自然连接就是说oracle会自动使用表里面相同的字段进行连接,这其实没多少意义。同样我们发现自然链接的字段前面不允许有限定词(表别名),这和using很相似。只不过using是和inner和outer join结合使用的,我到时觉得using应该和natural join结合使用更灵活,比如:

SQL> select id ,name from t1 natural join t2 using(id);
select id ,name from t1 natural join t2 using(id)
*
第 1 行出现错误:
ORA-00933: SQL 命令未正确结束


SQL>

如果上面sql可以执行,那么就说明我们只需要通过id进行关联,不需要name关联。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19602/viewspace-1056486/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-07

  • 博文量
    717
  • 访问量
    5366221