MySQL多表查询 (超详细)

2023-11-12

一、多表关系

        项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

  • 一对多(多对一)
  • 多对多
  • 一对一

1.1   一对多

案例:部门与员工
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的一方建立外键,指向一的一方的主键(开发中一般取消外键的设定,即在多的一方建立字段指向一的一方的主键即可)

1.2  多对多

案例:学生与课程
关系:一个学生可以选多门课程,一门课程也可以供多个学生选修
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键(开发中一般取消外键的设定,即在中间表建立两个字段指向两方的主键即可)

1.3  一对一

案例:用户与用户详情
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)(开发中一般取消外键的设定,即在任意一方加入字段关联另外一方的主键即可)

二、多表查询-笛卡尔积

合并查询(笛卡尔积,会展示所有组合结果):
  select * from employee, dept;

笛卡尔积:两个集合A集合和B集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)

消除无效笛卡尔积:
  select * from employee, dept where employee.dept_id = dept.id;

三、多表查询-内连接

内连接查询的是两张表交集的部分

隐式内连接:
  SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;

显式内连接:
  SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ...;

例子:

  1. -- 查询员工姓名,及关联的部门的名称
  2. -- 隐式
  3. select e.name, d.name from employee as e, dept as d where e.dept = d.id;
  4. -- 显式
  5. select e.name, d.name from employee as e inner join dept as d on e.dept = d.id;

四、多表查询-外连接(左外连接、右外连接)

左外连接:
     查询左表所有数据,以及两张表交集部分数据
  SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...;
     相当于查询表1的所有数据,包含表1和表2交集部分数据

右外连接:
     查询右表所有数据,以及两张表交集部分数据
  SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...;

例子:

  1. -- 左
  2. select e.*, d.name from employee as e left join dept as d on e.dept = d.id;
  3. select d.name, e.* from dept d left join emp e on e.dept = d.id; -- 这条语句与下面的语句效果一样
  4. -- 右
  5. select d.name, e.* from employee as e right join dept as d on e.dept = d.id;

五、多表查询-自连接

当前表与自身的连接查询,自连接必须使用表别名

语法:
  SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;

     自连接查询,可以是内连接查询,也可以是外连接查询

例子:

  1. -- 查询员工及其所属领导的名字
  2. select a.name, b.name from employee a, employee b where a.manager = b.id;
  3. -- 没有领导的也查询出来
  4. select a.name, b.name from employee a left join employee b on a.manager = b.id;

六、多表查询-联合查询

把多次查询的结果合并,形成一个新的查询集

语法:

    SELECT 字段列表 FROM 表A ...

    UNION [ALL]

    SELECT 字段列表 FROM 表B ...

注意事项
  • UNION ALL 会有重复结果,UNION 不会
  • 联合查询比使用or效率高,不会使索引失效
  • 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。

以下是一个示例,展示如何使用联合查询来获取两个表的数据:

SELECT column1, column2 FROM table1 UNION SELECT column3, column4 FROM table2;

上述示例中,SELECT column1, column2 FROM table1SELECT column3, column4 FROM table2是两个独立的SELECT语句,它们分别从table1table2两个表中获取特定的列数据。通过使用UNION操作符将它们合并,就可以得到一个包含两个表数据的结果集。(一般来说,联合查询的table1和table2为同一张表,如查询员工表薪资大于5000的员工或年龄大于40的员工,这时候就可以使用联合查询)

需要注意的是,使用UNION进行联合查询时,要求两个SELECT语句的列数、列名和数据类型必须相匹配。如果需要保留重复的行,可以使用UNION ALL而非UNION

七、多表查询-子查询(嵌套查询)

SQL语句中嵌套SELECT语句,称谓嵌套查询,又称子查询。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);
子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个

根据子查询结果可以分为:

  • 标量子查询(子查询结果为单个值)
  • 列子查询(子查询结果为一列)
  • 行子查询(子查询结果为一行)
  • 表子查询(子查询结果为多行多列)

根据子查询位置可分为:

  • WHERE 之后
  • FROM 之后
  • SELECT 之后

7.1  标量子查询

 子查询返回的结果是单个值(数字、字符串、日期等)。
常用操作符:- < > > >= < <=

例子:

  1. -- 查询销售部所有员工
  2. select id from dept where name = '销售部';
  3. -- 根据销售部部门ID,查询员工信息
  4. select * from employee where dept = 4;
  5. -- 合并(子查询)
  6. select * from employee where dept = (select id from dept where name = '销售部');
  7. -- 查询xxx入职之后的员工信息
  8. select * from employee where entrydate > (select entrydate from employee where name = 'xxx');

7.2  列子查询

 返回的结果是一列(可以是多行)。

常用操作符:

操作符 描述
IN 在指定的集合范围内,多选一
NOT IN 不在指定的集合范围内
ANY 子查询返回列表中,有任意一个满足即可
SOME 与ANY等同,使用SOME的地方都可以使用ANY
ALL 子查询返回列表的所有值都必须满足

例子: 

  1. -- 查询销售部和市场部的所有员工信息
  2. select * from employee where dept in (select id from dept where name = '销售部' or name = '市场部');
  3. -- 查询比财务部所有人工资都高的员工信息
  4. select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部'));
  5. -- 查询比研发部任意一人工资高的员工信息
  6. select * from employee where salary > any (select salary from employee where dept = (select id from dept where name = '研发部'));

7.3  行子查询

返回的结果是一行(可以是多列)。
常用操作符:=, <, >, IN, NOT IN

例子:

  1. -- 查询与xxx的薪资及直属领导相同的员工信息
  2. select * from employee where (salary, manager) = (12500, 1);
  3. select * from employee where (salary, manager) = (select salary, manager from employee where name = 'xxx');

7.4  表子查询

返回的结果是多行多列
常用操作符:IN

例子:

  1. -- 查询与xxx1,xxx2的职位和薪资相同的员工
  2. select * from employee where (job, salary) in (select job, salary from employee where name = 'xxx1' or name = 'xxx2');
  3. -- 查询入职日期是2006-01-01之后的员工,及其部门信息
  4. select e.*, d.* from (select * from employee where entrydate > '2006-01-01') as e left join dept as d on e.dept = d.id;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL多表查询 (超详细) 的相关文章

  • MySQL创建表中的日期格式

    我必须使用 MySql 创建一个表 它可以按以下格式存储日期 我尝试过如下 CREATE TABLE birth date DATE 但它不起作用 因为日期格式是 YYYY MM DD 我该怎么办 谢谢 MySQL 或几乎任何其他数据库 中
  • 如何设置 Hibernate 读取/写入不同的数据源?

    使用 Spring 和 Hibernate 我想写入一个 MySQL 主数据库 并从基于云的 Java Web 应用程序中的另一个复制从属数据库中读取数据 我找不到对应用程序代码透明的解决方案 我真的不想更改我的 DAO 来管理不同的 Se
  • 比较两个表并找到匹配的列

    我有两个表 table1 和 table2 我需要编写一个选择查询 它将列出两个表中存在的列 mysql 我需要为不同的桌子做 一次2个 这可能吗 我尝试使用INFORMATION SCHEMA COLUMNS但我无法做对 SELECT a
  • MYSQL 中当前行上日期之前(并包括该日期)的所有行的总和

    重要的是要知道在查询期间日期是未知的 因此我不能只硬编码 WHERE 子句 这是我的桌子 Date ID Customer Order Count 20150101 Jones 6 20150102 Jones 4 20150103 Jon
  • 使用 mariaDB 将 sql 转储文件安装到 docker 容器

    我刚刚学习 docker 的基础知识 但一直停留在从本地系统导入 SQl 文件上 我使用的是 Windows 10 并允许我的 docker 容器访问我的共享驱动器 我有一个位于 D 上的 SQL 文件 我想导入到从 docker hub
  • 关于mysql建表的几个问题

    CREATE TABLE favorite food person id SMALLINT UNSIGNED food VARCHAR 20 CONSTRAINT pk favorite food PRIMARY KEY person id
  • 如何在函数内部使用 require_once [重复]

    这个问题在这里已经有答案了 你好 我想在函数内使用 require once 但不起作用 实际上我的页面中有三个函数我该怎么做 它在外面工作但不在函数内部 请问有谁吗 这是我的代码
  • java.sql.SQLException:已经关闭

    我们有一个在 Tomcat 上运行的 Web 应用程序 带有 MySQL 后端 有一段时间一切都很好 然后突然我们开始遇到这个异常java sql SQLException Already closed 整个堆栈跟踪是 DEBUG org
  • 开发 WordPress 管理链接重定向到实时站点

    我正在尝试对我拥有的 WordPress 网站进行新的更改 所以我复制了所有文件并导出到新的开发子域 为子域创建新数据库并从实时站点导入数据库 直播站点 http mysite com http mysite com 开发站点 http d
  • PDO 多查询“SQLSTATE[HY000]:一般错误”

    我仍在学习 PDO 所以我可能会错过一些东西 但基本上我正在尝试将一行插入表中 然后选择生成的 id 我不确定它是否喜欢一个 pdo 语句中的两个查询 这是我用来执行 SQL 的代码 public function ExecuteQuery
  • MySQL 启动错误 - 根元素丢失

    我在 Windows Server 2003 R2 上安装 MySQL 大约两个月了 启动时 我们会看到一个错误 显示 高严重性错误 根元素丢失 然后是另一个高严重性错误 显示 在调用 WriteToLog 方法之前必须定义日志文件路径 任
  • 如何将UTF-8编码的汉字从MySql正确导出到SQL

    过去三天我们正在与严重的问题作斗争 我们从PhpmyAdmin导出MySql数据库文件 数据库条目中写入的数据是带有UTF 8字符集的中文 导出后将其转换为拉丁字符集 现在我们正在将此数据库SQl文件导入到其他主机 我们在UTF 8和排序规
  • MySql 5.7 函数 UUID() 默认排序规则 - 非法混合排序规则

    Problem MySQL uuid 默认排序规则与配置连接排序规则不进行比较 我有一个使用字符集创建的数据库 表 字段 utf 8和排序规则utf8 polish ci my cnf 如下 init connect SET NAMES u
  • 如何在同一列中选择多个值?

    我正在尝试在单个列中选择多个值 基本上我希望查询选择列下的所有内容family有价值观Software 1Y XI 1Y and P1 1Y 我正在运行这个查询 SELECT salesorder masterproduct family
  • PHP 和 MySql 检查表是否为空

    我有点菜鸟 而且我很难过 我需要一些代码来搜索数据库表以查找与 id 变量匹配的行 我需要抓取该表 描述 中的一个字段 如果它为空 我需要显示一条消息 如果不是另一条消息 这是我的代码 我知道我需要添加 mysqli 转义字符串 只需从内存
  • 删除 ibdata1 后 MySQL 表消失了

    几天前 经过一番谷歌搜索后 我发现了这篇文章 我无法再让 mysql 运行了 xampp XAMPP MySQL 意外关闭 https stackoverflow com questions 18022809 xampp mysql shu
  • mysql 准备好的语句错误:MySQLSyntaxErrorException

    我使用准备好的语句编写了选择语句 每次尝试运行都会出现此错误 我如何克服这个错误 我的jdbc连接器是mysql connector java 5 1 13 bin jar 我的代码 public Main add ad to getAdD
  • 如何在 laravel 中查询 json 列?

    我用的是 Laravel 5 6 我有一块田地 字段的数据类型为json 字段 desc 字段 的值如下所示 code 1 club CHE country ENGLAND code 2 club BAY country GERMANY c
  • 如何查找列表/集合是否包含在另一个列表中

    我有一个产品 ID 列表 我想找出哪些订单包含所有这些产品 订单表的结构如下 order id product id 1 222 1 555 2 333 显然我可以通过 PHP 中的一些循环来做到这一点 但我想知道是否有一种优雅的方法可以纯
  • Elastic Beanstalk 上的 Django + MySQL - 查询 MySQL 时出错

    当我在 Elastic beanstalk 上托管的 Django 应用程序上查询 MySQL 时 出现错误 错误说 admin login 处出现操作错误 1045 用户 adminDB 172 30 23 5 的访问被拒绝 使用密码 Y

随机推荐

  • Spring Boot系列 - 3. SpringBoot项目学习汇总

    原文地址 https blog csdn net hemin1003 article details 53217489 网络上很多关于SpringBoot的资料和代码 但有一些根本运行不了 有些博主的代码还故意藏着掖着 一定要加他的微信才能
  • php 文件上传抓包,详解文件上传漏洞

    介绍 在现代互联网网站中 上传文件基本上是一种常见的功能 允许用户上传一些图片 视频以及其他类型的文件 如果网站出现文件上传漏洞 那么恶意用户就可以将可执行脚本程序上传到web服务器中 获得网站权限 进一步 gongji web服务器 当上
  • skywalking agent监控java服务

    一 前言 skywalking agent可以监控的服务类型有多种 python go java nodejs服务等都可以监控 现在通过java服务来演示skywalking agent的使用 并且是使用容器的方式实现 二 部署skywal
  • 拓闻

    大数据时代的来临为众多企业带来了更多的全新的发展机遇 而搜索引擎已经成为大数据领域的一个核心应用 其重要性不言而喻 很多公司在大数据离线统计分析方面已经具备了一定的能力 但是 很多应用场景往往要求在数秒内完成对几亿 几十亿甚至几百上千亿的数
  • 史上最全 Appium 自动化测试从基础到框架实战精华学习笔记(一)

    1080 402 31 8 KB 对测试人来说 Appium 是非常重要的一个开源跨平台自动化测试工具 它允许测试人员在不同的平台 iOS Android 等 使用同一套 API 来写自动化测试脚本 这样可大幅提升代码复用率和工作效率 本文
  • UI自动化之python+pytest+allure+selenium

    一 基础搭建 1 下载pycharm 配置环境变量 2 安装对应版本的webdriver 将webdriver放在项目根目录 3 pip install pytest 4 pip install allure 二 框架设计 三 目录详解 1
  • docker安装redis教程

    通过Docker方式安装redis教程 1 拉取镜像 方式一 指定版本 拉取redis6 2 5版本 docker pull redis 6 2 5 方式二 拉取redis最新的版本 docker pull redis 查看docker的镜
  • Reactor和Proactor的区别

    一 实现方式 Reactor 采用同步IO 用户层执行IO操作时 处于挂起状态 等待内核层完成 图示如下 Proactor 采用异步IO 用户层执行IO操作时 可以一边等待内核操作IO 一边自己去处理其他事情 等内核操作IO结束后 用户层被
  • MySQL中的BLOB类型

    一 概念 BLOB binary large object 二进制大对象 是一个可以存储二进制文件的容器 在计算机中 BLOB常常是数据库中用来存储二进制文件的字段类型 BLOB是一个大文件 典型的BLOB是一张图片或一个声音文件 由于它们
  • 传递点的大小

    仍然用attribute 因为是顶点着色器 11
  • 博客要写得好,Emoji要用对!

    EMOJI 01 表情与心情 02 动作与身份 03 动物与植物 04 食品与饮料 05 旅行和地点 06 娱乐与活动 07 物品与工具 08 符号与标识 01 表情与心情 02 动作与身份
  • 华为OD机试 - 最差产品奖( Python)

    题目描述 A公司准备对他下面的N个产品评选最差奖 评选的方式是首先对每个产品进行评分 然后根据评分区间计算相邻几个产品中最差的产品 评选的标准是依次找到从当前产品开始前M个产品中最差的产品 请给出最差产品的评分序列 输入描述 第一行 数字M
  • 手把手教你,把3D模型从stl格式导出iges格式的方法

    工具 Hypermesh 注意 下载和安装视频在我的上传资源里面 记得安装路径不能有中文 自己的操作账户名也不能是中文的 方法 第一 按照如下步骤 导入stl模型 第二步 点击Shaded 按钮 显示实体网格 第三步 点击Geom下的sur
  • 自己搭的12V 电机驱动电路设计

    1 单MOS管驱动电路 采用P75NF75为主角构成 2 双MOS管电机驱动电路设计 采用D4184管组合 3 半桥驱动电路设计 采用BTS7960芯片 两路半桥构成全桥驱动电路
  • s3c6410 android 移植Step by step

    Report 2009 03 05 转载请说明出处 不得用于商业用途 Linux forum id hongjiujing Porting android on s3c6410 Environment ubuntu 8 10 Board X
  • KeilMDK编译错误Error: L6218E: Undefined symbol __aeabi_assert (referred from xxx.o).

    问题描述 AirPressure AirPressure axf Error L6218E Undefined symbol aeabi assert referred from mbrtu o 问题原因 Error L6218E Unde
  • 爬虫乱码UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa0’ in position

    在Python中将网址写入文件的时候 会碰到 UnicodeEncodeError gbk codec can t encode character xa0 in position 0这个问题 其实就是在windows中 新建的文本文件的默
  • Connecting the Dots: 基于图神经网络的多元时间序列预测——学习合集

    关于源代码和数据集的理解可以参考以下几篇文章 1 github源代码 数据集 安装环境要求 2 原论文百度云链接 提取码 1234 3 帮助理解论文的文章1 4 帮助理解论文的文章2 5 帮助理解论文的文章3 6 交通流量预测数据集解读 7
  • UnityVR--小程序8--激光门伤害

    本文使用Line Renderer组件 在门框中画出一道激光线 被线照射到的主角将会扣分 另外 激光仅检测ragCast层 所以主角必须添加到ragCast层中 与坦克对战小程序 UnityVR 小程序7 坦克对战 的设置相同 1 在场景中
  • MySQL多表查询 (超详细)

    一 多表关系 项目开发中 在进行数据库表结构设计时 会根据业务需求及业务模块之间的关系 分析并设计表结构 由于业务之间相互关联 所以各个表结构之间也存在着各种联系 基本上分为三种 一对多 多对一 多对多 一对一 1 1 一对多 案例 部门与