MySQL的复合查询

多表查询

MySQL中的多表查询是一个强大的功能,允许你在一个查询中组合来自多个表的数据。这通常通过JOIN语句实现,但也可以使用子查询或集合操作符(如UNION)。下面我将介绍几种常见的多表查询方式及其用途。

INNER JOIN(内连接)

INNER JOIN返回两个表中有匹配的记录。如果一行在一个表中有匹配,在另一个表中也有,则MySQL将这两行合并为一行并返回。

语法示例

SELECT employees.name, employees.department_id, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

这个查询会返回所有员工的名字和他们部门的名字,即使某些员工没有对应的部门信息也会显示出来,这时部门名字为NULL

RIGHT JOIN(右连接)

RIGHT JOINLEFT JOIN相似,但它返回从右表的所有记录以及左表中匹配的记录。如果右表的记录在左表中没有匹配,结果中这些记录对应的左表部分将包含空值。

语法示例

SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

这个查询将返回所有部门的名字和在该部门工作的员工的名字,如果某些部门没有员工,员工名字为NULL

CROSS JOIN(交叉连接)

CROSS JOIN生成的是两个表的笛卡尔积。每个左表的行与右表的每行相结合。

语法示例

SELECT employees.name, departments.name
FROM employees
CROSS JOIN departments;

这个查询会返回所有可能的员工与部门的组合,不管他们是否有实际的对应关系。

使用多个JOIN

可以在一个查询中使用多个JOIN操作来连接多个表。

语法示例

SELECT employees.name, departments.name, offices.location
FROM employees
JOIN departments ON employees.department_id = departments.department_id
JOIN offices ON departments.office_id = offices.office_id;

这个查询将连接三个表,显示员工名、他们的部门名和部门所在的办公室位置。

注意事项

  • 使用JOIN时务必确保ON子句中的连接条件正确,否则可能会导致结果不正确或效率低下。
  • 对于大表,合适的索引是提高JOIN性能的关键。
  • 每种JOIN类型根据查询需求选择使用,理解每种JOIN的数据返回特性非常重要。

子查询

在MySQL中,子查询是指嵌套在另一个查询中的查询。子查询可以用于SELECT, INSERT, UPDATE, 或 DELETE语句中,提供了一种强大的方式来处理复杂的数据关系。根据其返回的数据行数和列数,子查询可以被分类为单行子查询、多行子查询和多列子查询。此外,子查询还可以在FROM子句中使用。下面是对这些类型的详细解释和例子:

单行子查询

单行子查询返回单个行的单个列。它常用于条件表达式中,与比较运算符一起使用,如 =, >, <, >=, <=

示例

SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

这个查询会找出所有薪水高于公司平均薪水的员工。

多行子查询

多行子查询返回一列但是多行结果。它常与IN, ANY, ALL, EXISTS等运算符一起使用。

示例

SELECT name, department_id
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'New York');

这个查询会返回所有在纽约部门工作的员工的名字和部门ID。

多列子查询

多列子查询返回多个列的一行或多行。这种类型的子查询通常在比较涉及多个列的情况下使用。

示例

SELECT employee_id, name
FROM employees
WHERE (department_id, salary) IN (SELECT department_id, MAX(salary) FROM employees GROUP BY department_id);

这个查询返回每个部门薪水最高的员工的ID和名字。

FROM子查询(子查询作为派生表)

FROM子句中使用的子查询被称为派生表。这允许你在选择从子查询结果进行操作。

示例

SELECT AVG(salary)
FROM (SELECT department_id, salary FROM employees WHERE department_id > 100) AS dept_salaries;

EXISTS子查询

EXISTS是一个布尔运算符,用来测试子查询是否返回任何行。如果子查询返回至少一行,则EXISTS子查询的结果为真。

示例

SELECT name
FROM departments d
WHERE EXISTS (SELECT * FROM employees e WHERE e.department_id = d.department_id);

合并查询

在MySQL中,合并查询通常是指使用UNIONUNION ALL来组合两个或多个SELECT语句的结果集为一个单一的结果集。这种方法非常有用于从多个表中检索类似的数据,特别是当这些表具有相似的数据结构时。

使用UNIONUNION ALL

  • UNIONUNION操作符用于合并多个SELECT语句的结果集,同时自动去除重复行。所有的SELECT语句需要有相同数量的列,并且对应列的数据类型也需要兼容。

  • UNION ALL:与UNION类似,UNION ALL也是合并多个SELECT语句的结果集,但它不会去除结果中的重复行,因此通常比UNION执行得更快。

示例

假设有两个表格:employeescontractors,这两个表格都包含关于工作人员的信息,但存储在不同的表中。

employees 表:

  • employee_id
  • name
  • department

contractors 表:

  • contractor_id
  • name
  • working_area

你想要一个包含所有员工和承包商名单的列表。

使用UNION
SELECT name, department AS work_place
FROM employees
UNION
SELECT name, working_area AS work_place
FROM contractors;

这个查询将从两个表中获取名字和工作区域,并通过UNION合并结果,同时去除任何可能的重复记录。

使用UNION ALL
SELECT name, department AS work_place
FROM employees
UNION ALL
SELECT name, working_area AS work_place
FROM contractors;

这个查询与上面的查询类似,但使用UNION ALL确保包括所有的记录,即使它们是重复的。

使用场景

  • 数据整合:当你需要从不同的表中获取类似的数据并进行整合显示时。
  • 报表生成:当你需要为报表生成一个综合视图,这个视图可能需要聚合多个表中的数据。
  • 数据比较:使用UNION来比较或找出两个表中不同的记录。

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

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

相关文章

学习java第六十八天

在AOP术语中&#xff0c;切面的工作被称为通知。通知实际上是程序运行时要通过Spring AOP框架来触发的代码段。 Spring切面可以应用5种类型的通知&#xff1a; 前置通知&#xff08;Before&#xff09;&#xff1a;在目标方法被调用之前调用通知功能&#xff1b; 后置通知&a…

计算机视觉——基于改进UNet图像增强算法实现

1. 引言 在低光照条件下进行成像非常具有挑战性&#xff0c;因为光子计数低且存在噪声。高ISO可以用来增加亮度&#xff0c;但它也会放大噪声。后处理&#xff0c;如缩放或直方图拉伸可以应用&#xff0c;但这并不能解决由于光子计数低导致的低信噪比&#xff08;SNR&#xff…

Oracle如何实现rsa加密和例子

在Oracle数据库中实现RSA加密通常需要使用Java编写的存储过程&#xff0c;因为Oracle自身并不直接支持RSA加密的原生函数。下面是一个基本的例子&#xff0c;说明如何在Oracle中使用Java存储过程来实现RSA加密。 首先&#xff0c;你需要一个Java类&#xff08;比如我们称之为R…

【Spring】@ServerEndpoint 与 Spring 是如何集成的

文章目录 前言表象理解后记更多文章 前言 最近工作需要用到 Websocket 协议。好奇来自 Jdk 包的 ServerEndpoint 是如何与 Spring Boot 集成的&#xff0c;特此记录一下结论。 表象 如果要暴露形如 ws://${ip}:${port}/ws 的服务地址&#xff0c;用于websocket 通信&#xf…

STC8增强型单片机开发——串口调试UART

一、什么是串口 串口是一种在数据通讯中广泛使用的通讯接口&#xff0c;通常我们叫做UART (通用异步收发传输器Universal Asynchronous Receiver/Transmitter)&#xff0c;其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中&#xff0c;串口常用于与外部设备…

关于Speech processing Universal PERformance Benchmark (SUPERB)基准测试及衍生版本

Speech processing Universal PERformance Benchmark &#xff08;SUPERB&#xff09;是由台湾大学、麻省理工大学&#xff0c;卡耐基梅隆大学和 Meta 公司联合提出的评测数据集&#xff0c;其中包含了13项语音理解任务&#xff0c;旨在全面评估模型在语音处理领域的表现。这些…

基于深度学习神经网络的AI图像PSD去雾系统源码

第一步&#xff1a;PSD介绍 以往的研究主要集中在具有合成模糊图像的训练模型上&#xff0c;当模型用于真实世界的模糊图像时&#xff0c;会导致性能下降。 为了解决上述问题&#xff0c;提高去雾的泛化性能&#xff0c;作者提出了一种Principled Synthetic-to-real Dehazing (…

Windows 跨服务器进行 MYSQL备份脚本

Windows 服务器进行 MYSQL备份的脚本&#xff0c;使用该脚本前&#xff0c;请先测试一下 1、新建一个文本文档 2、将下面代码放入文本文档中&#xff0c;保存退出 echo off :: 命令窗口名 title mysql-bak:: 参数定义 set "Y%date:~,4%" set "m%date:~5,2%&qu…

【计算机网络篇】数据链路层(9)使用集线器的共享式以太网

文章目录 &#x1f6f8;使用同轴电缆的共享总线以太网 &#x1f386;使用集线器的共享式以太网&#x1f95a;集线器的特点 &#x1f354;10BASE-T星型以太网 &#x1f6f8;使用同轴电缆的共享总线以太网 若总线上的某个机械连接点接触不良或断开&#xff0c;则整个网络通信就不…

Nginx part3 创建一个https的网站

目录 HTTPS 公钥和密钥 加密解密方式&#xff1a; https搭建步骤 强调一下 1、准备环境 2、配置文件 3、制作证书 4、进行设置 HTTPS 啥是https&#xff0c;根据百度&#xff1a;HTTPS &#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure&#xff09;&a…

HCIE学习笔记----OSPF详解

OSPF邻居建立的条件 OSPF建立邻居“41”条件总结 4个一致 一个不一致 1.保证接口的前缀 网络信息一致 2.保证ospf区域号和区域类型一致 3.hello包间隔时间和死亡时间一致 4.认证类型和认证认证信息一致 5.路由器的ID不一致 保证唯一性 一-----OSPF 邻接关系建立过程与状…

耦合协调分析模型

耦合协调分析模型&#xff08;Coupling Coordination Analysis Model&#xff09;是一种用于评估两个或多个系统之间相互作用和协调性的数学模型。广泛应用于多个领域&#xff0c;包括但不限于社会科学、经济学、环境科学和工程学。耦合协调分析模型的核心在于量化系统间的耦合…

Android UI:动画:帧动画

文章目录 定义两种创建方式 代码&#xff1a;直接创建对象XML&#xff1a;加载动画文件&#xff0c;创建对象API 类 动画类操作 绑定ImageView启动动画总结 定义 按顺序展示不同的图片 两种创建方式 代码&#xff1a;直接创建对象 XML&#xff1a;加载动画文件&#xff0c;…

本地项目上传到gitee

1. 新建仓库&#xff0c;不要勾选 2. git init git add . git commit -m "test" git remote add origin 【url】 git push --set-upstream origin master

MySQL·索引

目录 索引的意义 索引的理解 为何IO交互要是 Page 理解Page 其他数据结构为何不行&#xff1f; 聚簇索引 VS 非聚簇索引 索引操作 主键索引操作 唯一键索引操作 普通索引的创建 总结 全文索引 索引的意义 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美…

css backdrop-filter 实现背景滤镜

官方给出的定义是&#xff1a;backdrop-filter属性允许您将图形效果&#xff08;如模糊或颜色偏移&#xff09;应用于元素后面的区域。因为它适用于元素后面的所有内容&#xff0c;所以要查看元素或其背景的效果&#xff0c;需要透明或部分透明。 大致分为以下10种&#xff1a…

云计算十三课

centos安装 点击左上角文件 点击新建虚拟机 点击下一步 点击稍后安装操作系统&#xff0c;下一步 选择Linux&#xff08;l&#xff09;下一步 设置虚拟机名称 点击浏览选择安装位置 新建文件夹设置名称不能为中文&#xff0c;点击确定 点击下一步 设置磁盘大小点击下一步…

windows 系统远程连接 redis 服务

一、引言 Redis是一款开源的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。在开发过程中&#xff0c;我们可能需要从Windows系统远程连接到Redis服务器以进行各种操作。本文将详细介绍如何在Windows系统上远程连接Redis服务。 二、前…

【linux软件基础知识】完全公平调度(2)

每个进程的 CPU 时间比例 在两个可运行进程具有不同的好值的情况下&#xff0c;完全公平调度程序 (CFS) 根据权重为每个进程分配不同比例的处理器时间。 进程的权重由其nice值决定。 假设一个进程具有默认的 Nice 值&#xff08;零&#xff09;&#xff0c;而另一个进程的 Ni…

rust开发web服务器框架,github排名对比

Rocket Star最多的框架 github仓库地址&#xff1a;GitHub - rwf2/Rocket: A web framework for Rust. Rocket 是一个针对 Rust 的异步 Web 框架&#xff0c;重点关注可用性、安全性、可扩展性和速度。 Axum 异步运行时 githuh仓库地址&#xff1a;GitHub - tokio-rs/axum: …