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 条件;

七.总结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArcgisForJS如何访问Arcgis Server?

文章目录 0.引言1.准备ArcGIS相关工具2.创建含有ArcSDE地理数据库的MXD文件3.注册ArcSDE地理数据库4.发布数据到Arcgis Server5.ArcgisForJS访问ArcGIS Server数据 0.引言 ArcGIS API for JavaScript 是一个用于在Web和移动应用程序中创建交互式地图和地理空间分析应用的库。它…

抽象工厂模式 Abstract Factory

1.模式定义: 提供一个创建一系列相关或互相依赖对象的接口&#xff0c;而无需指定它们具体的类 2. 应用场景: 程序需要处理不同系列的相关产品&#xff0c;但是您不希望它依赖于这些产品的 具体类时&#xff0c; 可以使用抽象工厂 3.优点: 1.可以确信你从工厂得到的产品彼…

恒峰-智能高压森林应急消防泵:安全护林新利器

随着科技的发展&#xff0c;人类对自然资源的保护意识日益增强。森林作为地球上最重要的生态系统之一&#xff0c;对于维护生态平衡、净化空气、保持水源等方面发挥着举足轻重的作用。然而&#xff0c;森林火灾却时常威胁着这片绿色家园。为了更好地保护森林资源&#xff0c;智…

D5020——外围元件少,内含压缩器和扩展器静噪电路,可应用在1.5V立体声耳机上,响应时间可调

D5020是一块增益可调 的压缩、扩展电路。它有两个通道组成&#xff0c;一个通道作扩展用&#xff0c;另一个通道能作压缩或扩展用。电路内部含有小信号全波整流、检测信号的大小&#xff0c;用于调节输入或反馈通道的增益大小。含有温度特性较好的带隙精密基准源&#xff0c;静…

二.西瓜书——线性模型、决策树

第三章 线性模型 1.线性回归 “线性回归”(linear regression)试图学得一个线性模型以尽可能准确地预测实值输出标记. 2.对数几率回归 假设我们认为示例所对应的输出标记是在指数尺度上变化&#xff0c;那就可将输出标记的对数作为线性模型逼近的目标&#xff0c;即 由此&…

五种多目标优化算法(NSWOA、MOJS、MOAHA、MOPSO、NSGA2)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1NSWOA 1.2MOJS 1.3MOAHA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…

上进计划 | Python爬虫经典实战项目——电商数据爬取!

电商数据采集之——电商数据爬虫|电商数据采集API接口 电商数据爬虫背景 在如今这个网购风云从不间歇的时代&#xff0c;购物狂欢持续不断&#xff0c;一年一度的“6.18年中大促”、“11.11购物节”等等成为了网购电商平台的盛宴。在买买买的同时&#xff0c;“如何省钱&#…

昇腾ACL应用开发之模型转换ATC

一.前提条件 在前面的章节中我们已经安装了包含模型转换的套件包CANN-TOOLKIT&#xff0c;默认的安装路径会在/usr/local/Ascend里面&#xff0c;我们将该套件所需要的东西加入到环境变量中以便我们调用&#xff1a; 将source /usr/local/Ascend/ascend-toolkit/set_env.sh加入…

【鸿蒙系统学习笔记】TypeScript开发语言

一、背景 HarmonyOS 应用的主要开发语言是 ArkTS&#xff0c;它由 TypeScript&#xff08;简称TS&#xff09;扩展而来&#xff0c;在继承TypeScript语法的基础上进行了一系列优化&#xff0c;使开发者能够以更简洁、更自然的方式开发应用。值得注意的是&#xff0c;TypeScrip…

力扣 面试题 05.06. 整数转换

思路&#xff1a; 牵扯到二进制数&#xff0c;基本上要考虑位运算符&#xff0c;相关知识可以见http://t.csdnimg.cn/fzts7 之前做过类似的题目&#xff0c;大致思路就是先用按位异或^找出不同位&#xff0c;再用n&&#xff08;n-1&#xff09;计算出不同位的个数&#x…

nuxt项目搭建

1.先下载nuxt脚手架 yarn create nuxt-app <项目名>&#xff0c;记得安装完项目&#xff0c;npm i,下载node包 目录介绍 components 存放组件分别是头部&#xff08;包含导航&#xff09;和底部 layouts 页面布局&#xff0c;实现一个页面整体架构规则&#xff0c;头…

Sora 全网最全资料

大家好,本资料库是全网集体智慧的结晶,通过这个资料库,我们希望能够为读者提供一个全方位、多角度了解和研究Sora大模型的平台。每一部分都旨在深入探讨Sora大模型的不同方面,从技术细节到社会影响,再到未来展望,以确保读者能够获得最全面的信息和洞见。 📁一. 概念和…

yolov5导出onnx转engine推理

yolov5导出注意事项 配置 需要提供配置文件和权重文件&#xff0c;不然导出模型不能正常推理。 默认提供检测头。 ModuleNotFoundError: No module named ‘tensorrt’安装TensorRT-python发现报错 由于ModuleNotFoundError: No module named ‘tensorrt’安装TensorRT-pyt…

Android14 InputManager-InputManagerService环境的构造

IMS分为Java层与Native层两个部分&#xff0c;其启动过程是从Java部分的初始化开始&#xff0c;进而完成Native部分的初始化。 □创建新的IMS对象。 □调用IMS对象的start&#xff08;&#xff09;函数完成启动 同其他系统服务一样&#xff0c;IMS在SystemServer中的ServerT…

不要抱怨,不如抱 Java 运算符吧 (1)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

mplfinance 使用make_addplot做复杂股票走势图

mplfinance 使用make_addplot做复杂股票走势图 1.代码 import talib as tb import pandas as pd import mplfinance as mpfimport matplotlib.pyplot as pltplt.rcParams[font.sans-serif][simHei] # 以黑体显示中文 plt.rcParams[axes.unicode_minus]False # 解决保存图像符…

Meta 发布 MMCSG (多模态智能眼镜对话数据集)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

LeetCode 热题 100 Day01

哈希模块 哈希结构&#xff1a; 哈希结构&#xff0c;即hash table&#xff0c;哈希表|散列表结构。 图摘自《代码随想录》 哈希表本质上表示的元素和索引的一种映射关系。 若查找某个数组中第n个元素&#xff0c;有两种方法&#xff1a; 1.从头遍历&#xff0c;复杂度&#xf…

Java 学习和实践笔记(15):面向过程和面象对象其实很简单!

学完这一节&#xff0c;才真正明白了什么叫面向对象和面向过程&#xff0c;其实很简单~ 第一个例子&#xff1a;怎样把大象装进冰箱 这个很清楚很容易地可以列出第一步。 第二个例子&#xff1a;怎样制造一台汽车 这个就很难确定哪一步做第一步。 面向过程和面向对象的区别 …

【二十六】【C++】Map和Set

K模型与KV模型 在数据结构中&#xff0c;二叉搜索树&#xff08;BST&#xff09;的应用通常围绕着两种基本模型&#xff1a;键模型&#xff08;K模型&#xff09;和键值对模型&#xff08;KV模型&#xff09;。这两种模型定义了树中节点存储数据的方式&#xff0c;以及如何通过…