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,一经查实,立即删除!

相关文章

Mesh中的负载均衡策略介绍

通过负载均衡配置,将请求均匀分配到各个服务节点,避免请求集中在某一点上 Round Robin Weighted Round Robin Ring Hash Weighted Ring Hash​ Random Weighted Random Least Request Ring Hash MD5 Mesh 数据面基于 Envoy 深度定制,在负载均衡算法方面,使用的大部分是 En…

国产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;方便学习。 下载完成后在一个顺眼的地方解压压…

力扣刷题-202.快乐数

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c…

华为OD机试真题-二叉树计算-2024年OD统一考试(C卷)

题目描述:给出一个二叉树如下图所示: 6 / \ 7 9 \ / -2 6 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 2…

读取Excel工具类

需要的jar包 poi-3.13.jar poi-ooxml-3.13.jar poi-ooxml-schemas-3.13.jar poi-scratchpad-3.9.jar 工具类1 package com.test.poi;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.…

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动态网站部署架构是一套由&…

HTML5 扩展了 HTMLDocument 类型

HTMLDocument 扩展 ​ HTML5 扩展了 HTMLDocument 类型&#xff0c;增加了更多功能。与其他 HTML5 定义的 DOM 扩展一样&#xff0c; 这些变化同样基于所有浏览器事实上都已经支持的专有扩展。为此&#xff0c;即使这些扩展的标准化相对较晚&#xff0c; 很多浏览器也早就实现…

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

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

Go语言进阶篇——泛型

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

使用Java语言,解决斐波那契兔子问题

/* 一对兔子&#xff0c;从出生后第三个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c; 假如兔子都不死&#xff0c;问第二十个月的兔子对数为多少&#xff1f; 1 1 2 3 5 8 13 1 1 1 1 1 1 11 1 1 1 11 1 1 11 1 11 1 11 11 11 11111…

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

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

用c++实现背包问题动态规划求解算法

背包问题是一类组合优化的问题。在其最简单的形式中,问题模型是这样的:假设你有一个能承受最大重量为W的背包和一系列物品,每个物品都有其自身的重量和价值,目标是确定哪些物品应该被选中放入背包,使得背包内物品的总价值最大,同时不超过背包的最大承重。 下面是使用C++…

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

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