Mysql 多表关联查询

2023-11-15

1. Mysql中表之间的关系

1.1 多表关系

Mysql多表之间具有三种关系:一对一、一对多、多对多

  • 一对一:一张表中的一条数据对应另外一张表中的一条数据,比如一个人只有一张身份证,一张身份证对应一个人。一对一关系比较少见,因为一对一这种关系的表可以合并成一张表
  • 一对多:一张表中的一条数据可以和另外一张表中多条数据关联,拿部门表和员工表举例,一个部门有多个员工,一个员工只能对应一个部门;可以在多的一方建立外键,指向唯一的一方的主键进行关联
  • 多对多:拿学生表和课程表举例,一个学生可以选择多门课程,一个课程也可以被很多学生选择;多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,将多对多的关系,拆成一对多的关系,中间表至少要有两个外键,这两个外键分别指向原来的那两张表的主键

1.2 外键约束

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

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。在有外键约束的前提下,不能直接删除主表中的数据,因为从表对主表有关联关系,但是可以删除从表中的数据。在实际sql查询中,外键约束对查询无影响

外键约束的创建

语法1,在创建表的时候设置外键约束,在 create table 语句中,通过 foreign key 关键字来指定外键:
[constraint <外键名>] foreign key 字段名 [,字段名2,…] references <主表名> 主键列1 [,主键列2,…]

示例1-- 部门表
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 
<主表名> (<列名>);

示例2-- 创建部门表
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);

在表的多对多关系中,我们只需要在中间表创建两个外键约束即可。

外键约束的删除

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

示例:
alter table emp2 drop foreign key dept_id_fk;

2. 多表联合查询

2.1 交叉连接查询:笛卡尔积

select * from A,B; 
  1. 交叉连接查询返回被连接的两个表所有数据行的笛卡尔积
  2. 笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
  3. 假如A表有m行数据,B表有n行数据,则返回m*n行数据
  4. 笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选

2.2 内连接查询:inner join

在这里插入图片描述

-- 隐式内连接:
select * from A,B where 条件; 

-- 显示内连接:
select * from A inner join B on 条件;

-- 示例:
select * from dept3,emp3 where dept3.deptno = emp3.dept_id;
select * from dept3 inner join emp3 on dept3.deptno = emp3.dept_id;

2.3 外连接查询

2.3.1 左连接:

在这里插入图片描述

-- 语法:
select * from A left outer join B on 条件;

-- 示例:
select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id;

2.3.2 右连接:

在这里插入图片描述

-- 语法:
 select * from A right outer join B on 条件;
 
-- 示例:
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;

2.3.4 满外连接:

在这里插入图片描述
mysql中,我们经常使用union关键字实现两个表(两个查询)的满外连接,两者的区别如下

  • union: 会自动压缩多个结果集合中的重复结果,对两个结果集进行并集操作,不包括重复行
  • union all: 则将所有的结果全部显示出来,不管是不是重复,包括重复行

使用union关键字需要注意

  • unionunion all 内部的 select 语句必须拥有相同数量的列
  • 每条 select 语句中列的顺序必须相同
-- 使用union关键字实现左外连接和右外连接的并集
select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id
union 
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;

2.4 子查询:

子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含select嵌套的查询。

-- 1. 子查询返回单行单列
select eid,ename,age from emp3 where age = (select max(age) from emp3);

-- 2. 单行多列
select eid,ename,t.name from emp3 where dept_id in (select deptnofrom dept3 where name = '研发部' or name = '销售部') ;

-- 3. 多行多列
select eid,age,ename,name from (select * from dept where name = '研发部 ')t1,(select * from emp3 where age <20)t2

子查询中的关键字

-- 1. all关键字:与子查询返回的所有值比较为true 则返回true
-- 查询年龄大于‘1003’部门所有年龄的员工信息
select * from emp3 where age > all(select age from emp3 where dept_id = '1003’);

-- 2. any(some)关键字:与子查询返回的任何值比较为true 则返回true
-- 查询年龄大于‘1003’部门任意一个员工年龄的员工信息
select * from emp3 where age > any(select age from emp3 where dept_id = '1003)

-- 3. in关键字:用于判断某个记录的值,是否在指定的集合中
-- 查询研发部和销售部的员工信息,包含员工号、员工名字
select eid,ename,t.name from emp3 where dept_id in (select deptno from dept3 where name = '研发部' or name = '销售部') ;

-- 4. exists关键字:EXISTS后面的子查询不返回任何实际数据,只返回真或假,当返回真时 where条件成立,EXISTS关键字,比IN关键字的运算效率高
-- 查询公司是否有大于60岁的员工,有则输出
select * from emp3 a where exists(select * from emp3 b where a.age > 60);

2.5 表自关联

有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。注意自关联时表必须给表起别名。

select 字段列表 from1 a ,1 b where 条件;
或者 
select 字段列表 from1 a [left] join1 b on 条件;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql 多表关联查询 的相关文章

  • 如何启用对 MySQL 服务器的外部访问? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 如何启用对 MySQL 服务器的外部访问 我可以在本地连接 但无法从网络上的另一个盒子进行连接 我刚刚尝试过 grant all privileges
  • MySql 复合索引

    我们使用 MySql 作为我们的数据库 以下查询在 mysql 表 大约 2500 万条记录 上运行 我在这里粘贴了两个查询 查询运行得太慢 我想知道更好的复合索引是否可以改善这种情况 你知道最好的综合指数是什么吗 并建议我这些查询是否需要
  • 使用java在mysql中插入带有\\的文件路径

    我正在使用java制作一个独立的应用程序 并且我需要插入用户从文件选择器中选择的图像的路径 我正在获取文件的路径 但是当我将其存储在数据库 mysql 中时 它不会存储 所以当我检索该路径时 该文件不会显示 如何存储文件的路径 这样就可以使
  • PLSQL 中的时区转换

    我需要将系统日期和时间转换为特定时区 例如东部时间 我无法假设我当前的时区 如何在plsql中转换它 请帮我 假设你有一个TIMESTAMP WITH TIME ZONE 例如systimestamp 您可以使用AT TIME ZONE句法
  • binary_log_types.h:没有这样的文件或目录

    我正在编译一个小型 mysql C 项目并且 遇到以下错误 C Program Files x86 MySQL MySQL Server 5 7 include mysql com h 22 30 fatal error binary lo
  • 如何使用 SQL - INSERT...ON DUPLICATE KEY UPDATE?

    我有一个脚本可以捕获推文并将其放入数据库中 我将在 cronjob 上运行脚本 然后在我的网站上显示数据库中的推文 以防止达到 Twitter API 的限制 所以我不想在我的数据库中有重复的推文 我知道我可以使用 INSERT ON DU
  • 像搜索一样在mysql中包含空格

    我在某些情况下使用 mysql like 关键字时遇到问题 我的要求是这样的 首先 当我搜索时 ABC 结果应该找到ABC and ABCdef但不是xyzABCdef or xyzABC 乍一看使用起来很简单ABC 但在我搜索时的情况 h
  • 如何限制mySQL中的搜索和替换字符串

    我用它来搜索和替换 mySQL 中的字符串 UPDATE products SET prodname REPLACE prodname S S 这些产品包含诸如 TYLENOL TABS 100 S 之类的字符串 我想将其转换为 TYLEN
  • MySQL创建表中的日期格式

    我必须使用 MySql 创建一个表 它可以按以下格式存储日期 我尝试过如下 CREATE TABLE birth date DATE 但它不起作用 因为日期格式是 YYYY MM DD 我该怎么办 谢谢 MySQL 或几乎任何其他数据库 中
  • 从 URL 生成报告 - SQL Server Reporting Services 2008

    我有 SQL Server Reporting Services 2008 当我打开以下 URL 时 http localhost Reports Pages Report aspx someReport 我正在进入报告屏幕 在其中填写参数
  • SQL 查询中的可选参数在检查 NULL 时非常慢

    我有许多已连接的表 最大行数约为 400 万条记录 我们正在存储过程中搜索该表 并且有一个默认值为 NULL 的可选参数 下面是我们正在运行的编辑示例 连接涉及更多表 但只有 1 个字段具有 WHERE 子句 DECLARE OwnerId
  • 使用实体框架创建临时表

    我想使用实体框架在 SQL Server 中创建临时表 我有什么办法可以做到这一点吗 如果我可以创建临时表 我的下一个问题是 如何读取它 提前致谢 Andr 好吧 所以你不喜欢存储过程路线 说实话我也不喜欢 但这是我能想到的最快的方法 基于
  • MySQL Spatial CONTAINS 显示错误结果

    我的 MySQL 空间搜索有一个奇怪的行为 我在 GEOM 字段 葡萄牙边界 中创建了一个多边形 然后我尝试在内部找到一个点 发现没问题 下一次尝试是查找多边形外部的点 但查询仍返回 1 个找到的行 请帮忙 我做错了什么 为什么它会找到多边
  • 有没有一种简单的方法来获取 .NET 为参数化查询生成的“sp_executesql”查询?

    背景 如果我有以下程序 public class Program public static void Main using var connection new SqlConnection Server local Database Te
  • MySQL max_allowed_pa​​cket 参数有什么问题?

    我需要增加 max allowed pa cket 参数 以适应一些理论上非常大的项目 如果我将此参数设置为 10M 那么与设置为 1M 或 4M 相比 我要支付什么价格 如果有的话 感谢您的任何意见 托马斯 我找到了这个解释 http w
  • SQL Server 为什么索引不与 OR 一起使用

    我一直在研究索引并试图了解它们是如何工作的以及如何使用它们来提高性能 但我错过了一些东西 我有下表 Person Id Name Email Phone 1 John E1 P1 2 Max E2 P2 我正在尝试找到对列进行索引的最佳方法
  • 如何使用默认约束为mysql中的列创建随机数?

    DEFAULT 约束在接受字符串或当前日期值方面没有问题 我需要的是一个约束 每次创建实体时都会创建一个随机的 4 位数字 我尝试了以下代码 但它返回语法错误 ALTER TABLE client number ADD 代码 INT 4 D
  • 自动递增和最后插入 ID

    我在用着AUTO INCREMENT我想获取插入行的 ID 以便我可以使用更新另一个表ID作为两个表之间的公共字段 我明白LAST INSERT ID会排在最后ID 然而 我担心的是 数据库被许多用户同时访问 因此 可能有另一个进程访问该表
  • 关于mysql建表的几个问题

    CREATE TABLE favorite food person id SMALLINT UNSIGNED food VARCHAR 20 CONSTRAINT pk favorite food PRIMARY KEY person id
  • MySQL - 通过部分单词匹配和相关性评分进行高效搜索(全文)

    如何进行 MySQL 搜索 既匹配部分单词 又提供准确的相关性排序 SELECT name MATCH name AGAINST math IN BOOLEAN MODE AS relevance FROM subjects WHERE M

随机推荐

  • Flutter

    前言 Image 是 Flutter 用于显示图像的小组件 它可以加载网络 本地 文件或者内存中的图像 支持 JPEG PNG GIF 动画 GIF WebP 动画 WebP BMP 和 WBMP 格式 Flutter Image 本身也实
  • springboot如何集成redis哨兵集群?

    前言 redis主从集群和redis sentinel集群都配置完毕了 现在我们需要了解spring boot 如何连接上该集群 才能用上这两个集群带来的便利 本章内容 为什么需要关注这个问题 怎么配置 记住 本章是针对redis已经配置了
  • Spark的新方案UnifiedMemoryManager内存管理模型分析

    StaticMemoryManager继承与MemoryManager 它是静态的内存分配 是1 6版本以前的实现 就像是建筑商建造好了房子 用户来到直接住进去就好了 弊端 有的人多住了小房子 有的人少住了大房子 而UnifiedMemor
  • neo4j下载安装配置步骤

    目录 一 介绍 简介 Neo4j和JDK版本对应 二 下载 官网下载 直接获取 三 解压缩安装 四 配置环境变量 五 启动测试 一 介绍 简介 Neo4j是一款高性能的图数据库 专门用于存储和处理图形数据 它采用节点 关系和属性的图形结构
  • linux安装服务器步骤,Linux服务器的安装配置流程

    不积跬步无以至千里 贴士 因为是装在Ubuntu系统上 其中有几个常用的命令告诉大家 下面在操作中你也会见到如下等命令 sudo gedit 文件目录对某个文件进行编辑和vi命令差不多 因为好多系统文件是只读的 可通过此方式来进行编辑修改
  • k8s六

    参考资料 从Docker到Kubernetes进阶 阳明 这里写目录标题 一 StatefulSet的设计原理 二 有状态服务的拓扑状态 三 有状态服务的存储状态 四 使用StatefulSet控制器部署ES集群 1 创建无头服务 2 部署
  • 华为云云耀云服务器L实例评测|在Docker环境下部署Mysql数据库

    华为云云耀云服务器L实例评测 在Docker环境下部署Mysql数据库 一 前言 1 1 云耀云服务器L实例简介 1 2 Mysql数据库简介 二 本次实践介绍 2 1 本次实践简介 2 2 本次环境规划 三 购买云耀云服务器L实例 3 1
  • vagrant加virtualbox轻松搭建k8s集群脚本

    文章目录 环境准备 配置k8s节点 环境准备 windows 电脑上使用vagrant 加 virtualbox 搭建k8s 集群 不熟悉vagrant 与 virtualbox 的可以查看这篇文章 使用VirtualBox和Vagrant
  • 由ValueError: not enough values to unpack (expected 2, got 1)报错说开去

    一 背景 今日做了一个文本分类任务 在更换对应的语料库的时候 处理完的语料报了个如题的错误 究其原因 这里用到了一个split t 作为content和label的分割 也就是在语料库中使用 t作为语料库中句子和标签的分隔符 但是在我写下
  • 基于Pytorch框架的ResNet:MNIST数据集手写数字识别

    Debug经验总结 一 常规ResBlock的输出尺寸与输入尺寸相同 否则需要进行尺寸变换 二 在数据集较大时设置num work进行多线程处理 可以很大提高训练效率 三 较复杂的网络在搭建前可以先用草图计算每个输出位置的矩阵尺寸 减少De
  • C++ opencv 识别火焰 (代码)

    brief 火焰识别
  • Java中anyMatch()、allMatch()、noneMatch()用法详解

    说明 anyMatch 匹配到任何一个元素和指定的元素相等 返回 true allMatch 匹配到全部元素和指定的元素相等 返回 true noneMatch 与 allMatch 效果相反 验证 一 anyMatch 1 正常匹配 多元
  • 解决mac下每次git pull/push都需要输入密码的问题

    首先本身项目是走ssh克隆下来的 之前也配置过密钥 按理来说不应该出现这样的问题 在日常开发过程中突然需要我输入密码 小朋友你是否有很多问号 在经过多方面资料查找与解决方案尝试后终于找到了原因 背后的黑手是系统升级了 在升级为macOS c
  • Mysql-提示java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 7 to TIMESTAMP...

    在Mysql数据库中使用DATETIME类型来存储时间 使用JDBC中读取这个字段的时候 应该使用 ResultSet getTimestamp 这样会得到一个java sql Timestamp类型的数据 在这里既不能使用 ResultS
  • Shader学习笔记:BRDF简单概述

    这篇文章写于一年多以前的一次课程作业 这次作为一个 存货 给放出来 仅仅只是针对代码和一些要点进行简单叙述 如果想听完整的版本 请搜索毛星云大神的博客或者书籍 关于基本的物理渲染公式 网络上的博客和典籍已经多如牛毛了 这里只是自己在之前整理
  • 统计学习之方差分析

    零 案例说明 为了检验某小学六年级教学质量的差异 从该小学六年级的三个班级中分别选取一定数量的学生 分成三个组 三个样本 对他们期末考试的平均分进行统计分析 如果实验显示每个每组的均值相同 即三个班期末考试的成绩差异不大 则表明该小学六年级
  • chatgpt赋能python:Python题目搜索软件:提升你的编程水平

    Python题目搜索软件 提升你的编程水平 对于那些喜欢编程的人来说 学习Python是一个非常不错的选择 但是 学习Python的难度并不小 需要大量的时间和精力 一个好的学习方式是通过完成Python编程题目来加深对该编程语言的理解 但
  • firebug 调试ajax,Jquery使用Firefox FireBug插件调试Ajax步骤讲解

    首先 我们用一个示例来说明JQuery的Ajax调用过程 实现的一个功能是 点击确认支付按钮之后 实现余额支付的功能 1 首先在php页面将相关需要调用的函数绑定到按钮上 function pay btn bind click ABC ba
  • qq引流有哪些模式? QQ引流的几种方法

    现在做QQ营销的方法真的是太多了 花样百出 什么招式都有的 QQ作为我们常用的交流工具 用于营销也是无可厚非的事情 现在做互联网的 永远离不开两个话题 就是 流量 和 变现 缺少其中一个 你所做的所有事情就完全没有任何意义 1 QQ空间引流
  • Mysql 多表关联查询

    文章目录 1 Mysql中表之间的关系 1 1 多表关系 1 2 外键约束 2 多表联合查询 2 1 交叉连接查询 笛卡尔积 2 2 内连接查询 inner join 2 3 外连接查询 2 3 1 左连接 2 3 2 右连接 2 3 4