数据表的链接有: 一、内链接(天然链接): 只有两个表相匹配的行才能在结果集中出现 二、外链接: 包括 (1)左外链接 (左边的表不加限制) (2)右外链接(右边的表不加限制) (3)全外链接(左右两表都不加限制) 三、自链接(链接发生在一 张基表内) sql标准语法: select table1.column,table2.column from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2; inner join 表示内链接;left join表示左外链接;right join表示右外链接;full join表示彻底外链接; on子句用于指定链接条件。注意,若是使用from子句指定内、外链接,则必需要使用on子句指定链接条件; 若是使用(+)操做符指定外链接,则必须使用where子句指定链接条件。 若是主表的主键列和从表的外部键列名称相同,那么可使用 natural join 关键字自动执行内链接操做。 select dname,ename from dept natural join emp; select a.studentno, a.studentname, b.classname from students a, classes b where a.classid(+) = b.classid; STUDENTNO STUDENTNAM CLASSNAME ---------- ---------- ------------------------------ 1 周虎 一年级一班 2 周林 一年级二班 一年级三班 以上语句是右链接: 即"(+)"所在位置的另外一侧为链接的方向,右链接说明 等号右侧的全部 记录均会被显示,不管其在左侧是否获得匹配。也就是说上例中,无 论会不会出现某个班级没有一个学生的状况,这个班级的 名字都会在 查询结构中出现。 反之: select a.studentno, a.studentname, b.classname from students a, classes b where a.classid = b.classid(+); STUDENTNO STUDENTNAM CLASSNAME ---------- ---------- ------------------------------ 1 周虎 一年级一班 2 周林 一年级二班 3 钟林达 则是左链接,不管这个学生有没有一个能在一个班级中获得匹配的部门号, 这 个学生的记录都会被显示。 select a.studentno, a.studentname, b.classname from students a, classes b where a.classid = b.classid; 这个则是一般 用到的内链接,显示两表都符合条件的记录 总之, 左链接显示左边所有的和右边与左边相同的 右链接显示右边所有的和左边与右边 相同的 内链接是只显示知足条件的! ...... ---------------------------------------------------------------- 补充: 使用(+)的注意事项: 1.(+)操做符只能出如今where子句中,而且不能与outer join语法同时使用。 2.当使用(+)操做符执行外链接时,若是在where子句中包含有多个条件,则必须在全部条件中都包含(+)操做符。 3.(+)操做符只适用于列,而不能用在表达式上。 4.(+)操做符不能与or和in操做符一块儿使用。 5.(+)操做符只能用于实现左外链接和右外链接,而不能用于实现彻底外链接。 for example: select a.dname,b.ename from dept a,emp b where a.deptno = b.deptno(+) and b.deptno(+) = 10; =============================== 如下的文章主要是经过代码的方式来引出Oracle join的正确用法,其在实际中的应用比例仍是占为多数的,若是你对这一新开发的技术,心存好奇的话,如下的文章将会揭开它的神秘面纱。但愿你在浏览完以后会有所收获。 8i: create table dali.test1(a int,b int); create table dali.test2(a int,b int); insert into dali.test1 values(1,456); insert into dali.test1 values(2,427); insert into dali.test2 values(1,45456); insert into dali.test2 values(3,45656); 内链接 select * from dali.test1 a, dali.test2 b where a.a=b.a; 左链接 select * from dali.test1 a, dali.test2 b where a.a=b.a(+); 右链接 select * from dali.test1 a, dali.test2 b where a.a(+)=b.a; 彻底链接 select * from dali.test1 a, dali.test2 b where a.a=b.a(+) union select * from dali.test1 a, dali.test2 b where a.a(+)=b.a; 迪卡尔 select * from dali.test1, dali.test2; '================================================================== 9i和sqlserver同样 left join,right join,full join 分为1. INNER JOIN 2. LEFT JOIN 3. RIGHT JOIN 4.LEFT OUTER JOIN 首先设定一个咱们要用的两个表 表A 表B ID NAME ID CLASS 1 IBM 1 C1 2 SONY 3 C3 3 BMW 4 C4 1 INNER JOIN: SELECT * FROM A INNER JOIN B ON A.ID=B.ID 得表 ID NAME CLASS 1 IBM C1 3 BMW C3 对了 就是 两个表的ID都存在并相同 获得这两个表的组合表 2 LEFT JOIN : SELECT * FROM A LEFT JOIN B ON A.ID=B.ID 得表 ID NAME CLASS 1 IBM C1 2 SONY null 3 BMW C3 没晕吧 若是还有方向感 就行 LEFT(左) 获得的是A(left语句的左边的表)的全部记录 而B表对应的记录没有的话也要补齐 (真霸道! 呵呵) 3 RIGHT JOIN : SELECT * FROM A RIGHT JOIN B ON A.ID=B.ID 得表 ID NAME CLASS 1 IBM C1 3 BMW C3 4 null C4 对了RIGHT(右) 获得的是B(right语句的右边的表)的全部记录 而A表对应的记录没有的话也要补齐 (我也翻身了! 呵呵) 4 FULL OUTER JOIN: SELECT * FROM A FULL OUTER JOIN B ON A.ID=B.ID 得表 ID NAME CLASS 1 IBM C1 2 SONY null 3 BMW C3 4 null C4