mysql:外键和join

目录

外键的使用和必要性

join的使用区分(natural,cross,inner,outer)


外键的使用和必要性

1. 外键字段和主键字段的名称可以不同,但是类型应该一致。

2. 外键的必要性:

  1. 不用外键约束,也可以进行关联查询,但是有了它,MySQL 系统才会保护你的数据,避免出现误删的情况,从而提高系统整体的可靠性。

  2. 为什么在 MySQL 里,没有外键约束也可以进行关联查询呢?

    1. 原因是外键约束是有成本的,需要消耗系统资源。对于大并发的 SQL 操作,有可能会不适合。比如大型网站的中央数据库,可能会因为外键约束的系统开销而变得非常慢。所以,MySQL 允许你不使用系统自带的外键约束,而是在应用层面完成检查数据一致性的逻辑。也就是说,即使你不用外键约束,也要想办法通过应用层面的附加逻辑,来实现外键约束的功能,确保数据的一致性。

    2. 外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

    3. “外键约束,可以简单有效的保证数据的可靠性。适合内部管理系统使用,因为访问量不会太大。如果是面向外界用户使用的应用,外键所带来的性能损耗,可能无法支撑大批用户的同时访问。但是,数据的可靠性和唯一性才是最重要的,在保证一次对多张表操作的过程中,可以使用事务来确保操作的一致性。”===》作者回复: 在系统开销和使用的功能之间需要做好平衡,既要确保数据可靠性和唯一性,又要确保系统可用.

  3. 如果你的业务场景因高并发等原因,不能使用外键约束,在这种情况下,你怎么在应用层面确保数据的一致性呢?

    》应用层面实现外键约束的功能,指的就是在应用里面加上检查。比如删除主表中记录的时候,需要检查从表中是否有记录引用到主表中的这条记录,有的话就不能删除,否则可以删除。各种不同的框架有自己的特点,要根据实际情况决定如何处理。

join的使用区分(natural,cross,inner,outer)

  1. natural join,cross join,inner join,outer join(left ,right)区别示例多表关联汇总_code_lab-CSDN博客

                                                                t1

img

                                                                t2

img

NATURAL JOIN(自然连接)

两张表通过NATURAL JOIN连接的时候,相当于有个隐含的WHERE子句,对两张表中同名的对应列相比较看是否相等。

测试:SELECT * FROM t1 NATURAL JOIN t2

相当于:select * from t1, t2 where t1.id = t2.id and t1.field01 = t2.field01

采用自然连接的相同列合并成一列

img

CROSS JOIN(创建笛卡尔积)

对两张表通过交叉联合产生第三张返回结果集的表。相当于普通的连接。如下返回6行=2*3

测试:select * from t1 cross join t2;

img

INNER JOIN(内连接)

内连接就相当于普通的CROSS JOIN,

只是格式不一样,INNER JOIN在后面有一个ON子句(相当于WHERE)的搜索条件,用于过滤返回的行。

测试:select * from t1 inner join t2;

结果:与cross一样测试:SELECT * FROM t1 INNER JOIN t2 WHERE t1.id = t2.id

等价于:SELECT * FROM t1 , t2 WHERE t1.id = t2.id

img

OUTER JOIN (外连接)

select * from t1 outer join t2 on (t1.id=t2.id)

outer join告诉DBMS生成结果表,在此表中不仅带有相关(t1.id=t1.id)行对,而且还有来自两个源表中任一表的不匹配的行。就是说没匹配到的也要显示出来,这里有

LEFT OUTER JOIN(左连接)= LEFT JOIN

测试:select * from t1 left outer join t2 on (t1.id=t2.id)

img

RIGHT OUTER JOIN(右连接) = right join

测试:select * from t1 right outer join t2 on (t1.id=t2.id)

结果:

img

FULL OUTER JOIN(全连接),Oracel测试,Mysql不支持;= full join

FULL OUTER JOIN 返回组合了LEFT OUTER JOIN 和RIGHT OUTER JOIN结果的表

测试:select * from t1 full join t2 on (t1.id=t2.id);

结果:

  • left outer join、

  • right outer join、

  • full outer join(mysql要通过另外的方式实现)。

img

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

picoasis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值