MySQL数据库#4

news2025/1/12 1:02:48

外键(表与表之间的关系)

什么是外键:

        外键是指关系数据库中一个表中的字段,它与另一个表的主键相关联,用于建立两个表之间的关联关系。外键可以用来确保数据的完整性,通过检查关联表的主键来限制对于某个表的操作。当对主表进行操作时,外键的限制也会自动作用到从表中。这可以保证数据在不同表之间的一致性,防止出现不合理的数据关系。在使用外键时,需要定义好关系表之间的关联规则,包括指定主表和从表,以及主表和从表之间的关联字段等。

举例:

我们可以建立一个表:

当我们需要修改部门表的名称的话,则需把工程部里的所有人都得改,牵一发而动全身,很麻烦,

第二个就是这个表的表达不清晰,不清楚是员工表还是部门表,表内的相关字段一直重复存储,

表的扩展性很差,所以我们要想解决,就需要分成两张表

emp 和dep 但是这样的话表与表之后就没有关联了。所以我们需要外键来建立关系。

表与表之间的关系

表与表之间的关系有:

一对多:

想要确认是否为一对多关系需要换位思考法

我们以员工表与部门表为例:

我们先看员工表,一个员工是否可以有多个部门?不能

部门是否可以有多个员工?可以

根据以上分析我们得知,员工表不可以,部门表可以,表之间的关系就是:一对多,在表关系中并没有多对一。我们针对一对多,外键字段就要在多的一方,也就是部门表

如何在mysql表中建立一对多的关系:先把基础的字段建立出来,然后在考虑外键字段

create table emp(
    id int primary key auto_increment,
    name varchar(32),
    age int,
    dep_id int,
    foreign key(dep_id) references dep(id),on update cascade , on delete cascade # 让两张表建立了外键关系
   on update cascaed # 级联更新
    on delete cascade # 级联删除
);

create table dep(
    id int primary key auto_increment,
    dep_name varchar(32),
    dep_desc varchar(32)
);

多对多

        以图书表和作者表为例
我们站在图书表的角度


    问:一本图书能不能有多个作者?
    答:可以
我们再站在作者表的角度


    问:一个作者能不能写多本书
    答:可以
得出结论:如果两个都可以,那么表关系就是'多对多'


针对于多对多的表关系,外键字段建在第三张表中

create table book(
    id int primary key auto_increment,
    title varchar(32),
    price decimal(8,2)
);

create table author(
    id int primary key auto_increment,
    name varchar(32),
    addr varchar(32)
);

create table book2author(
    id int primary key auto_increment,
    book_id int,
    author_id int,
    foreign key(book_id) references author(id) # 让两张表建立了外键关系
    on update cascade # 级联更新
    on delete cascade, # 级联删除
    foreign key(author_id) references book(id) # 让两张表建立了外键关系
    on update cascade # 级联更新
    on delete cascade
);

输入完之后查看

insert into book(title, price) values('朝花夕拾', 50);
insert into book(title, price) values('骆驼祥子', 2000);


insert into author(name, addr) values('luxun', 'beijing');
insert into author(name, addr) values('shuqingchun', 'liaoningi');

insert into book2author(book_id, author_id) values(1, 1);
insert into book2author(book_id, author_id) values(1, 2);
insert into book2author(book_id, author_id) values(2, 1);
insert into book2author(book_id, author_id) values(2, 2);

注意事项:

      1.   在创建表的时候 需要先创建被关联表(没有外键字段的表)

      2.在插入新数据的时候 应该先确保被关联表中有数据


3.在插入新数据的时候 外键字段只能填写被关联表中已经存在的数据


4.在修改和删除被关联表中的数据的时候 无法直接操作


    如果想要数据之间自动修改和删除需要添加额外的配置

一对一的关系

create table author1(
    id int primary key auto_increment,
    name varchar(32),
    gender varchar(32),
    author_detail_id int unique,
    foreign key(author_detail_id) references author_detail(id)
    on update cascade
    on delete cascade
);


create table author_detail(
    id int primary key auto_increment,
    qq varchar(32),
    email varchar(32)
);
 

        

多表查询

        我们之前所查的都是单表查询,

多表查询的思路是

  子查询

        查询keivn的部门名称的话我们需要先查询kevin所在的部门id

select dep_id from emp where name='kevin'

       之后再用查出的id去和dep表中查询部门名称

select *from dep where id=(select dep_id from emp where name='kevin');

所以子查询实际就是一条sql的执行结果是另一条sql语句的执行条件。

多表查询

        多表查询:把多张有关系的表连接成一张大的虚拟表,连接出来的虚拟表不是实际存在的,它是在内存中存储,是按照单表查询。

我们先准备下数据;

create table dep(
    id int primary key auto_increment,
    name varchar(20) 
);

create table emp(
    id int primary key auto_increment,
    name varchar(20),
    sex enum('male','female') not null default 'male',
    age int,
    dep_id int
);


如果两张表没有建立强制的约束关系,就使用逻辑意义上的关联
#插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营'),
(205,'保洁')
;

insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('egon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);

创建完毕

        

多表查询

        select *from emp,dep where dep_id=dep.id;

专业的连表语法;

inner join:内连接,查询两张表都有的数据

left join :左连接,以左表为基准,查询左表内所有的数据,右表没有的数据使用NULL代替

right : 右连接,以右表为基准,查询右表内所有的数据,左表没有的数据使用NULL代替

union :连接两个sql语句的结果

select * from emp left join dep on emo.dep_id=dep.id

union

select * from dep right jojn dep on dep.emo_id=dep,id

多表查询练习题

1、查询所有的课程的名称以及对应的任课老师姓名


2、查询平均成绩大于八十分的同学的姓名和平均成绩


3、查询没有报李平老师课的学生姓名

        
4、查询挂科超过两门(包括两门)的学生姓名和班级

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

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

相关文章

批量去除pdf每一页相同未知的同样的内容

例如我想去除每一页右下角的www.alevelcollege.com ①打开acrobat pro ②编辑文件和图像 ③ctrlF输入字符串www.alevelcollege.com替换为空 ④鼠标点击替换 ⑤回车键按下不放,会自动翻页,直到翻页到最后一页。

Spring Cloud Alibaba 教程 | Nacos 篇

Spring Cloud Alibaba 教程 | Nacos 篇 ​ 写在前面的话&#xff1a; 本笔记在参考网上视频以及博客的基础上&#xff0c;只做个人学习笔记&#xff0c;如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01; 1、使用nacos做服务的注册和发现 1、父工程项目pom <!…

三十九、【进阶】MySQL索引失效情况1

1、在索引列上进行运算操作 &#xff08;1&#xff09;基础表格 phone字段&#xff0c;存在一个单列索引。 &#xff08;2&#xff09;在索引列上进行运算操作 可以看到&#xff0c;在对phone字段进行运算操作之后&#xff0c;查询方式会变为“全表扫描”&#xff0c;导致索引…

【JAVA学习笔记】 51 - 日期类

项目代码 一、第一代日期类 1.Date: 精确到亳秒&#xff0c;代表特定的瞬间 2.SimpleDateFormat:格式和解析日期的类 3.SimpleDateFormat格式化和解析日期的具体类。它允许进行格式化(日期> 文本)、解析(文本->日期)和规范化 public class Date01 {public static voi…

C# Socket通信从入门到精通(5)——单个同步TCP服务器C#代码实现

前言: 我们在开发TCP通信程序时,除了开发TCP客户端程序,有时候我们也需要开发TCP服务器程序,这在实际项目中是经常会遇到的,所以说掌握TCP服务器程序的开发是一项必备的技能,尤其在上位机软件开发领域,掌握TCP服务器程序的开发是走向高级工程师的必经之路,也是面试必考…

山西电力市场日前价格预测【2023-10-30】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-30&#xff09;山西电力市场全天平均日前电价为309.35元/MWh。其中&#xff0c;最高日前电价为400.33元/MWh&#xff0c;预计出现在18:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

Qt实现卡牌对对碰游戏

效果 闲来无事&#xff0c;实现一个对对碰游戏&#xff0c;卡牌样式是火影动漫。 先上效果&#xff1a; 卡牌对对碰_火影主题 玩法 启动游戏&#xff0c;进入第一关卡&#xff0c;所有卡牌都为未翻开状态&#xff0c;即背面朝上&#xff1b;点击卡牌&#xff0c;则将卡牌翻开…

06、SpringCloud -- 订单详情界面实现

目录 订单详情界面实现需求:代码前端后端controllerservicemapperdomain效果:订单详情界面实现 需求: 现在的订单详情界面是这样的。需要获取订单的数据对这个详情页面进行渲染 代码 前端 后端 controller

C语言基础简述(一)

目录 1. 标准输入输出库 2. 定义变量 3. 关于基本数据类型 3.1 计算机如何存储数据 3.2 基本数据类型 3.2.1 数值类型 3.2.1.1 整数类型 3.2.1.2 浮点数类型 3.2.2 字符类型 3.2.2.1 ASCII表 4. 进制数之间的转换 4.1 十进制整数和二进制之间的相互转换 5. C语言运…

ArcGIS Maps SDK for JS:隐藏地图边框

文章目录 1 问题描述2 解决方案 1 问题描述 近期&#xff0c;将ArcGIS Api for JS v4.16更新到了ArcGIS Maps SDK for JS v4.27&#xff0c;原本去除地图的css代码失效了。 v4.26及以前版本 &#xff0c;需要用.esri-view-surface--inset-outline:focus::after 控制边框属性。…

Photoshop(PS)2021版 安装教程(图文教程超详细)

软件&#xff1a;PS版本&#xff1a;2021语言&#xff1a;简体中文大小&#xff1a;2.26G安装环境&#xff1a;Win11/Win10&#xff08;1809以上版本&#xff09;硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff0c;不支持7代以下CPU&#xff09;下载通道①百度网盘丨64位…

python随手小练11(南农作业题)

题目1&#xff1a; 计算阶乘的和 可以看出如下形式&#xff1a;12!3!...15! 12(13(14...(15(1)))) 具体操作&#xff1a; x int(input("输入数字&#xff1a;")) res 1 for i in range(x, 1 , -1):res (1 (i * res)) print("阶乘的和为&#xff1a;"…

【SoC基础】通信种类(串口与并口、)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

生活日用品经营小程序商城的作用是什么

生活日用品如牙膏牙刷、护手霜等小产品是人们生活所需&#xff0c;传统客户会通过线下超市商场购买&#xff0c;但现在的消费者往往会选择线上渠道购买&#xff0c;省时省力坐在家里等货上门即可。 因此对商家来说&#xff0c;需要打通线上渠道才能获得更多生意&#xff0c;提…

微信小程序学习(03)

什么是生命周期函数 生命周期函数&#xff1a;是由小程序框架提供的内置函数&#xff0c;会伴随着生命周期&#xff0c;自动按次序执行。 生命周期函数的作用&#xff1a;允许程序员在特定的时间点&#xff0c;执行某些特定的操作。例如&#xff0c;页面刚加载的时候&#xff0…

Hexo + NexT 博客评论系统(Valine)配置小记

这几天刚配置了船新的 Hexo 博客&#xff0c;然后看到使用的 NexT 主题支持很多评论系统。我尝试配置了一下&#xff0c;发现里面坑太多了&#xff0c;真的挺费周章。于是想水一篇分享一下~ 1. 为什么不是…… NexT 主题一共支持如下的几个评论系统&#xff1a; 其中我觉得最…

测试时间函数

clock():测试时间函数 测试程序开始运行(即从main开始)到执行当前行需要的时间值,单位毫秒.需要引用time.h 例如&#xff1a;需要需要测试输出0~100需要的时间可以用如下代码&#xff1a; #include<stdio.h> #include<time.h>//单位是毫秒 int main() {clock_t c1…

07、SpringCloud -- jmeter 压测

目录 jmeter 入门jmeter 安装测试步骤测试数据模拟多用户操作1、创建http请求2、添加http cookie 管理器3、并发获取当前登录用户数据的效果4、添加多个用户模拟并发请求5、访问方法6、jmeter添加 CSV Data Set Config7、高并发执行访问的效果8、总结流程高并发秒杀压测jmeter …

手把手教你MATLAB 2020a的安装及免费使用方法

百度网盘 请输入提取码 (baidu.com) 提取码&#xff1a;sl8p (解压无需密码) MATLAB&#xff08;Matrix Laboratory的缩写&#xff09;是一种高级技术计算和编程环境&#xff0c;由MathWorks公司开发。它在科学、工程、数据分析和数学建模领域中广泛应用&#xff0c;为用户提…

PostGreSQL:数据表继承

PostGreSQL手册的简史部分介绍到&#xff1a;被称为PostGreSQL的对象关系型数据库管理系统&#xff0c;由美国加州大学伯克利 分校编写的POSTGRES软件包发展而来。经过十几年的发展&#xff0c;PostGreSQL目前是世界上最先进的开源数据库。 The object-relational database man…