mysql 关系_MySQL之关系
关系
多对多的关系,如何通过mysql来表示
站在老师的角度
一个老师可以教多个学生,
一个老师也可以教一个学生。
站在学生的角度
一个学生可以被一个老师教
一个学生也可以被多个老师教
结论:如果站在两边看都是一对多的情况,那么这个关系就是多对多的。
问题:
如果表示a老师教过x学生和y学生,x学生和y学生同时也被b老师教
解决方法
多对多关系,无论是把外键放在哪一张表都不合适,因为可能有多个值
解决方案:建立一个中间的关系表
create table student(
id int primary key auto_increment,
name char(10)
) charset utf8;
create table teacher(
id int primary key auto_increment,
name char(10)
) charset utf8;
create table t_s_r(
id int primary key auto_increment,
t_id int,
s_id int,
foreign key(t_id) references teacher(id),
foreign key(s_id) references student(id)
) charset utf8 ;
insert into teacher values(null,"bgon"),(null,"nike");
insert into student values(null,"老王"),(null,"老李");
# 老王被bgon教过
insert into t_s_r values(null,1,1);
# nike教过老李
insert into t_s_r values(null,2,2);
# nike教过老王
insert into t_s_r values(null,2,1);
# 现在已知老师名称为bgon,请找出他教过的那些学生
mysql> select id from teacher where name="bgon";
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
mysql> select s_id from t_s_r where t_id=1;
+------+
| s_id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> select name from student where id=1;
+--------+
| name |
+--------+
| 老王 |
+--------+
# 子查询
mysql> select name from student where id=(select s_id from t_s_r where t_id=(select id from teacher where name="bgon"));
+--------+
| name |
+--------+
| 老王 |
+--------+
1 row in set (0.00 sec)
# 已知学生名为老李,请查询出哪些老师教过他.
mysql> select id from student where name = "老李";
+----+
| id |
+----+
| 2 |
+----+
1 row in set (0.00 sec)
mysql> select t_id from t_s_r where s_id=2;
+------+
| t_id |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
mysql> select name from teacher where id=2;
+------+
| name |
+------+
| nike |
+------+
1 row in set (0.00 sec)
# 子查询
mysql> select name from teacher where id=(select t_id from t_s_r where s_id=(select id from student where name = "老李"));
+------+
| name |
+------+
| nike |
+------+
1 row in set (0.00 sec)
总结:
如何确认多对多的关系?
站在两个表的角度去想
处理方式,通过在两个表中间建立一个外键表,该外键表分别都关联两表的字段。
联合唯一约束
对于上面的t_s_r表进行改进
# 原表
create table t_s_r(
id int primary key auto_increment,
t_id int,
s_id int,
foreign key(t_id) references teacher(id),
foreign key(s_id) references student(id),
) charset utf8 ;
# 改进方法一(表已创建的情况下):unique key
alter table t_s_r add unique key(t_id,s_id);
# 改进方法二(表没创建的情况下):unique key
create table t_s_r(
id int primary key auto_increment,
t_id int,
s_id int,
foreign key(t_id) references teacher(id),
foreign key(s_id) references student(id),
unique key(t_id,s_id)
) charset utf8 ;
# 联合主键
create table t_s_r(
id int primary key auto_increment,
t_id int,
s_id int,
foreign key(t_id) references teacher(id),
foreign key(s_id) references student(id),
primary key(t_id,s_id)
) charset utf8 ;
对于上面的t_s_r表进行改进------最终版
# 创建学生表
create table student(
id int primary key auto_increment,
name char(10)
) charset utf8;
# 创建教师表
create table teacher(
id int primary key auto_increment,
name char(10)
) charset utf8;
# 创建学生和老师关系表
create table t_s_r(
t_id int,
s_id int,
foreign key(t_id) references teacher(id),
foreign key(s_id) references student(id),
primary key(t_id,s_id)
) charset utf8 ;
insert into teacher values(null,"bgon"),(null,"nike");
insert into student values(null,"老王"),(null,"老李");
# 老王被bgon教过
insert into t_s_r values(null,1,1);
# nike教过老李
insert into t_s_r values(null,2,2);
# nike教过老王
insert into t_s_r values(null,2,1);
# 问题:现在已知老师名称为bgon,请找出他教过的那些学生
mysql> select id from teacher where name="bgon";
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
mysql> select s_id from t_s_r where t_id=1;
+------+
| s_id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> select name from student where id=1;
+--------+
| name |
+--------+
| 老王 |
+--------+
# 整合查询语句:子查询
mysql> select name from student where id=(select s_id from t_s_r where t_id=(select id from teacher where name="bgon"));
+--------+
| name |
+--------+
| 老王 |
+--------+
1 row in set (0.00 sec)
# 问题:已知学生名为老李,请查询出哪些老师教过他.
mysql> select id from student where name = "老李";
+----+
| id |
+----+
| 2 |
+----+
1 row in set (0.00 sec)
mysql> select t_id from t_s_r where s_id=2;
+------+
| t_id |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
mysql> select name from teacher where id=2;
+------+
| name |
+------+
| nike |
+------+
1 row in set (0.00 sec)
# 整合查询语句:子查询
mysql> select name from teacher where id=(select t_id from t_s_r where s_id=(select id from student where name = "老李"));
+------+
| name |
+------+
| nike |
+------+
1 row in set (0.00 sec)
一对一关系
例如:每一个人都有一个身份证。一个身份证只对应一个人
分表:
垂直分表,例如:人物的详细信息,就可以垂直分表
# 全表
create table person(
id int primary key auto_increment,
name char(10),
age int,
height float,
weigth float
)
# 垂直分表:person
create table person(
id int primary key auto_increment,
name char(10),
age int
) charset utf8;
# 垂直分表:person_info
create table person_info(
id int primary key,
height float,
weigth float,
foreign key(id) references person(id)
) charset utf8;
水平分表
数据量很大,使用一个表,查询效率低,使用两个表来存取这些数据
处理一对一关系处理方式:
先确定先后顺序
将先存在的数据作为主表
后存在的作为从表
使两个表的id保持一一对应
方法1:从表的id即是主键又是外键
方法2:从表的id设置为外键,并保证唯一
人物关系表,从客户演变为学生:
# 创建客户表
create table kehu_t(
id int primary key auto_increment,
name char(10),
phone char(11)
)
# 创建学生表
create table student_t(
id int primary key auto_increment,
card_id char(18)
)
为什么要分表:
数据分担在多个表,提高了查询的效率
mysql 关系_MySQL之关系相关推荐
- mysql 表结构关系_mysql 表关系 与 修改表结构
mysql 表关系 与 修改表结构 两张表关系 多对一 以员工和部门举例 多个员工对应一个部门 foreign key 永远是在多的那张表中设置外键 """ 从左边的表思 ...
- mysql实体_mysql实体关系
实体关系 表设计 1:1 两个实体表内,存在相同的主键字段 如果记录的主键值等于另一个关系表内记录的主键值,则两条记录的对应为一一对应 优化上称为垂直分割 1:n 一个实体对应多个其他实体(一个班级对 ...
- MySQL什么是关系_MySQL教程-关系模型
MySQL教程-关系模型 Date 2021-1-22 Author Haihan Gao 什么是关系模型关系模型本质上就是多个存储数据的二维表 表的每一行称为记录 记录是一个逻辑意义上的数据 表的每 ...
- mysql中关系怎么弄_mysql数据库关系操作
### mysql数据库 #### 知识要点: 1. 数据操作增.删.改 2. 外键约束要求 3. 一对多表关系 4. 一对一表关系 5. 多对多表关系 6. 外键约束的参照操作 ### 数据操作 # ...
- mysql表和表的关系_mysql表与表之间建关系
2.浪费硬盘空间 3.扩展性极差 上述的弊端产生原因类似于把代码全部写在一个py文件中,应该怎么做? >> 解耦合! 将上述两张表拆成员工的部门两张表 分析表数据之间的关系:多个员工对应 ...
- mysql数据库性能跟哪些参数有关系_MySQL性能优化全攻略-服务器参数调整
正确的编译方法固然重要,但它只是提高MySQL服务器性能工作的一部分.MySQL服务器的许多参数会影响服务器的性能表现,而且我们可以把这些参数保存到配置文件,使得每次MySQL服务器启动时这些参数都自 ...
- mysql什么是表的并的关系_MySQL表与表的关系
表与表的关系 一对多关系 ID name gender dep_name dep_desc 1 Chen male 教学部 教书育人 2 Old flying skin male 外交部 漂泊游荡 3 ...
- MySql数据库三种关系详解
如何分辨三种关系,以及三种关系的图列对比. 1.分析三种关系. 是否左表的多条记录可以对应右表的一条记录,是,则证明左表的一个字段 关联(foreign key)右表的一个字段(通常为ID) 是否右表 ...
- MYSQL 客户端与服务器关系
数据库概念 如果想要知道mysql数据库客户端与服务器之间的关系.首先要明白什么是"数据库". 从字面意思理解,所谓"数据库",就是存放数据的库.现实中,大 ...
最新文章
- JVM最多支持多少个线程?
- asp.net 学习笔记 代码块标记
- android lcd工具,Android东西lcd配置
- 纠正网上流传的SQL取某一时间的当月第一天和最后一天的时间写法
- navicat连接远程mysql
- linux 32位平台,文件大小受限于2G的解决方法
- android自定义进度条百分比跟着走,Android自定义View实现水平带数字百分比进度条...
- 功能1 -- 顶部导航栏和返回顶部效果
- [2018.10.18 T3] 小 G 的线段树
- Java后端Controller层解析Json数组转对象
- 生物信息学初学——山大公开课笔记
- 维克多DBC文件结构
- EditPlus编码格式设置
- PLC:学习笔记(西门子)2
- 详析百度“原创保护”使用规范,及如何推送原创文章链接?
- Kindle PaperWhite 2越狱教程
- 安装redis时被意外攻击 newinit
- vue中echarts纵轴添加点击事件
- 扩展系统功能——装饰模式(四):透明与半透明装饰模式,装饰模式注意事项,装饰模式总结
- 看了这篇文章我才真正理解了!和快手大佬的技术面谈,附架构师必备技术详解
热门文章
- matlab程序设计图像匹配,灰度,归一化算法,快速匹配。有代码好用。转载
- python3有多少个关键字排序_python3 数据结构和算法-- 通过某个关键字排序一个字典列表...
- idea中没有j2ee_idea神器功能大全
- 自动化测试工具selenium python_Selenium自动化测试工具使用方法汇总
- html5新增的js,HTML5新增属性data-*和js/jquery之间的交互及注意事项
- 编译mediastreamer2/ffmpeg/linphone(x86平台)
- python最大正方形的面积_LeetCode 221. 最大正方形 | Python
- windows无法发现任何计算机或设备,Win10系统提示windows无法与设备或资源通信如何解决...
- 在日本山区流域使用支持向量机和 bagging、boosting 和 stacking 集成机器学习框架改进滑坡评估--文献阅读
- 【转】pthread mutex 基本用法