简单来讲 主表a,子表b select a.*,b.* from a,b where a.id=b.id(+); 原因是子表b在a表中没有对应记录,但主表所有记录必须全显示,那做一个左连接,保证主表没有对应的记录情况下也全显示,而b表没有对应记录只能显示为null.
SQL> select id from tab1;ID ---------- 1 2 3SQL> select id from tab2;ID ---------- 2 3 4SQL> SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id;ID ID ---------- ---------- 2 2 3 3SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id(+)=tab2.id;ID ID ---------- ---------- 2 2 3 3 4SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id(+);ID ID ---------- ---------- 1 2 2 3 3 没有值可以“等联接”出来的字段为空值
SQL> select id from tab1;ID ---------- 1 2 3SQL> select id from tab2;ID ---------- 2 3 4SQL> SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id;ID ID ---------- ---------- 2 2 3 3SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id(+)=tab2.id;ID ID ---------- ---------- 2 2 3 3 4SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id(+);ID ID ---------- ---------- 1 2 2 3 3 没有值可以“等联接”出来的字段为空值
学生表 学号 姓名 0001 小李 0002 小王 0003 小朱 0004 小黄 选课表 学号 课程 0001 高数 0002 线数 0004 英语 0005 电脑--左(外)联接 SELECT 学生表.*, 选课表.课程 FROM 学生表, 选课表 WHERE 学生表.学号 = 选课表.学号(+) 查询的结果是: 学号 姓名 课程 0001 小李 高数 0002 小王 线数 0003 小朱 0004 小黄 电脑 学生表.学号 = 选课表.学号(+)表示 学生表(也就是左边的表)所有行都会被返回 即使选课表中没有相应的行与学生表中的行匹配--右(外)联接 SELECT 学生表.*, 选课表.课程 FROM 学生表, 选课表 WHERE 学生表.学号(+) = 选课表.学号 查询的结果是: 学号 姓名 课程 0001 小李 高数 0002 小王 线数 0004 小黄 电脑 0005 电脑 学生表.学号(+) = 选课表.学号表示 选课表(也就是右边的表)所有行都会被返回 即使学生表中没有相应的行与选课表中的行匹配 不同的数据库系统对外联接有不同的表示 有此根本不兼容如(还是以上例为基础)MS SQL SERVER 外联接的SQL写法 --左(外)联接 - 第一种写法 SELECT 学生表.*, 选课表.课程 FROM 学生表, 选课表 WHERE 学生表.学号 *= 选课表.学号 --左(外)联接 - 第二种写法 SELECT 学生表.*, 选课表.课程 FROM 学生表 LEFT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号 --右(外)联接 - 第一种写法 SELECT 学生表.*, 选课表.课程 FROM 学生表, 选课表 WHERE 学生表.学号 =* 选课表.学号 --右(外)联接 - 第二种写法 SELECT 学生表.*, 选课表.课程 FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号 --注:在MS SQL SERVER中,OUTER关健字可以省略ACCESS 外联接的SQL写法 --左(外)联接 - 第二种写法 SELECT 学生表.*, 选课表.课程 FROM 学生表 LEFT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号 --右(外)联接 - 第二种写法 SELECT 学生表.*, 选课表.课程 FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号 --注:在ACCESS中,关健字OUTER不可以省略ORACLE 外联接的SQL写法 --左(外)联接 - 第一种写法 SELECT 学生表.*, 选课表.课程 FROM 学生表, 选课表 WHERE 学生表.学号 = 选课表.学号(+) --右(外)联接 - 第一种写法 SELECT 学生表.*, 选课表.课程 FROM 学生表, 选课表 WHERE 学生表.学号(+) = 选课表.学号ORACLE直到9i才支持SQL-92外联接语法 LEFT (OUTER)JOIN和RIGHT (OUTER) JOIN 和MS SQL SERVER一样 关健字OUTER是可以省略的
LEFT OUTER JOIN—This returns all the rows from the table on the left side of the join, along with the values from the right-hand side, or nulls if a matching row doesn't exist.
RIGHT OUTER JOIN—This returns all the rows from the table on the right side of the join, along with the values from the left-hand side, or nulls if a matching row doesn't exist.
FULL OUTER JOIN—This returns all rows from both tables, filling in any blanks with nulls. There is no equivalent for this in Oracle8i.
oracle sql reference讲解很清楚。
主表a,子表b
select a.*,b.* from a,b where a.id=b.id(+);
原因是子表b在a表中没有对应记录,但主表所有记录必须全显示,那做一个左连接,保证主表没有对应的记录情况下也全显示,而b表没有对应记录只能显示为null.
----------
1
2
3SQL> select id from tab2;ID
----------
2
3
4SQL>
SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id;ID ID
---------- ----------
2 2
3 3SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id(+)=tab2.id;ID ID
---------- ----------
2 2
3 3
4SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id(+);ID ID
---------- ----------
1
2 2
3 3
没有值可以“等联接”出来的字段为空值
----------
1
2
3SQL> select id from tab2;ID
----------
2
3
4SQL>
SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id;ID ID
---------- ----------
2 2
3 3SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id(+)=tab2.id;ID ID
---------- ----------
2 2
3 3
4SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id(+);ID ID
---------- ----------
1
2 2
3 3
没有值可以“等联接”出来的字段为空值
学号 姓名
0001 小李
0002 小王
0003 小朱
0004 小黄
选课表
学号 课程
0001 高数
0002 线数
0004 英语
0005 电脑--左(外)联接
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号 = 选课表.学号(+)
查询的结果是:
学号 姓名 课程
0001 小李 高数
0002 小王 线数
0003 小朱
0004 小黄 电脑
学生表.学号 = 选课表.学号(+)表示
学生表(也就是左边的表)所有行都会被返回
即使选课表中没有相应的行与学生表中的行匹配--右(外)联接
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号(+) = 选课表.学号
查询的结果是:
学号 姓名 课程
0001 小李 高数
0002 小王 线数
0004 小黄 电脑
0005 电脑
学生表.学号(+) = 选课表.学号表示
选课表(也就是右边的表)所有行都会被返回
即使学生表中没有相应的行与选课表中的行匹配
不同的数据库系统对外联接有不同的表示
有此根本不兼容如(还是以上例为基础)MS SQL SERVER 外联接的SQL写法
--左(外)联接 - 第一种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号 *= 选课表.学号
--左(外)联接 - 第二种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表 LEFT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
--右(外)联接 - 第一种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号 =* 选课表.学号
--右(外)联接 - 第二种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
--注:在MS SQL SERVER中,OUTER关健字可以省略ACCESS 外联接的SQL写法
--左(外)联接 - 第二种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表 LEFT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
--右(外)联接 - 第二种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
--注:在ACCESS中,关健字OUTER不可以省略ORACLE 外联接的SQL写法
--左(外)联接 - 第一种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号 = 选课表.学号(+)
--右(外)联接 - 第一种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号(+) = 选课表.学号ORACLE直到9i才支持SQL-92外联接语法
LEFT (OUTER)JOIN和RIGHT (OUTER) JOIN
和MS SQL SERVER一样
关健字OUTER是可以省略的
RIGHT OUTER JOIN—This returns all the rows from the table on the right side of the join, along with the values from the left-hand side, or nulls if a matching row doesn't exist.
FULL OUTER JOIN—This returns all rows from both tables, filling in any blanks with nulls. There is no equivalent for this in Oracle8i.