MySQL 篇-深入了解多表设计、多表查询

news2024/11/24 11:30:49

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
 

文章目录

        1.0 多表设计概述

        1.1 多表设计 - 一对多

        1.2 多表设计 - 一对一

        1.3 多表设计 - 多对多

        2.0 多表查询概述

        2.1 多表查询 - 内连接

        2.2 多表查询 - 外连接

        2.3 多表查询 - 子查询


        1.0 多表设计概述

        多表设计是指在数据库中将数据分散存储在多个表中的设计方法。这种设计方法通常用于将数据按照不同的实体或属性进行划分,以便更好地组织和管理数据。

        在多表设计中,不同的表之间通常会通过外键来建立关联关系,从而实现数据之间的引用和关联。这种设计方法有助于减少数据冗余、提高数据的一致性和完整性,并且可以更好地支持数据的查询和分析。

        总的来说,为了数据在表中更好的管理,将数据拆分到不同的表中。而表与表之间通过外键来建立联系。

        多表设计的类型主要分为:一对多、一对一、多对多。

        1.1 多表设计 - 一对多

        在数据库设计中,一对多关系指的是一个实体在另一个实体中有多个关联记录的关系。通常使用外键来实现一对多关系。假设我们有两个实体 A 和 B ,A 实体可以有多个关联的 B 实体记录,而B实体只能关联一个 A 实体记录。

外键语法:

-- 创建表时指定
create table 表名(
        字段名 数据结构,
        ...
        [constraint] [外键名] foreign key(外键字段名) references 主表(字段名)
    );


-- 建完表后,添加外键
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(字段名);

        举个例子,部门与员工的关系,一个部门可以有多个员工,而一个员工只能属于一个部门,这就构成了一对多的关系,为了建立部门与员工的关系,则在员工表中添加外键即可。

代码如下:

create table department(
    id tinyint unsigned primary key comment '序号',
    name varchar(10) not null  comment '部门名称',
    last_time datetime not null comment '最后的操作时间'
)comment '部门表';

create table employee(
    id tinyint unsigned primary key comment 'id号',
    name varchar(10) not null  comment '名字',
    department_id tinyint unsigned comment '部门号',
    last_time datetime not null comment '最后的操作时间'
)comment '员工表';

-- 添加外键约束
alter table employee add  foreign key (department_id) references department(id);

-- 添加部门表中的数据
insert into department values (1,'学工部',now()),(2,'教研部',now()),(3,'教学部',now()),(4,'后勤部',now());
-- 添加员工表中的数据
insert into employee values (1,'张三',1,now()),(2,'李四',2,now()),(3,'王五',2,now()),(4,'赵六',4,now());

部门表:

员工表:

        这两个表已经建立了物理联系,通过外键来建立物理上的联系是为了保证数据的一致性和完整性。

        比如,现在要删除部门表中的 '教研部' 数据,代码如下:


delete from department where id = 2;

执行结果如下:

        由于添加了外键联系,为了确保数据的一致性和完整性,所以影响该操作失败。

而对与删除员工表中的数据则可以删除成功,代码如下:

delete from employee where name = '王五';

执行结果如下:

        物理外键:

        使用 foreign key 定义外键关联另外一张表。但是会影响增、删、改的效率(因为需要检查外键关系)、仅用于单节点数据库,不适用与分布式、集群场景、容易引发数据库的死锁问题、消耗性能。所以我们一般建立表与表之间的逻辑外键联系,而不建立物理外键联系。

        关于在一对多关系中在哪一个表中添加外键:

        简单粗暴的说,在一对多中,代表多的表需要添加外键,一个员工表与一个部门表,显然员工表是代表多的一方,部门表代表少的一方。因为一个部门有很多员工,而一个员工只能属于一个部门。

        1.2 多表设计 - 一对一

        在数据库中,一对一关系是指两个实体之间存在一种一对一的关联关系。这种关系通常通过在两个表之间共享一个相同的主键来实现。

        在任意一方加入外键,关联另外一个的主键,并且设置外键为唯一的 unique 。

        举个例子,用户与身份证信息的关系,一对一关系,用于单表的拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率。

代码如下:

create table user(
    id tinyint unsigned primary key comment 'id号',
    name varchar(10) not null comment '名字',
    phone varchar(11) comment '电话号码',
    degree varchar(10) comment '学历',
    birthday date comment '出生日期'
)comment '用户表';

create table user_id_card(
    id_card varchar(18) primary key comment '身份证号码',
    issued varchar(10) not null,
    fk_id tinyint unsigned,
    constraint fk foreign key (fk_id) references user(id)
)comment '用户id表';

-- 添加数据
insert into user values (1,'鹰王','18812340001','初中','1960-11-06');
insert into user values (2,'辐王','18812340002','高中','1961-11-06'),(3,'龙王','18812340003','高中','1962-11-06');

insert into user_id_card values (100000000010000011,'朝阳',1),(100000000010000022,'西阳',2),(100000000010000033,'东阳',3);

             用户ID表:

用户表:

        通过物理外键已经建立好了两个表的联系了。

        关于在一对一关系中在哪一个表中添加外键:

        在一对一中,任意一个表中都可以添加外键,任选一个表即可。

        1.3 多表设计 - 多对多

        在多表设计中,多对多关系通常需要使用一个中间表来实现。这种中间表包含两个外键,分别指向参与关系的两个表。这样就可以实现多对多关系的表示。

        举个例子,学生与课程的关系,一个学生可以选修多门课程,一门课程也可以供多个学生选择。

代码如下:

create table student(
    id tinyint primary key comment 'id号',
    name varchar(10) not null comment '名字',
    no varchar(20) comment '学号'
)comment '学生表';

create table course(
    id tinyint primary key comment 'id号',
    name varchar(10) not null unique comment '课程名'
)comment '课程表';

create table course_student(
    id tinyint primary key comment 'id号',
    student_id tinyint comment '外键id号',
    course_id tinyint comment '外键id号',
    constraint fk_s foreign key (student_id) references student(id),
    constraint fk_c foreign key (course_id) references course(id)
)comment '学生与课程的中间表';

-- 添加数据
insert into student values (1,'张三',2002350101),(2,'李四',2002350102),(3,'王五',2002350103);
insert into course values (1,'Java'),(2,'PHP'),(3,'MySQL');
insert into course_student values (1,1,1),(2,1,2),(3,1,3),(4,2,1),(5,2,3),(6,3,2);

                                课程表:

                                中间表:

                                学生表:

        小结:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。

        2.0 多表查询概述

        多表查询是指在数据库中同时查询多个表的数据的操作。通过多表查询,可以根据不同表之间的关联关系,将数据连接起来。

        多表查询的方式:内连接、外连接、子查询。

        2.1 多表查询 - 内连接

        内连接是一种多表查询的方式,用于检索两个或多个表中满足连接条件的数据。内连接只返回满足连接条件的行,即两个表中的数据必须在连接条件下匹配才会被检索出来。

内连接语法:

-- 隐式内连接
select 字段列表 from 表1,表2 where 条件 ...;


-- 显示内连接
select 字段列表 from 表1 [inner] join 表2 on 链接条件 ...;

        显示内连接更推荐使用,因为它提供了更清晰的语法结构和更好的可读性。隐式内连接虽然在一些情况可以简化语句,但是容易造成混淆和错误,不易维护。但是两者的效果是一样的。

        2.2 多表查询 - 外连接

        在数据库中,多表查询可以通过外连接来实现。外连接是一种连接操作,用于检索两个或多个表中的数据,即使其中一个表中的数据在另一个表中没有匹配项也可以检索出来。在外连接中,常见的类型有左外连接、右外连接。左外连接会返回左表中的所有数据,即使右表中没有匹配项;右外连接会返回右表中的所有数据,即使左表中没有匹配项。

外连接语法:

-- 左外链接
select 字段列表 from 表1 left [outer] join 表2 on 连接条件 ...;

-- 右外链接
select 字段列表 from 表1 right [outer] join 表2 on 连接条件 ...;

        左外链接与右外链接可以相互转换的,一般习惯用左外链接方式来查询多表。

        2.3 多表查询 - 子查询

        在数据库中,多表查询是指从多个表中检索数据的操作。而子查询是指在一个查询中嵌套另一个查询的操作。所以子查询也称为嵌套查询。

可以具体分为:

        标量子查询:子查询返回的结果为单个值。

        列子查询:子查询返回的结果为一列。

        行子查询:子查询返回的结果为一行。

        表子查询:子查询返回的结果为多行多列。

        返回的多行多列就是一个表,常作为临时表,常用的操作符:in 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1494763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简明 esp32刷mincopython thonny教程

1.下载thoony 编辑程序 (thoony是个micopython的编辑器,方便烧录上传) https://thonny.org/ 2.安装esptool(自己配置个esptoool环境,因为有时需要精细操作,thoony使用的也是esptool烧录) https://docs.espressif.com/projects/esptool/en/latest/esp32/installation.html 测试运…

云计算OpenStack KVM迁移

动态迁移 static migration 静态迁移 cold migration 冷迁移 offline migration 离线迁移 live migration 动态迁移 hot migration 热迁移 online migration 在线迁移 衡量 整体迁移时间 服务器停机时间 性能影响(迁移后和其它客户机) 特点 负载均衡 解除硬件依赖…

重装显卡驱动记录

重装显卡驱动记录 任务记录现状描述执行情况 任务 晚上回来,开电脑,发现总是进不去系统(这个情况我经常见),但偶尔进系统,识别不了我的外接屏(这个第一次见)。来来回回重启了1h多了…

最强模型Claude 3 Haiku速通指南在此!保姆级教学拿脚都能学会!

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…

超详细的Scrapy框架的基本使用教程

Scrapy的介绍 scrapy的工作流程(重点!!!) 如下图所示: 爬虫: 负责向引擎提供要爬取网页的URL,引擎会把这个URL封装成request对象并传递给调度器,把引擎传递过来的resp…

网络编程作业day6

数据库操作的增、删、改完成 #include <myhead.h>//查询的回调函数 int callback(void* data,int count,char** argv, char** columnName) {//count是字段数//argv是字段内容//columnName是字段名称for(int i0;i<count;i) {printf("%s%s\n", columnName[…

C++ 创建链表并输出

目录 代码实现 输出结果 代码实现 #include <stdio.h> #include <stdlib.h> //#include <cstdio> //#include <vector> #include<iostream> #include<cstdlib> using namespace std;//定义一个结构体 ListNode的结构 struct ListNode…

CCF CSP 202006-4 1246 (100分详细题解,矩阵乘法+快速幂)

202006-4 1246 &#xff08;100分详细题解&#xff0c;矩阵乘法快速幂&#xff09; 可以先看下csp官方的思路讲解&#xff0c;大思路是状态转移&#xff0c;先看下面s<2的情况 1 -> 2 2 -> 4 4 -> 16 6 -> 6 64 4 16 -> 26&#xff08;不考虑2&#xff0c;6…

微服务自动化管理初步认识与使用

目录 一、ETCD 1.1、ETCD简介 对于实施工程师&#xff1a; 1.2、特点 1.3. 使用场景 1.4、 关键字 1.5 工作原理 二、ETCD的安装 2.1、下载路径 2.2、介绍 2.3、具体操作 安装服务端 安装etcd客户端 测试 三、ETCD使用 3.1、前奏具体操作 3.2、 常用操作 一、ET…

Java开发进大厂面试必备技能,面试初级java工程师问题

前言 今天的分享主要是讲下这个 redis&#xff0c;什么是缓存雪崩、穿透和击穿。这三个技术问题是我们平时开发工作中和面试过程中&#xff0c;必须要会的知识点&#xff0c;因为目前的互联网系统没有几个不需要用到缓存的&#xff0c;只要用到缓存的话&#xff0c;就需要掌握…

【OJ】日期差值与日期累加

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. KY111 日期差值1.1 题目分析1.2 代码 2. KY258 日期累加2.1 题目分析2.2 代码 1. KY111 日期差值 1.1 题目分析 日期之间比较可能会出现给的两个年月日都不相同&#xff0c;这个就不好作差&#xff0c;每个月给的…

Apache POI 解析和处理Excel

摘要&#xff1a;由于开发需要批量导入Excel中的数据&#xff0c;使用了Apache POI库&#xff0c;记录下使用过程 1. 背景 Java 中操作 Excel 文件的库常用的有Apache POI 和阿里巴巴的 EasyExcel 。Apache POI 是一个功能比较全面的 Java 库&#xff0c;适合处理复杂的 Offi…

Stable Diffusion V3测评

1.引言 3月5号&#xff0c;Stability AI发布了介绍Stable Diffusion V3的研究论文&#xff0c;链接地址&#xff1a;戳我 这是目前他们发布的最先进、功能最强大的图像生成器&#xff0c;与一年多前发布的令人印象深刻的 Stable Diffusion V2.1 相比有了大幅升级。SD3所带来的…

redis进阶(一)

文章目录 前言一、Redis中的对象的结构体如下&#xff1a;二、压缩链表三、跳跃表 前言 Redis是一种key/value型数据库&#xff0c;其中&#xff0c;每个key和value都是使用对象表示的。 一、Redis中的对象的结构体如下&#xff1a; /** Redis 对象*/ typedef struct redisO…

软考65-上午题-【面向对象技术】-面向对象分析、设计、测试

一、面向对象分析OOA 1-1、面向对象分析的定义 面向对象分析的目的&#xff1a;为了获得对应用问题的理解。理解的目的是确定系统的功能、性能要求。 面向对象分析包含5个活动&#xff1a;&#xff08;背&#xff01;&#xff09; 认定对象&#xff1b;&#xff08;重要一点…

爆肝!Claude3与ChatGPT-4到底谁厉害,看完你就知道了!

前言&#xff1a; 相信大家在pyq都被这张图片刷屏了把~ 昨天&#xff0c;为大家介绍了一下什么是Claude&#xff0c;今天咱终于弄到号了&#xff08;再被ban了3个号之后终于是成功的登上去了&#xff0c;如果各位看官觉得咱文章写的不错&#xff0c;麻烦点个小小的关注~你们的…

android开发基础有哪些,985研究生入职电网6个月

不好意思久等了 这篇文章让小伙伴们久等了。 一年多以来&#xff0c;关于嵌入式开发学习路线、规划、看什么书等问题&#xff0c;被问得没有一百&#xff0c;也有大几十次了。但是无奈自己对这方面了解有限&#xff0c;所以每次都没法交代&#xff0c;搞得实在不好意思。 但…

Linux conntrack和iptables技术解析

Linux虚拟文件系统管理技术 1. netfilter解析1.1 netfilter的基础原理1.2 netfilter的相关hook 2. conntrack解析2.1 conntrack的基础原理2.2 conntrack的表记录解析 3. iptables解析3.1 iptables基础原理3.2 融合conntrack表的iptables规则 4. 疑问和思考4.1 conntrack和iptab…

【vue3之组合式API】

组合式API 一、setup1.写法2.如何访问3.语法糖4.同步返回对象 二、reactive()和ref()1.reactive()2.ref() 三、computed四、watch函数1侦听单个数据2.侦听多个数据3. immediate4. deep5.精确侦听对象的某个属性 五、生命周期函数六、组件通信1.父传子2. 子传父 七、模版引用1. …

【C++精简版回顾】20.模板的使用

1.模板起源 1.模板的定义 1.针对函数属性模板 //针对函数属性 template <class VOID > VOID print1(int a) {cout << a << endl; } 2.针对数据属性模板 //针对数据属性 template <typename INT,typename FLOAT> void print2(INT a,FLOAT b) {cout <…