oracle 四种链接,sql的四种链接方式内连接、外连接、全连接

https://blog.51cto.com/11103985/2330041

例子:

-------------------------------------------------

a表     id   name     b表     id   job   parent_id

1   张3                   1     23     1

2   李四                 2     34     2

3   王武                 3     34     4

a.id同parent_id   存在关系

--------------------------------------------------

1) 内连接

select   a.*,b.*   from   a    join   b     on   a.id=b.parent_id

结果是

1   张3                   1     23     1

2   李四                  2     34     2

4ee06589c0520dbfac344ec622f654cd.png

2)左连接

select   a.*,b.*   from   a

left  join   b     on   a.id=b.parent_id

结果是

1   张3                   1     23     1

2   李四                  2     34     2

3   王武                  null

63c840af0d28abf44a957208e3ecbe5d.png

3) 右连接

select   a.*,b.*   from   a

right   join   b     on   a.id=b.parent_id

结果是

1   张3                   1     23     1

2   李四                  2     34     2

null                       3     34     4

cee4c5e46ab0614e2a94b3d8b67a6df6.png

4) 全连接

select   a.*,b.*   from   a

full  join   b     on   a.id=b.parent_id

结果是

1   张3                  1     23     1

2   李四                 2     34     2

null                   3     34     4

3   王武                 null

45654c9b08858653df0d001cc083f434.png

交叉连接(CROSS JOIN)交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。这种是错误的我们要避免这种

语句1:隐式的交叉连接,没有CROSS JOIN。SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME

FROM ORDERS O , CUSTOMERS C

WHERE O.ID=1;

语句2:显式的交叉连接,使用CROSS JOIN。SELECT O.ID,O.ORDER_NUMBER,C.ID,

C.NAME

FROM ORDERS O CROSS JOIN CUSTOMERS C

WHERE O.ID=1;

正确写法

SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME

FROM ORDERS O , CUSTOMERS C

WHERE O.ID=C.ID;

SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME

FROM ORDERS O CROSS JOIN CUSTOMERS C

ON (O.ID=C.ID);

语句7:WHERE条件独立。SQL> select s.sno,sname,score from student s  LEFT JOIN sc on s.sno=sc.sno WHERE score <60;

SNO       SNAME                   SCORE

---------- ------------------------------ ----------

s001       ????                   59

语句8:将语句7中的WHERE条件放到ON后面。SQL> select s.sno,sname,score from student s

LEFT JOIN

sc on s.sno=sc.sno AND score<60;

SNO       SNAME                   SCORE

---------- ------------------------------ ----------

s001       ????                   59

s003       ????

s008       ????

s002       ????

s007       ????

s006       ????

s005       ????

s009       ??????

s004       ????

s010       ????

10 rows selected.

ed323dba7d184f1d5f694ab68bcad79f.png

语句8:将语句7中的WHERE条件放到ON后面。SQL> select s.sno,sname,score from student s

WRGHT JOIN

sc on s.sno=sc.sno AND score<60;

9805bba1c513c40f63d0ca327b9c702f.png

从语句7和语句8查询的结果来看,显然是不相同的,语句8显示的结果是难以理解的。因此,推荐在写连接查询的时候,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中。

七、ON后面的条件(ON条件)和WHERE条件的区别:ON条件:是过滤两个链接表笛卡尔积形成中间表的约束条件。

WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。

从这里可以看出,将WHERE条件移入ON后面是不恰当的。推荐的做法是:

ON只进行连接操作,WHERE只过滤中间表的记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值