数据库(二)——外键约束、表与表的关系(一对一、一对多、多对多)、三大范式、多表查询(内连接查询、外连接查询、子查询)

本文介绍了数据库中表与表之间的关系,包括一对一、一对多和多对多的关联,并详细阐述了外键约束的重要性及设置规则。同时,讲解了数据库的三大范式,强调了数据规范化的重要性和反范式设计的常见问题。此外,还探讨了多表查询的不同方式,如内连接、外连接和子查询,提供了实际案例以加深理解。
摘要由CSDN通过智能技术生成

数据库(二)——外键约束、一对一、一对多、多对多

一、表与表之间的关系和外键约束

1、表与表之间为什么要存在关系

在讲外键以及表之间的关系前,先讲为什么要存在关系:
在这里插入图片描述

2、表间关系(一对一)

举个例子,在中国,按照法律来讲,每一位男性只能拥有一位妻子,所以这种就是一对一的关系。现在设置两张表,一张是男性,一张是女性,两张表有 id 和姓名,这时,如果要设置外键,就在某张表中设置多一个字段,这个字段专门对应另外一张表中的字段(一般是主键):
在这里插入图片描述
上图中,可以看到妻子表设置了 mid 这个字段,对应丈夫表的 mid,且给妻子的 mid 字段设置外键,关联丈夫表的主键。

在这里插入图片描述

3、表间关系(一对多)

举例子:比如一个部门对应多个员工,这种情况就是一对多关系。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注意:
	A. 一般设置外键是主表的主键对应从表的外键,主()()。
	
	B. 从表的外键的数据类型以及长度,必须与主表的主键的数据类型以及长度一致。
	
	C. 设置外键关联之后,必须先增加主表的数据,再增加从表的数据。
	
	D. 设置外键关联之后,删除数据先删除从表数据,再删除主表的数据。

4、表间关系(多对多)

实质上并没有设置多对多的关键字,而是通过第三张表(中间表),第三张表分别对两张表实现一对多的关系,从而实现多对多的关系。
在这里插入图片描述
在这里插入图片描述

二、数据库三大范式

1、什么是三大范式以及分别是什么?

在这里插入图片描述

2、第一大范式错误例子

下图中国家与城市合在了一起,应该将它们分开:
在这里插入图片描述

3、第二大范式错误例子

下图中,常用于像酒店开房间的表,房间跟人应该分开来,一张表只描述一种事物。
在这里插入图片描述

4、第三大范式错误例子

下图中主要错误是出现了某些字段的局部依赖,正确的应该是只能与主键进行依赖在这里插入图片描述

三、多表查询

1、非等值查询

在这里插入图片描述
在多表的情况下,如果还用以前的搜索方式,则会出现大量无效数据。

所以用以下方式的查询:

2、内连接查询

a、显式内连接

1.概念:显式内连接:使用 mysql 内连接的关键字的内连接查询:关键字 inner join
2.语法:select * from 左表 inner join 右表 on 条件
3.案例:
	查询出部门的信息以及对应员工信息:
	SELECT d.*,e.* FROM dept d INNER JOIN emp e ON d.did = e.did

在这里插入图片描述

b、隐式内连接

1.概念:隐式内连接,不使用inner join 来进行连接查询
2.语法:select * from 左表,右表 where 条件
3.案例:
	查询出部门的信息以及对应员工信息
	SELECT d.*,e.* FROM dept d,emp e WHERE d.did=e.did

3、外连接查询

a、左外连接查询

1.语法:select * from 左表 left join 右表 on 条件
2.案例:
	部门是否有员工,都需要查询除部门的信息
	SELECT d.*,e.* FROM dept d LEFT JOIN emp e ON d.did=e.did
3.匹配的规则:
	以左表为基准,右表一一进行匹配,如果可以匹配,则左右表正常显示,否则左表依然显示,右表设置为空

在这里插入图片描述

b、右外连接查询

1.语法:select * from 左表 right join 右表 on 条件
2.案例:
	查询出所有员工的信息,不管是否有部门
	SELECT d.*,e.* FROM dept d RIGHT JOIN emp e ON d.did = e.did
3.匹配的规则:
	以右表为基准,左表一一进行匹配,如果可以匹配,则左右表正常显示,否则右表依然显示,左表设置为空。

在这里插入图片描述

4、子查询

1.概念:一个完整查询语句嵌套另一个完成的查询语句,就是子查询.
2.体现:
	A.把一个子查询的结果当做另一个子查询的条件来使用
	B.把一个查询语句的结果当做另一个查询语句的列来使用
3.案例:
	#查询出研发部门的员工信息
	分析:
	a.查询出员工的信息 b.查询出部门为研发部门 c.关联的条件 did
	sql:
		SELECT * FROM emp e WHERE e.did IN (SELECT d.did FROM dept d WHERE d.dname="研发部")
		
	#查询出员工的信息以及部门的名称
	分析:
		1.查询员工的信息 2.查询出部门的名称 3.关联条件 did
	sql:
		SELECT e.*,(SELECT d.dname FROM dept d WHERE d.did=e.did) AS dname FROM emp e

5、多表查询练习

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值