多表关系和建表原则(带例子)

一. 多表关系和建表原则

1、多表之间的关系

(1)一对多关系

  • 部门和员工
  • 一个部门有很多员工,一个员工属于一个部门
  • 部门是一,员工是多

(2)多对多关系

  • 学生和课程
  • 一个学生可以选择多门课程,一门课程可以被多个学生选择

(3)一对一关系

  • 人和身份证号
  • 一个人只有一个身份证号,一个身份证号对应一个人

2、一对多关系建表

在这里插入图片描述
(2)在多的那一方创建字段,作为外键,关联一的那一方主键

3、多对多建表

在这里插入图片描述

4、一对一建表

(1)主键对应建表
在这里插入图片描述

5、以一对多为例创建表,使用外键

 # 创建部门表
CREATE TABLE dept (
  did INT PRIMARY KEY,
  dname VARCHAR(100)
)
### 创建员工表
CREATE TABLE emp (
  eid INT PRIMARY KEY,
  ename VARCHAR(100),
  age INT,
  edid INT,
  FOREIGN KEY(edid) REFERENCES dept(did) 
)
# 声明外键

6、外键主要作用:

(1)用于数据关联
(2)外键保证数据完整性和一致性

  • 添加员工时候,添加部门id,这个部门id必须是部门表id
  • 删除部门时候,如果部门下面有关联员工,部门不能删除的

7、实际创建表时候,一般外键不声明出来,把作为关联使用就可以了

二. Mysql多表关联查询操作

1、笛卡尔积

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

2、内连接查询

在这里插入图片描述

(1)获取两张表有关联数据

3、外连接-左外连接

在这里插入图片描述

(1)左边表所有数据,右边表关联数据

4、外连接-右外连接

在这里插入图片描述

(1)右边表所有数据,左边表关联数据

三、编写sql语句实现mysql多表关联查询

1、笛卡尔积

# 笛卡尔积

> SELECT * FROM dept,emp

2、内连接查询

在这里插入图片描述

# 内连接查询
# select 字段 from 表1  inner  join  表2  on  关联条件
SELECT * FROM dept INNER JOIN emp ON dept.did=emp.edid

SELECT * FROM dept,emp WHERE dept.did=emp.edid

3、外连接-左外连接

在这里插入图片描述

# 外连接-左外连接
# select 字段 from 表1 left outer join 表2  on  关联条件
SELECT * FROM dept LEFT OUTER JOIN emp ON dept.did=emp.edid

4、外连接-右外连接

在这里插入图片描述

# 外连接-右外连接
# select 字段 from 表1 right outer join 表2  on  关联条件
SELECT * FROM dept RIGHT OUTER JOIN emp ON dept.did=emp.edid

5、A表独有数据

在这里插入图片描述

# A表独有
SELECT * FROM dept LEFT JOIN emp ON dept.did=emp.edid
WHERE emp.edid IS NULL

6、B表独有数据

在这里插入图片描述

# B表独有数据
SELECT * FROM dept RIGHT JOIN emp ON dept.did=emp.edid
WHERE dept.did IS NULL

7、AB全有(类似于全连接效果)

在这里插入图片描述

# AB全有
SELECT * FROM dept LEFT JOIN emp ON dept.did=emp.edid
UNION
SELECT * FROM dept RIGHT JOIN emp ON dept.did=emp.edid

8、A独有 + B独有

在这里插入图片描述

# A独有 + B独有
SELECT * FROM dept LEFT JOIN emp ON dept.did=emp.edid WHERE emp.edid IS NULL
UNION
SELECT * FROM dept RIGHT JOIN emp ON dept.did=emp.edid WHERE dept.did IS NULL
### 创具有100个字段或记录的SQL Server中创一个包含100个字段或记录的可以通过 `CREATE TABLE` 语句实现。以下是详细的说明: #### 结构设计 当提到“100个字段”时,这意味着的设计应包括达100列,每列示不同的属性或数据项。而如果是指“100条记录”,则示该需要预先填充100行的数据。 对于定义个字段的情况,可以按照以下方式构结构[^3]: ```sql CREATE TABLE LargeTable ( Field1 INT, Field2 NVARCHAR(50), Field3 DATETIME, -- 继续添加更字段直到Field100 Field100 FLOAT ); ``` 上述代码片段展示了如何手动声明每一个字段及其对应的数据类型。然而,在实际应用中,通常不会直接硬编码如此的字段名;更常见的是利用编程工具自动生成这些重复性的DDL(Data Definition Language)命令。 至于初始化含有特定数量记录的格,则可通过循环插入操作完成。例如下面的例子演示了怎样向先前立好的简单样例里批量加入十万笔资料[^2]: ```sql SET NOCOUNT ON; INSERT INTO SampleTable (DateTime4, Column1, Column2) VALUES (GETDATE(), 'XXXX', 'YYYY'); GO 100 ``` 此脚本会连续执行一百次相同的插入动作,从而达到迅速填满目标的目的。 值得注意的是,虽然技术上允许我们制造极其宽广或者深邃的关系数据库对象,但从性能考虑以及遵循第三范式原则等方面出发,议合理规划实体间关联关系而非单纯堆砌过维度于单一逻辑单元之上。 ### 注意事项 - **字段数限制**: SQL Server 对单张内的最大列数目有所规定,标准版支持最有稀疏列的情况下可达30,000列[^1]。 - **存储空间考量**: 随着字段增,相应占用磁盘容量也会增加,因此需评估硬件资源是否充足。 - **查询效率影响**: 复杂度较高的模式可能降低检索速度,故优化索引变得尤为重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值