MySQL 多表操作

一.多表关系

1.一对一关系

一个学生只有一张身份证;一张身份证只能对应一个学生。

在任一表中添加外键,指向另一方主键,确保一对一关系。

一般一对一关系很少见,遇到一对一关系的表最好合并。

2.一对多/多对一关系

一个部门有多个员工,一个员工只能对应一个部门。

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

3.多对多关系

一个学生可以选择很多课程,一个课程也可以被很多学生选择。

实现原则:多对多关系实现需要借助第三章中间表。中间表至少包含两个字段,将多对多的关系,拆成一对多的关系,中间表至少要有两个外键,这两个外键分别指向原来的那两张表的主键。

二.外键约束(Foreign Key)

外键约束是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表,外键所在的表就是从表。

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

定义一个外键时,需要遵循下列规则:

1.主表必须已经存在于数据库中,或是当前正在创建的表。

2.必须为主表定义主键

3.主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。

4.外键中列的数目必须和主表中主键的列的数目相同且数据类型也要相同。

三.创建外键约束

1.创建表时设置外键约束

create database mydb3;
use mydb3;
create table if not exists dept(
deptno varchar(20) primary key,-- 部门号
name varchar(20)-- 部门名字
);
create table if not exists emp(
eid varchar(20) primary key, -- 员工编号
ename varchar(20),-- 员工名字
age int,-- 员工年龄
dept_id varchar(20), -- 员工所属部门
constraint emp_fk foreign key (dept_id) references dept(deptno) -- 外键约束
);

2.创建表后设置外键约束

alter table emp add constraint dept_fk foreign key(dept_id) references dept(deptno);

四.在外键约束下的数据操作

1.数据插入

必须先给主表添加数据。

给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列。

2.数据删除

主表的数据被从表依赖时,不能删除,否则可以删除。

从表的数据可以随便删除。

delete from emp where eid='7';

3.删除外键约束

外键一旦删除,就会解除主表和从表间的关系。

alter table emp drop foreign key dept_fk;

五.外键约束——多对多关系

增加一个中间表,来建立多对多关系。

先建立左侧主表和右侧主表,再建立中间表(从表)。

建立外键约束2次。

alter table score add foreign key(sid) references student(sid);
alter table score add foreign key(cid) references course(cid);

六.多表联合查询

1.交叉连接查询

交叉连接查询返回被连接的两个表所有数据行的笛卡尔积。

笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配。

假如A表有m行数据,B表有n行数据,则返回m*n行数据。

格式:select * from 表1,表2,……;

2.内连接查询

内连接查询求多张表的交集。

格式:

隐式内连接

select * from A,B where 条件;

显示内连接

select * from A inner join B on 条件;

3.外连接查询

外连接分为左外连接(left outer join)、右外连接(right outer join)、满外连接(full outer join)。

左外连接:select * from A left outer join B on 条件;

右外连接:select * from A right outer join B on 条件;

满外连接:select * from A full outer join B on 条件;

select * from dept3 left outer join emp3 on deptno=dept_id;
select * from dept3 left outer join emp3 on deptno=dept_id 
union select * from dept3 right outer join emp3 on deptno=dept_id;

MySQL 对于full outer join的支持不好,所以采用union。

union 去重 union all 没有去重

4.子查询

子查询就是指在一个完整的查询语句之中,嵌套若干个不同功能的小查询

子查询返回的数据类型分为4种:

1.单行单列

2.单行多列

3.多行单列

4.多行多列

select * from emp3 where age=(select max(age) from emp3);
select * from dept3,emp3 where deptno=dept_id and name in ('研发部' ,'销售部');
select * from dept3 join emp3 on deptno=dept_id and (name='研发部' and age <20);

5.子查询关键字

1)all

格式:select ... from...where c>all(查询语句)

查询年龄大于1003部门所有年龄的员工信息

select * from emp3 where age>all(select age from emp3 where dept_id='1003');

 查询不属于任何一个部门的员工信息

select * from emp3 where dept_id!= all(select deptno from dept3);

2)any和some

some和any的作用一样

查询年龄大于‘1003’部门任意一个员工年龄的员工信息

select * from emp3 where age >any(select age from emp3 where dept_id='1003');

3)in

用于判断某个记录的值是否在指定的集合中。

在in前面加not可以将条件反过来。

查询研发部和销售部的员工信息

select * from emp3 where dept_id in (select deptno from dept3 where name in 
('研发部','销售部');

4)exists

exists后面的子查询不返回任何实际数据,只返回真或假。

exists运算效率比in高。

查询公司是否有大于60岁的员工,有则输出。

select * from emp3 a where exists(select * from emp3 where a.age >60);

一行一行查询

查询有所属部门的员工信息

select * from emp3 a where exists(select * from dept3 b where a.dept_id=b.deptno);

6.自关联查询

对表自身进行关联查询,一张表当作多张表使用。

自关联时必须要起别名。

select 字段列表 from 表1 a,表1 b where 条件;

select 字段列表 from 表1 a left join 表1 b on 条件;

七.总结

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

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

相关文章

国产chat gpt推荐

下述网站响应非常快 会持续更新的! 付费&#xff1a; 小名言 免费&#xff1a; AIchatOS 百度的文心一言

【虚拟仿真】Unity3D中实现3DUI,并且实现Button、InputField、Toggle等事件绑定

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 最近在项目中需要用到3DUI的展示,之前一般会用TextMeshPro进行展示: 但是,后面又需要添加按钮、Toggle等…

船运物流管理系统|基于springboot船运物流管理系统设计与实现(源码+数据库+文档)

船运物流管理系统目录 目录 基于springboot船运物流管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员登录 2、货运单管理 3、公告管理 4、公告类型管理 5、新闻管理 6、新闻类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 …

【线性代数基础】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱 简述概要 关于线性代数的基础知识。 知识图谱 1.基本概念&#xff1a; 向量&#xff1a;向量是一个有方向的量&#xff0c;可以用一组数&#xff08;称为坐标&#xff09;来表示。在二维空间中&#x…

4、电源管理入门之子系统reset

目录 1. 简介 2. consumer-驱动软件 3. provider-reset驱动 3.1 整体介绍 3.2 reset复位API说明 之前的文章电源管理入门-1关机重启详解介绍了整机SoC的重启也可以说是reset,那么子系统的reset,例如某个驱动(网卡、USB等)或者某个子系统(NPU、ISP等运行在独立的M核或…

Windows安装PHP及在VScode中配置插件,使用PHP输出HelloWorld

安装PHP PHP官网下载地址(8.3版本)&#xff1a;PHP For Windows&#xff1a;二进制文件和源代码发布 点击下载.zip格式压缩包&#xff1a; 历史版本在Old archives中下载。推荐在Documentation download中下载官方文档&#xff0c;方便学习。 下载完成后在一个顺眼的地方解压压…

MySQL学习笔记3: MySQL数据库基础

目录 前言目标数据库操作&#xff08;针对database 的操作&#xff09;1. 创建数据库 create database 数据库名;2. 查看数据库 show databases;3. 选中数据库 use 数据库名;4. 删除数据库 drop database 数据库名; mysql中支持的数据类型1. 数值类型: NUMERIC(M,D)2. 字符串类…

实现Slider 滑块组件标记动态变化

实现以上效果&#xff0c;下拉框、slider滑块、按钮都在同一行&#xff0c;设置flex布局后&#xff0c;发现silider滑块最右边的标记数字一直都如下竖着显示&#xff0c;后来通过给源组件的标记区.el-slider__marks-text增加一个宽度后解决该问题。 <template><div>…

Linux实验记录:使用LNMP架构部署动态网站环境

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; LNMP动态网站部署架构是一套由&…

探索亚信安慧AntDB的数据库管理之道

AntDB数据库管理系统以其卓越的性能和稳定性成为众多用户的选择之一。这款系统采用了影响力大、社区繁荣、开放度高、生态增长迅速的PG内核&#xff0c;为用户提供了稳定可靠的数据库解决方案。 数据库的稳定性对于用户来说至关重要&#xff0c;特别是在面对大规模数据处理和高…

Go语言进阶篇——泛型

前言 在开始今天有关泛型的介绍之前,我们先来看一个简单的例子&#xff0c;如果我们要设计两个int类型变量相加的函数&#xff0c;我们可以这样设计&#xff1a; func Sum (a, b int) int {return a b }如果变量要求是float类型或者是其他类型&#xff0c;我们要面对一个问题…

高防服务器是怎样进行防御的?

随着互联网的发展&#xff0c;网络攻击和恶意流量也日益增多&#xff0c;高防服务器作为企业网络安全的重要保障&#xff0c;越来越受到关注。那么&#xff0c;高防服务器是怎样进行防御的呢&#xff1f; 高防服务器主要是指具备防御DDoS攻击、CC攻击、7x24小时实时防御网站入…

【Flink集群RPC通讯机制(二)】创建AkkaRpcService、启动RPC服务、实现相互通信

文章目录 零. RpcService服务概述1. AkkaRpcService的创建和初始化2.通过AkkaRpcService初始化RpcServer3. ResourceManager中RPC服务的启动4. 实现相互通讯能力 零. RpcService服务概述 RpcService负责创建和启动Flink集群环境中RpcEndpoint组件的RpcServer&#xff0c;且Rpc…

32单片机基础:OLED调试工具的使用

下面会介绍OLED显示屏的驱动函数模块&#xff0c;先学会如何使用&#xff0c;至于OLED屏幕的原理和代码编写&#xff0c; 我们之后会再写一篇。 现在我们就是用OLED当一个调试的显示屏&#xff0c;方便我们调试程序。 为什么要调试呢&#xff0c;是为了方便我们看现象&#…

嵌入式学习之Linux入门篇——使用VMware创建Unbuntu虚拟机

目录 主机硬件要求 VMware 安装 安装Unbuntu 18.04.6 LTS 新建虚拟机 进入Unbuntu安装环节 主机硬件要求 内存最少16G 硬盘最好分出一个单独的盘&#xff0c;而且最少预留200G&#xff0c;可以使用移动固态操作系统win7/10/11 VMware 安装 版本&#xff1a;VMware Works…

CQT新里程碑:SOC 2 数据安全认证通过,加强其人工智能支持

Covalent Network&#xff08;CQT&#xff09;发展新里程碑&#xff1a;SOC 2 数据安全认证通过&#xff0c;进一步加强了其人工智能支持 Covalent Network&#xff08;CQT&#xff09;现已完成并通过了严格的 Service Organization Control&#xff08;SOC) 2 Type II 的合规性…

vivo 基于 StarRocks 构建实时大数据分析平台,为业务搭建数据桥梁

在大数据时代&#xff0c;数据分析和处理能力对于企业的决策和发展至关重要。 vivo 作为一家全球移动互联网智能终端公司&#xff0c;需要基于移动终端的制造、物流、销售等各个方面的数据进行分析以满足业务决策。 而随着公司数字化服务的演进&#xff0c;业务诉求和技术架构有…

ELK Stack 日志平台搭建

前言 最近在折腾 ELK 日志平台&#xff0c;它是 Elastic 公司推出的一整套日志收集、分析和展示的解决方案。 专门实操了一波&#xff0c;这玩意看起来简单&#xff0c;但是里面的流程步骤还是很多的&#xff0c;而且遇到了很多坑。在此记录和总结下。 本文亮点&#xff1a;…

如何添加或编辑自定义WordPress侧边栏

WordPress侧边栏是许多WordPress网站上的固定装置。它为您的内容提供了一个垂直空间&#xff0c;您可以在其中帮助读者导航、增加电子邮件列表或社交关注、展示广告等。 因为它是许多WordPress网站不可或缺的一部分&#xff0c;所以我们认为侧边栏值得拥有自己的大型指南。在这…

【AIGC】开源声音克隆GPT-SoVITS

GPT-SoVITS 是由 RVC 创始人 RVC-Boss 与 AI 声音转换技术专家 Rcell 共同开发的一款跨语言 TTS 克隆项目&#xff0c;被誉为“最强大中文声音克隆项目” 相比以往的声音克隆项目&#xff0c;GPT-SoVITS 对硬件配置的要求相对较低&#xff0c;一般只需 6GB 显存以上的 GPU 即可…