SQL语法 自然连接 外连接 内连接

笛卡尔积

  • 结果集数目为多个表的所有记录数的乘积
  • 多表关联,不加上过滤条件,得到结果集数目的就是笛卡尔积



连接

内连接

  • 使用 INNER JOIN 关键字,典型的多表关联语法
  • ON 过滤条件
    在这里插入图片描述

自连接

  • 一个表与自身做连接,通过表别名来区分
    在这里插入图片描述

自然连接

  • 就是普通的多表关联查询,即内部连接,没有左外连接 右外连接
    在这里插入图片描述



外连接

左外连接

  • 有 LEFT OUTER JOIN 关键字
  • 左边的表记录全选,右边的表记录可有可没有,若右边的表没有记录,则值为NULL

右外连接

  • 有 RIGHT OUTER JOIN 关键字
  • 右边的表记录全选,左边的表记录可有可没有,若左边的表没有记录,则值为NULL



区分连接

自然连接 内连接

  • 可以认为是同一个东西

内连接、外连接

  • 都可以用 ON 关键字做提前过滤,来减小关联的数据集大小,再用where关键字
  • 例如
    • 对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户
    • 对于客户表A,订单表B,此时应该使用左外连接,即 A LEFT OUTER JOIN B

on 和 where 条件过滤的区别

  • on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录
  • where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

简单来说,在使用INNER JOIN时会产生一个结果集,WHERE条件在这个结果集中再根据条件进行过滤,如果把条件都放在ON中,在INNER JOIN的时候就进行过滤了。

  • 例如

例子1

SELECT *
         FROM A
      INNER JOIN B
          ON B.ID = A.ID
          AND B.State = 1
      INNER JOIN C
          ON B.ID = C.ID


例子2

SELECT *
         FROM A
      INNER JOIN B
          ON B.ID = A.ID
      INNER JOIN C
          ON B.ID = C.ID
         WHERE B.State = 1
  • 例子1,在联查B表时,就把状态不等于1的忽略掉了,这样对于状态不等于1的就不需要去联查C表了
  • 例子2,则不管B的状态是否满足,都去联查C,最后再将B状态满足的查出来



参考链接

MYSQL 必知必会

一个破名想半年 | sql语句中join on和where用法的区别和联系

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值