当前位置: 首页 > news >正文

MySQL---多表联合查询(上)(多表关系、外键约束、学生成绩多表关系、交叉连接查询)

1. 多表关系

MySQL多表之间的关系可以概括为:

一对一:

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

       实现原则:在任一表中添加唯一外键,指向另一方主键,确保一对一关系。

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

一对多:

        比如:一个部门有多个员工,一个员工只能对应一个部门

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

多对多:

        比如:一个学生可以选择很多门课程,一个课程也可以被很多学生选择

        实现原则:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,将多对多关

系,拆成一对多关系,中间表至少要有两个外键,这两个外键分别指向原来的那两张表的主键

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

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

必须为主表定义主键。

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

键中,这个外键的内容就是正确的。

 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。

外键中列的数目必须和主表的主键中列的数目相同。

外键中列的数据类型必须和主表主键中对应列的数据类型相同。

2. 外键约束相关操作

创建外键约束:
-- 方式1:在创建表时创建外键
-- [constraint <外键名>] foreign key 字段名 [,字段名2,…] 
-- references <主表名> 主键列1 [,主键--列2,…]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 <数据表名> add constraint <外键名> foreign key(<列名>) references 
-- <主表名> (<列名>);-- 创建部门表
create table if not exists dept2(deptno varchar(20) primary key ,  -- 部门号name varchar(20) -- 部门名字
);-- 创建员工表
create table if not exists emp2(eid varchar(20) primary key , -- 员工编号ename varchar(20), -- 员工名字age int,  -- 员工年龄dept_id varchar(20)  -- 员工所属部门);-- 创建外键约束
alter table emp2 add constraint dept_id_fk foreign key(dept_id) references dept2 (deptno);

在外键约束下的数据操作:

 -- 1、添加主表数据-- 注意必须先给主表添加数据
insert into dept values('1001','研发部');
insert into dept values('1002','销售部');
insert into dept values('1003','财务部');
insert into dept values('1004','人事部’);
-- 2、添加从表数据-- 注意给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列
insert into emp values('1','乔峰',20, '1001');
insert into emp values('2','段誉',21, '1001');
insert into emp values('3','虚竹',23, '1001');
insert into emp values('4','阿紫',18, '1002');
insert into emp values('5','扫地僧',35, '1002');
insert into emp values('6','李秋水',33, '1003');
insert into emp values('7','鸠摩智',50, '1003'); 
insert into emp values('8','天山童姥',60, '1005');  -- 不可以
-- 3、删除数据/*注意:1:主表的数据被从表依赖时,不能删除,否则可以删除2: 从表的数据可以随便删除*/
delete from dept where deptno = '1001'; -- 不可以删除
delete from dept where deptno = '1004'; -- 可以删除
delete from emp where eid = '7'; -- 可以删除

删除外键:

-- 语法:alter table <表名> drop foreign key <外键约束名>;alter table emp2 drop foreign key dept_id_fk;

3. 建立一个多对多关系(学生成绩)

 

-- 学生表和课程表(多对多)-- 创建学生表student(左侧主表)create table if not exists student(sid int primary key auto_increment,name varchar(20),age int,gender varchar(20));-- 创建课程表course(右侧主表)create table course(cid  int primary key auto_increment,cidname varchar(20));-- 创建中间表student_course/score(从表)create table score(sid int,cid int,score double);-- 建立外键约束(2次)alter table score add foreign key(sid) references student(sid);
alter table score add foreign key(cid) references course(cid);-- 给学生表添加数据
insert into student values(1,'小龙女',18,'女'),(2,'阿紫',19,'女'),(3,'周芷若',20,'男');
-- 给课程表添加数据
insert into course values(1,'语文'),(2,'数学'),(3,'英语');
-- 给中间表添加数据
insert into score values(1,1),(1,2),(2,1),(2,3),(3,2),(3,3);

4. 交叉连接查询

数据准备:

use mydb3;-- 创建部门表
create table if not exists dept3(deptno varchar(20) primary key ,  -- 部门号name varchar(20) -- 部门名字
);-- 创建员工表
create table if not exists emp3(eid varchar(20) primary key , -- 员工编号ename varchar(20), -- 员工名字age int,  -- 员工年龄dept_id varchar(20)  -- 员工所属部门
);-- 给dept3表添加数据
insert into dept3 values('1001','研发部');
insert into dept3 values('1002','销售部');
insert into dept3 values('1003','财务部');
insert into dept3 values('1004','人事部');-- 给emp表添加数据
insert into emp3 values('1','乔峰',20, '1001');
insert into emp3 values('2','段誉',21, '1001');
insert into emp3 values('3','虚竹',23, '1001');
insert into emp3 values('4','阿紫',18, '1001');
insert into emp3 values('5','扫地僧',85, '1002');
insert into emp3 values('6','李秋水',33, '1002');
insert into emp3 values('7','鸠摩智',50, '1002'); 
insert into emp3 values('8','天山童姥',60, '1003');
insert into emp3 values('9','慕容博',58, '1003');
insert into emp3 values('10','丁春秋',71, '1005');

交叉连接查询:

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

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

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

笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选

-- 语法:select * from 表1,表2,表3….; -- 交叉连接查询select * from dept3,emp3;

结果:

 (日常美图时间)

 

 

相关文章:

MySQL---多表联合查询(上)(多表关系、外键约束、学生成绩多表关系、交叉连接查询)

1. 多表关系 MySQL多表之间的关系可以概括为&#xff1a; 一对一&#xff1a; 比如&#xff1a;一个学生只有一张身份证&#xff1b;一张身份证只能对应一学生。 实现原则&#xff1a;在任一表中添加唯一外键&#xff0c;指向另一方主键&#xff0c;确保一对一关系。 一般一对…...

【iOS】—— RunLoop线程常驻和线程保活

文章目录 没有线程常驻会怎么样&#xff1f; 线程常驻线程保活 没有线程常驻会怎么样&#xff1f; 我们一般写一个子线程&#xff0c;子线程执行完分配的任务后就会自动销毁&#xff0c;比如下面这个情况&#xff1a; 我们先重写一下NSThread里面的dealloc方法&#xff0c;打印…...

Springcloud--docker快速入门

认识docker docker相关操作 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…...

基于AT89C51单片机的电子计数器设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87770826 源码获取 主要内容&#xff1a; 设计一个电子计时器&#xff0c;数码管初始显示值为“00”&#xff0c;每隔1s电子秒表加1&#xff1b;秒计数到60时清0&a…...

IT程序员如何面对35岁大龄问题?我从公司老板的角度聊聊

很多从事IT行业的人一想到35岁就很焦虑&#xff0c;担心自己被公司裁员后找不到工作。同时还有家庭责任加身&#xff0c;担心中年失业后晚年生活。作为一位公司老板&#xff0c;我想从我的角度谈一下这个问题。 首先&#xff0c;我本质上不介意我的员工年龄&#xff0c;无论是…...

【计算机专业漫谈】【计算机系统基础学习笔记】W2-2-2 模运算系统和补码表示

利用空档期时间学习一下计算机系统基础&#xff0c;以前对这些知识只停留在应试层面&#xff0c;今天终于能详细理解一下了。参考课程为南京大学袁春风老师的计算机系统基础MOOC&#xff0c;参考书籍也是袁老师的教材&#xff0c;这是我的听课自查资料整理后的笔记 补码表示法…...

vue概述

vue2和vue3的区别 vue2和vue3区别 NOvue2vue31 optinos Api写法 比较分散 Compostiton Api 代码集 2重写数序双向绑定通过Object.defineProperty&#xff08;&#xff09;实现 基于Proxy实现 对数组有了更好的支持 3Fragments 1&#xff0c;在template中只能一个div 2&#xf…...

SpringCloud-OpenFeign案例实战

关于Spring Cloud Open Feign的介绍可以参考这两篇博客 OpenFeign服务接口调用 使用Feign作为服务消费者 本博客参考gitee开源项目代码&#xff0c;结合自己的理解&#xff0c;记录下微服务场景下的使用。Talk is cheap. Show me the code&#xff01; 一、项目结构 这里使用…...

ACM - 数学 - 提高(还没学多少)

ACM - 数学 练习题 一、数论1、分解质因数 &#xff1a;AcWing 197. 阶乘分解2、求约数个数&#xff08;1&#xff09;AcWing 1294. 樱花 &#xff08;求 n&#xff01;约数个数之和&#xff09;&#xff08;2&#xff09;AcWing 198. 反素数 &#xff08;求 1 ~ N 中约数最多的…...

JavaScript class和继承的原理

&#xff08;对于不屈不挠的人来说&#xff0c;没有失败这回事。——俾斯麦&#xff09; class 相关链接 MDN链接 有关类的详细描述 关于构造函数&#xff0c;原型和原型链的说明 类的概述 类是用于创建对象的模板。他们用代码封装数据以处理该数据。JS 中的类建立在原型上…...

Playwright-python 自动化测试【Anaconda】环境配置

第一步&#xff1a;Anaconda的安装 安装Anaconda的好处&#xff0c;比prenv网速快&#xff0c;并且拥有独立的python环境&#xff0c;再也不用烦恼用哪个python好了。 Anaconda的下载页参见官网下载&#xff0c;Linux、Mac、Windows均支持。 https://mirrors.tuna.tsinghua.ed…...

攻防世界-web-simple js

题目描述&#xff1a;小宁发现了一个网页&#xff0c;但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} ) 打开链接&#xff1a; 然后我们会发现不管我们输入什么密码&#xff0c;发现是都是这样的报错 1. 先用bp抓包看看&#xff0c;可以抓到这样的一串js脚本 看不懂…...

【SpringCloud】初始微服务

目录 一、单体架构 1、概念 2、优点 3、缺点 二、分布式架构 1、概念 2、优点 3、缺点 三、微服务 1、概念 2、优点 3、缺点 四、微服务技术对比 五、SpringCloud 六、服务拆分 1、注意事项 2、服务远程调用 一、单体架构 1、概念 业务的所有功能都集中到一个…...

均摊时间复杂度

均摊时间复杂度&#xff0c;它对应的分析方法&#xff0c;摊还分析&#xff08;或者叫平摊分析&#xff09; 均摊时间复杂度应用的场景比它更加特殊、更加有限 // array表示一个长度为n的数组// 代码中的array.length就等于nint[] array new int[n];int count 0;void insert…...

夏驰和徐策的解决数学问题思路——反证法

反证法是一种证明方法&#xff0c;它的基本思路是通过假设某个结论不成立&#xff0c;然后构造出一个矛盾的情况来推导出原先假设的结论是成立的。 具体来说&#xff0c;反证法一般包含以下步骤&#xff1a; 1. 假设所要证明的命题不成立。 2. 通过这个假设&#xff0c;构造…...

面向开发人员的 ChatGPT 提示词教程 - ChatGPT Prompt Engineering for Developers

面向开发人员的 ChatGPT 提示词教程 - ChatGPT Prompt Engineering for Developers 1. 指南(原文: Guidelines)1-1. 提示的指南(原文: Guidelines for Prompting)1-2. 配置1-3. 提示语原则(原文: Prompting Principles)原则 1: 写出清晰而具体的指示(原文: Write clear and spe…...

虹科方案|使用 HK-TRUENAS支持媒体和娱乐工作流程-1

一、摘要 开发和交付能够随时随地触及受众的媒体内容变得越来越重要和复杂。 在当今高度互联、娱乐驱动的世界中&#xff0c;媒体和娱乐 (M&E) 公司需要保持竞争力才能取得成功。 这些组织需要制作各种不同格式的信息和娱乐内容&#xff0c;以便在移动设备、台式机、工作站…...

DDR5内存彻底白菜价,国外大厂却整出了比着火更离谱的骚操作

今年的 PC 硬件市场&#xff0c;似乎出现了明显两极分化现象。 一边是 N、A 两家新显卡价格高高在上&#xff0c;摆明了不坑穷人。 另一边固态硬盘、内存条又在疯狂互卷不断杀价。 四五百元的 2TB SSD&#xff0c;二百元的 16G 内存条早已见怪不怪。 要说面世多年的 PCIe 3.0…...

Linux网络——Shell编程之函数

Linux网络——Shell编程之函数 一、概述二、定义函数的格式1.格式一2.格式二 三、函数的查看和删除1.查看 declare2.删除 declare 四、函数的返回值1.return 返回值2.echo 返回值 五、函数的参数传入与变量范围1.函数的传参2.函数变量的作用范围 六、函数的应用1.阶乘2.递归目录…...

GQCNN+PointNetGPD思路和问题--chatGPT

有很多算法是通过神经网络来预测机械臂抓手的抓取位置&#xff0c;其中一些算法需要点云数据作为输入&#xff0c;例如&#xff1a; PointNetGPD&#xff1a;PointNetGPD是一个端到端的基于点云的抓取姿态检测算法。它使用了一个PointNet架构来处理点云输入&#xff0c;并输出每…...

PrimeTime实战指南:从基础STA流程到精准时序报告解析

1. PrimeTime与静态时序分析基础 刚接触PrimeTime时&#xff0c;我和大多数工程师一样被满屏的时序报告搞得头晕眼花。直到把整个设计流程跑通三遍后&#xff0c;才真正理解这个工具的价值。PrimeTime&#xff08;简称PT&#xff09;是Synopsys推出的静态时序分析黄金工具&…...

【FastAPI】 + SQLAlchemy 异步 ORM 实现完整 CRUD 操作

&#x1f680;从零实战&#xff1a;FastAPI SQLAlchemy 异步 ORM 实现完整 CRUD 操作&#xff08;附完整代码&#xff09; 一、为什么要学「FastAPI SQLAlchemy 异步 ORM」&#xff1f; 在现代 Web 服务中&#xff0c;数据库是核心组件。然而&#xff0c;传统同步操作&#x…...

Go语言的分布式事务处理

Go语言的分布式事务处理 1. 分布式事务简介 在分布式系统中&#xff0c;事务处理变得更加复杂。传统的单机事务可以通过数据库的ACID特性来保证一致性&#xff0c;但在分布式环境中&#xff0c;由于网络延迟、节点故障等因素&#xff0c;确保多个服务之间的数据一致性成为一个挑…...

避开带宽陷阱:用低成本示波器搞定MIPI CSI-2信号的眼图与时序分析

避开带宽陷阱&#xff1a;用低成本示波器搞定MIPI CSI-2信号的眼图与时序分析 当你手头只有一台几百MHz带宽的示波器&#xff0c;却要分析动辄上Gbps的MIPI CSI-2高速信号时&#xff0c;是否感到无从下手&#xff1f;别担心&#xff0c;这篇文章将带你突破硬件限制&#xff0c;…...

基于DDPG算法的发电公司竞价策略代码逐逐段解读说明

python代码&#xff1a;基于DDPG&#xff08;深度确定性梯度策略&#xff09;算法的售电公司竞价策略研究 关键词&#xff1a;DDPG 算法 深度强化学习 电力市场 发电商 竞价 说明文档&#xff1a;完美复现英文文档&#xff0c;可找我看文档 主要内容&#xff1a; 代码主要…...

claw-code 源码详细分析:Parity Audit——如何用工程对比把「像不像」从口水战变成可重复报告?

涉及源码&#xff1a;src/parity_audit.py、src/reference_data/archive_surface_snapshot.json、commands_snapshot.json、tools_snapshot.json&#xff0c;src/main.py&#xff0c;tests/test_porting_workspace.py。1. 要解决什么问题 大型移植里&#xff0c;「我们已经很像…...

别只盯着stkInit!用这个STK MATLAB互联测试脚本,一键验证你的环境是否真的配好了

别只盯着stkInit&#xff01;用这个STK MATLAB互联测试脚本&#xff0c;一键验证你的环境是否真的配好了 当你第一次成功将STK与MATLAB连接时&#xff0c;那种成就感就像打通了任督二脉。但很快你会发现&#xff0c;仅仅能执行stkInit并不意味着你的环境已经完全配置妥当。就像…...

油冷式电动滚筒设计【含说明书、CAD图纸、SW三维】

油冷式电动滚筒作为带式输送机的核心驱动部件&#xff0c;集电机、减速器与冷却系统于一体&#xff0c;通过内部循环油路实现高效散热与润滑&#xff0c;显著提升设备运行的稳定性与寿命。其核心作用在于将电能转化为机械能&#xff0c;驱动输送带运转&#xff0c;同时利用油液…...

2026最权威的十大降AI率工具横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 凭借人工智能技术来辅助撰写开题报告&#xff0c;能极大程度显著提升文献梳理以及框架搭建的…...

终极指南:免费在电脑上玩Switch游戏,Ryujinx模拟器完整教程

终极指南&#xff1a;免费在电脑上玩Switch游戏&#xff0c;Ryujinx模拟器完整教程 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是否曾想过在电脑上体验《塞尔达传说&#xff1a;…...