开始MySQL之路——外键关联和多表联合查询详细概述

多表查询和外键关联

实际开发中,一个项目通常需要很多张表才能完成。例如,一个商城项目就需要分类表,商品表,订单表等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习多表方面的知识。

多表关系

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

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

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

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

一对多/多对一关系

部门和员工

分析:一个部分有多个员工,一个员工只能对应一个部门,实际原则:在多的一方建立外键,指向一的一方。

多对多关系

学生和课程

分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择,原则:多对多关系实际需要借助第三张中间表。中间表至少包含两个字段,将多对多的关系,拆成一对多的关系,中间表至少要有两个外键,这两个外键分别指向原来的那张两张表的主键

 

外键约束

介绍

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

外键用来建立主表与从表的关联关系,为两个表的数据简历连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果,桃子,李子,西瓜等4种水果,那么,你来到水果摊要买水果只能选择苹果,桃子,李子和西瓜,其它的水果都是不能购买的。

特点

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

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

  2. 必须为主表定义主键。

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

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

  5. 在外键中的数目必须和主键的主键中列的数目相同。

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

创建外键约束-第一种方式

方式一:在创建表时设置外键约束

在create table语句中,通过foreign key关键字来指定外键,具体的语法格式如下:

[constraint<外键名>] foreign key 字段名[,字段名2,...] references<主键名> 主键列1 [,主键列2,...]

实现:

create database mydb3;
use mydb3;
-- 创建部门表
create table if not exists dept(
  depton varchar(20) primary key, -- 部门号
  name varchar(20) --部门名字
);

方式1-在创建表时设置外键约束

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

代码实现

外键约束
create database mydb3;
use mydb3;

创建部门表
create table if not exists dept(
   deptno varchar(20) primary key, -- 部门编号
   name varchar(20) -- 部门名字
);

创建员工表,并创建外键约束 -方式1
[constraint<外键名> ] foreign key 字段名 [,字段名2,...] references<主表名> 主键列1[,主键列2,...]

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)
);

创建外键约束-第二种方式

外键约束也可以在修改表时添加,但是添加外键约束的前提是:才表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。

alter table <数据表名> add constarint <外键名> foreign key(<列名>) references <主表名>(<列名>);

在外键约束下的数据操作

删除外键约束

多对多关系

多表联合查询

 

内连接查询

 

外连接查询

子查询

①:基本子查询

②:all关键字

③:Any和some

④:in

⑤:Exists

自关联查询

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

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

相关文章

Spring、SpringMVC、SpringBoot三者的区别

目录 Spring是什么&#xff1f; SpringMVC是什么&#xff1f; SpringBoot是什么&#xff1f; Spring、SpringMVC、SpringBoot三者之间的关系 Spring是什么&#xff1f; Spring是一个开源的应用程序框架&#xff0c;它提供了一种简易的开发方式&#xff0c;通过依赖注入和面…

微服务项目容器编排docker-compose.yml、Dockerfile文件模板、相关配置文件、shell脚本

nacos Dockerfile&#xff08;不需要特殊处理&#xff0c;使用docker conpose可以不写&#xff09; # 基础镜像 FROM nacos/nacos-server # author MAINTAINER jianglifeng<jlifengfoxmail.com> RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ &&a…

Qt --- 自定义提示框 类似QMessagebox

QMessageBox::information(NULL, QString("title"), QString("I am information")); 以下是自定义提示框的代码&#xff0c;有图有真相&#xff01;提示框大部分都采用模态的形式&#xff0c;关于模态也不再多提&#xff01;所以父类为QDialog&#xff0c;…

若依移动端Ruoyi-App 项目的后端项目入门

后端项目运行 运行报错 Error creating bean with name sysConfigServiceImpl: Invocation of init method failed 数据库创建了。 代码连接数据库地方了也匹配上了。但是还是报错。 分析 &#xff1a; 想起来我电脑从来没有安装过redis 下载安装redis到windows 链接&…

【Mac】编译Spring 源码和Idea导入

今天我们开始Spring源码的阅读之旅。阅读Spring的源码的第一步当然是编译Spring源码。首先我们要去GitHub上将spring源码给clone下来。 笔者编译环境如下&#xff1a; Spring版本&#xff1a;5.28 https://github.com/spring-projects/spring-framework/tree/v5.2.8.RELEASE …

人工智能项目集合推荐(数据集 模型训练 C++和Android部署)

人工智能项目集合推荐(数据集 模型训练 C和Android部署) 目录 人工智能项目集合推荐(数据集 模型训练 C和Android部署) 1.三维重建项目集合 ★双目三维重建 ★结构光三维重建 2.AI CV项目集合 ★人脸检测和人体检测 ★人体姿态估计(人体关键点检测) ★头部朝向估计 …

【C++初阶】模拟实现list

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

nginx配置站点强制开启https

当站点域名配置完SSL证书后&#xff0c;如果要强制开启HTTPS&#xff0c;可以在站点配置文件中加上&#xff1a; #HTTP_TO_HTTPS_START if ($server_port !~ 443){rewrite ^(/.*)$ https://$host$1 permanent; } #HTTP_TO_HTTPS_END 附上完整的配置完SSL证书&#xff0c;强制…

W18.4、单元测试

一、目标: 1. 提高代码质量 2. 提高提测质量 3. 降低联调成本 4. 减少修改代码引入新问题 二、单元测试要点 1. 编写独立的测试类:为每个要测试的类编写一个对应的测试类,保持测试代码与实际代码分离。 2. 测试代码覆盖率:尽量确保对实际代码的所有分支和边界情况…

Consul的简介与安装

1、Consul简介 Consul是一套开源的分布式服务发现和配置管理系统&#xff0c;由HashiCorp公司用Go语言开发&#xff0c;Consul提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用&#xff0c;也可以一起使用以构建全方位的服…

Node.js怎么搭建HTTP服务器

在 Node.js 中搭建一个简单的 HTTP 服务器非常容易。以下是一个基本的示例&#xff0c;演示如何使用 Node.js 创建一个简单的 HTTP 服务器&#xff1a; // 导入 http 模块 const http require(http); // 创建一个 HTTP 服务器 const server http.createServer((req, res) …

Docker容器与虚拟化技术:GitHub账户注册

目录 一、实验 1.GitHub 一、实验 1.GitHub &#xff08;1&#xff09;GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持Git作为唯一的版本库格式进行托管&#xff0c;故名GitHub。 &#xff08;2&#xff09;官网 GitHub: Let’s build from here …

DQL语句的用法(MySQL)

文章目录 前言一、DQL语句间接和语法1、DQL简介2、DQL语法 二、DQL语句使用1、基础查询&#xff08;1&#xff09;查询多个字段&#xff08;2&#xff09;为字段设置别名&#xff08;3&#xff09;去除重复记录 总结 前言 本文主要介绍SQL语句中DQL语句的功能和使用方法&#…

乐趣无限:10款基于Pygame的经典游戏合集

​​​​​​引言 游戏开发一直是许多程序员和游戏爱好者追求的梦想。而Pygame作为一款功能强大的游戏开发库&#xff0c;为我们提供了实现各种有趣游戏的工具和接口。在本文中&#xff0c;我将向大家介绍10款基于Pygame的经典游戏合集&#xff0c;从简单的猜数字到刺激的飞机…

本地私有仓库、harbor私有仓库部署与管理

本地私有仓库、harbor私有仓库部署与管理 一、本地私有仓库1.本地私有仓库简介2.搭建本地私有仓库3.容器重启策略介绍 二、harbor私有仓库部署与管理1.什么是harbor2.Harbor的特性3.Harbor的构成4.harbor部署及配置5.客户端测试 三、Harbor维护1.创建2.普通用户操作私有仓库3.日…

一个mongodb问题分析

mongodb问题分析 现状 表的个数&#xff1a; 生产上常用的表就10来个。 sharding cluster replica set方式部署&#xff1a; 9个shard server&#xff0c; 每个shard server 1主2从&#xff0c; 大量数据写入时或对大表创建索引时&#xff0c;可能有主从复制延迟问题。实…

opencv-全景图像拼接

运行环境 python3.6 opencv 3.4.1.15 stitcher.py import numpy as np import cv2class Stitcher:#拼接函数def stitch(self, images, ratio0.75, reprojThresh4.0,showMatchesFalse):#获取输入图片(imageB, imageA) images#检测A、B图片的SIFT关键特征点&#xff0c;并计算…

C#,《小白学程序》第四课:数学计算

1 文本格式 /// <summary> /// 《小白学程序》第四课&#xff1a;数学计算 /// 这节课超级简单&#xff0c;就是计算成绩的平均值&#xff08;平均分&#xff09; /// 这个是老师们经常做的一件事。 /// </summary> /// <param name"sender"></…

管理类联考——英语——实战篇——大作文——图表——动态图表——第三段

第一句:Given all above arguments, it admits of no doubt that this tendency of 主题词2 will continue in the forthcoming years. 翻译:从以上我们的讨论来看,我们可以预测主题词2这一趋势在未来几年内仍将继续。 [备注1]:本句为趋势预测句,不需要说明…

【操作记录】CLion 中引入 Gurobi 并使用 C++ 编程

文章目录 一、前言二、具体操作2.1 创建项目2.2 修改编译工具2.3 修改 CMakeLists.txt2.4 修改 main.cpp2.5 运行测试 一、前言 虽然C编程大部分人都会选择使用VS&#xff0c;但是作为 IDEA 的长期用户&#xff0c;我还是比较习惯 JetBrains 风格的编译器&#xff0c;所以就选…