数据库-MySQL基础(9)-多表关系

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 目录概述1、一对多2、多对多3、一对一多表查询概述多表查询分类1、连接查询2、子查询

目录

概述

1、一对多

2、多对多

3、一对一

多表查询概述

多表查询分类

1、连接查询

2、子查询


概述

项目开发中,在进行数据库表结构关系设计时,会根据业务需求及业务模块之间的关系,分析设计表结构,由于业务之间相互关联,所以各个表结构之间也存在各种联系,基本上分为三种:


—— 一对多(多对一)


—— 多对多


—— 一对一


1、一对多

案例:部门与员工的关系


关系:一个部门对应多个员工,一个员工对应一个部门


实现:在多的一方建立外键,指向一的一方的主键

微信图片_20221012162740.jpg


2、多对多

案例:学生与课程之间的关系

关系:一个学生可以选修多门课程,一门课程也可以供给多个学生选择

实现:建立第三张中间表,中建表至少包含俩个外键,分别关联俩方主键

image.png

SQL建立中间表

create table student(
    id int auto_increment primary key comment '主键id',
    name varchar(10) comment '课程名称',
    no varchar(10) comment '学号'
) comment '学生表';
insert into student values (null,'黛丽丝',2000100101),(null,'谢逊','2000100102'),(null,'殷天正','2000100103'),(null,'韦一笑','2000100104');
create table course(
    id int auto_increment primary key comment '主键id',
    name varchar(10) comment '课程名称'
)comment '课程表';
insert into course values (null,'Java'),(null,'PHP'),(null,'MySQL'),(null,'Hadoop');
create table  student_course(
    id int auto_increment comment '主键' primary key ,
    student int not null comment '学生id',
    courseid int not null comment '课程id',
    constraint fk_courseid foreign key (courseid) references course(id),
    constraint fk_student foreign key (student) references student(id)
)comment '学生课程中间表';
insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);

image.png


3、一对一

案例:用户与用户详情的关系

关系:一对一关系,多用于单表拆分,,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率

实现:在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的(NUIQUE)

image.png

拆分后

image.png

代码

create table tb_user(
    id int auto_increment primary key comment '主键ID',
    name varchar(10)comment '姓名',
    age int comment '年龄',
    gender char(1) comment '1:男,2:女',phone char(11)comment '手机号'
)comment '用户基本信息表';
create table tb_user_edu(
   id int auto_increment primary key comment '主键ID',
   degree varchar(20)comment '学历',
   major varchar(50) comment '专业',
   primaryschool varchar(50) comment '小学',
   middleschool varchar(50)comment '中学',
   university varchar(50) comment '大学',
   userid int uniquef comment'用户ID',
   constraint fk_userid foreign key (userid) references tb_user(id)
)comment '用户教育信息表';
insert into tb_user(id,name,age,gender, phone) values
      (null,'黄渤',45,'1',' 18800001111'),
      (null,'冰冰',35,'2', '18800002222'),
      (null,'码云',55,'1','18800008888 '),
      (null,'李彦宏',50,'1','18800009999' );
insert into tb_user_edu(id,degnee, major,primaryschool,middleschool,university,userid) values
(null,'本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈学院',1),
(null,'硕士','表演','朝阳区第一小学','朝阳区第一中学','北京电影学院',2),
(null,'本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学',3),
(null,'本科','应用数学','阳泉第一小学','阳泉区第一中学','清华大学' ,4);

多表查询概述

概述:指从多张表中查询数据

笛卡尔积:笛卡尔积是指在数学中,俩个集合A 和 B集合的所有组成情况 。(在多表查询中,需要消除无效的迪卡尔积)

image.png 案例:

使用上篇文章所用的表格emp和demp

emp表

image.png

dept表

image.png 输入

--多表查询--笛卡尔积
select  * from emp,dept;

后表会出现这中情况

image.png 解决方案

select  * from emp,dept where emp.dept_id = dept.id;

image.png


多表查询分类

1、连接查询

   内连接:相当于查询A、B交集的部分数据


   外连接:左外连接:查询左表所有数据,以及俩张表交集部分的数据


                  右外连接:查询右表所有数据,以及俩张表交集部分的数据


  自连接:当前表与自身表的连接查询,自连接必须使用表别名


2、子查询

当前只有一张表,但是这张表会与自身进行连接查询

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
18天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
158 11
|
13天前
|
存储 SQL 关系型数据库
MySQL的安装&数据库的简单操作
本文介绍了数据库的基本概念及MySQL的安装配置。首先解释了数据库、数据库管理系统和SQL的概念,接着详细描述了MySQL的安装步骤及其全局配置文件my.ini的调整方法。文章还介绍了如何启动MySQL服务,包括配置环境变量和使用命令行的方法。最后,详细说明了数据库的各种操作,如创建、选择和删除数据库的SQL语句,并提供了实际操作示例。
57 13
MySQL的安装&数据库的简单操作
|
19天前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
3天前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
13 2
|
9天前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
22 4
|
18天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
29 2
|
20天前
|
存储 缓存 关系型数据库
MySQL 视图:数据库中的灵活利器
视图是数据库中的虚拟表,由一个或多个表的数据经筛选、聚合等操作生成。它不实际存储数据,而是动态从基础表中获取。视图可简化数据访问、增强安全性、提供数据独立性、实现可重用性并提高性能,是管理数据库数据的有效工具。
|
2月前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
167 2
|
2月前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
下一篇
无影云桌面