演示示例
说明:以下示例中,表a是员工表,有a,b,c,d四个员工,性别都是男性m。表b是工资表,有a,b,d四个员工,工资对应的是1000,2000,4000。然后分别演示带(+)符号的和不带(+)符号的,结果如下。
SQL> select * from a; NAME SEX -------------------- ----- a m b m c m d m SQL> select * from b; NAME MONEY -------------------- ---------- a 1000 b 2000 d 4000 SQL> select a.name,b.money from a,b where a.name=b.name(+); NAME MONEY -------------------- ---------- a 1000 b 2000 d 4000 c SQL> select a.name,b.money from a,b where a.name=b.name; NAME MONEY -------------------- ---------- a 1000 b 2000 d 4000
可见,带(+)号时,a表中的所有人都在,即使工资为空。不带(+)时,a表中的没有出现工资为空的员工c。
对(+)号的解释
(+) 表示外连接。条件关联时,一般只列出表中满足连接条件的数据。如果条件的一边出现(+),则另一边的表就是主表,主表中的所有记录都会出现,即使附表中有的记录为空
(+)的扩展:SQL表连接
SQL表连接分类
内连接,外连接,交叉连接,其中外连接包括左连接和右连接。
SQL表连接示例
内连接
SQL> select a.name,b.money from a,b where a.name=b.name; SQL> select a.name,b.money from a inner join b on a.name=b.name;
左连接
SQL> select a.name,b.money from a,b where a.name=b.name(+); SQL> select a.name,b.money from a left join b on a.name=b.name;
右连接
SQL> select a.name,b.money from a right join b on a.name=b.name; SQL> select a.name,b.money from a,b where a.name(+)=b.name;
交叉连接
SQL> select a.name,b.money from a full join b on a.name=b.name; NAME MONEY -------------------- ---------- a 1000 b 2000 c d 4000 SQL> select a.name,b.money from a,b where a.name(+)=b.name(+); select a.name,b.money from a,b where a.name(+)=b.name(+) * 第 1 行出现错误: ORA-01468: 一个谓词只能引用一个外部联接的表
所以(+)只是表示外连接,并不表示交叉连接。