群内经常有人问,简单总结一下,刚接触时可能有些不太好理解:[@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关联。