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

【MySQL】复合查询和内外连接

文章目录

  • MySQL复合查询和内外连接
  • 1. 复合查询
    • 1.1 多表查询
    • 1.2 自连接
    • 1.3 子查询
      • 单行子查询
      • 多行子查询
      • 多列子查询
      • from中使用子查询
      • 合并查询
  • 2. 内外连接
      • 1. INNER JOIN
      • 2. LEFT JOIN
      • 3. RIGHT JOIN
      • 4. FULL JOIN
      • 5. CROSS JOIN


MySQL复合查询和内外连接

1. 复合查询

1.1 多表查询

select * from `tb_1`, `tb_2`where dept.deptno = emp.deptno;

不加过滤条件,得到的结果被称为笛卡尔积。本质是取主表的每一条记录拼接上从表的每一条记录。

多表查询中一定会包含where条件,将主键和外键对应,可以将无意义的记录抛弃。

1.2 自连接

同一张表自己和自己拼接的叫做自连接。给两张相同的表起别名,就可以放到一起。

select * from emp wkr, emp ldr;where wkr.mgr = ldr.empno;

自连接的话,需要根据实际需求筛去不满足条件的数据。

1.3 子查询

子查询也称嵌套查询,也就是将select的结果作为另一个select的条件。

单行子查询

返回一行记录的查询称为单行子查询。

select * from emp where deptno=(select deptno from emp where ename='SMITH');

多行子查询

返回多行记录的查询称为多行子查询。关键字有:inallany

  • in 表示是否存在于集合中,存在即满足条件。
  • all 表示整个集合的每一个结果
  • any 表示集合中的任意一个结果
# 显示和10号部门具有的工作岗位相同的员工
select * from emp where job in (select distinct job from emp where deptno=10);
# 显示工资比10号部门所有人工资都高的员工
select * from emp where sal > all (select distinct sal from emp where deptno=10);
# 显示工资比10号部门任意员工工资高的员工
select * from emp where sal > any (select distinct sal from emp where deptno=10);

不管是单行还是多行子查询,都叫做单列子查询,返回的都是单列的一个字段的数据。

多列子查询

# 查询和SMITH的部门和岗位完全相同的所有雇员
select * from emp where (deptno, job)=(select deptno, job from emp where ename='SMITH');

from中使用子查询

from跟是的表名,既然我们查询出来的记录都可以看作表结构。这里就是一个数据查询的技巧,把子查询当作临时表使用。

# 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
select ename, emp.deptno, sal, myavgfrom emp, (select deptno, avg(sal) as myavg from emp group by deptno) as avg_tbwhere emp.deptno=avg_tb.deptno and sal>myavg;# 显示每个部门的部门名,编号,地点和人员数量
select dname, dept.deptno, loc, cntfrom emp, dept, (select deptno, count(*) cnt from emp group by deptno) as cnt_tbwhere cnt_tb.deptno=emp.deptno and cnt_tb.deptno=dept.deptno;

合并查询

合并查询是就是合并多个 select 的查询结果,可使用集合操作符 unionunion all

关键字解释
union取并集,将多个 select 结果合并到一起,自动去掉重复行
union all取并集,将多个 select 结果合并到一起,但不去重
select * from emp where sal > 2500 union     select * from emp where job='MANAGER';
select * from emp where sal > 2500 union all select * from emp where job='MANAGER';

OJ连接

  • https://www.nowcoder.com/practice/23142e7a23e4480781a3b978b5e0f33a
  • https://www.nowcoder.com/practice/355036f7f0c8429a85281f7ac05b457a
  • https://www.nowcoder.com/practice/32c53d06443346f4a2f2ca733c19660c
  • https://www.nowcoder.com/practice/e50d92b8673a440ebdf3a517b5b37d62

 

2. 内外连接

通过不同类型的表连接,可以将多个表中的数据有效地组合在一起,以满足复杂的查询需求。将详细介绍MySQL中常见的表连接方式,分别是 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN 和 CROSS JOIN,并通过具体的表格数据展示它们的用法和特点。
下表总结了各种表连接方式的主要特点:

连接方式结果匹配条件不满足时备注
INNER JOIN返回符合连接条件的行不返回结果最常用的连接方式
LEFT JOIN返回左表中所有行,以及右表中符合条件的行右表列为NULL适用于需要左表所有行的情况
RIGHT JOIN返回右表中所有行,以及左表中符合条件的行左表列为NULL适用于需要右表所有行的情况
FULL JOIN返回左右表中所有行,不管是否有匹配的行NULL值适用于需要两个表所有行的情况
CROSS JOIN返回两个表的笛卡尔积适用于需要生成所有组合的情况

我们将使用以下两个示例表格进行表连接操作:

表格:employees

employee_idemployee_namedepartment_id
1Alice1
2Bob2
3CharlieNULL
4David1

表格:departments

department_iddepartment_name
1HR
2IT
3Finance

1. INNER JOIN

INNER JOIN 是最常见的表连接方式,它返回两个表中符合连接条件的行。

**示例查询及结果:**查询员工及其所在部门(基于employees和departments表格)。

SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
employee_idemployee_namedepartment_name
1AliceHR
2BobIT
4DavidHR

2. LEFT JOIN

LEFT JOIN 返回左表中的所有行,以及右表中与左表中行匹配的行。如果右表中没有匹配的行,则会返回 NULL 值。

**示例查询及结果:**查询所有员工及其所在部门(基于employees和departments表格)。

SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
employee_idemployee_namedepartment_name
1AliceHR
2BobIT
3CharlieNULL
4DavidHR

3. RIGHT JOIN

RIGHT JOIN 返回右表中的所有行,以及左表中与右表中行匹配的行。如果左表中没有匹配的行,则会返回 NULL 值。

**示例查询及结果:**查询所有部门及其员工(基于employees和departments表格)。

SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;
employee_idemployee_namedepartment_name
1AliceHR
2BobIT
4DavidHR
NULLNULLFinance

4. FULL JOIN

FULL JOIN 返回左右两个表中的所有行,如果某个表中没有匹配的行,则返回 NULL 值。

**示例查询及结果:**查询所有员工及其所在部门,包括没有部门的员工和没有员工的部门(基于employees和departments表格)。

SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id;
employee_idemployee_namedepartment_name
1AliceHR
2BobIT
3CharlieNULL
4DavidHR
NULLNULLFinance

5. CROSS JOIN

CROSS JOIN 返回两个表的笛卡尔积,即左表中的每一行与右表中的每一行组合在一起。

如果执行一个简单的 CROSS JOIN 操作,假设表 orders 和表 products,它们分别有以下数据:

表格:orders

order_idorder_name
1Order A
2Order B

表格:products

product_idproduct_name
101Product X
102Product Y
103Product Z

执行如下的 CROSS JOIN 查询:

SELECT o.order_id, p.product_id, p.product_name
FROM orders o
CROSS JOIN products p;

将会得到以下结果,这是两个表的笛卡尔积:

order_idproduct_idproduct_name
1101Product X
1102Product Y
1103Product Z
2101Product X
2102Product Y
2103Product Z

这个结果显示了 orders 表中每个订单与 products 表中每个产品的所有组合。笛卡尔积操作是一种非常基础但强大的数据组合方式,通常用于需要生成所有可能组合的场景。

OJ练习

  • https://leetcode.com/problems/rank-scores/
  • https://leetcode.com/problems/exchange-seats/description/

相关文章:

【MySQL】复合查询和内外连接

文章目录 MySQL复合查询和内外连接1. 复合查询1.1 多表查询1.2 自连接1.3 子查询单行子查询多行子查询多列子查询from中使用子查询合并查询 2. 内外连接1. INNER JOIN2. LEFT JOIN3. RIGHT JOIN4. FULL JOIN5. CROSS JOIN MySQL复合查询和内外连接 1. 复合查询 1.1 多表查询 …...

【星海随笔】云解决方案学习日志篇(二) kafka、Zookeeper、Fielbeat

Elastic 中国社区官方博客 https://blog.csdn.net/ubuntutouch/category_9209092.html Kafka kafka的源代码是基于Scala语言编写的,运行在Java虚拟机(即:JVM)上。因此,在安装kafka之前需要先安装JDK Kafka 为什么依赖 Zookeepe…...

【测试专题】系统测试报告(原件Word)

软件测试报告在软件开发过程中起着至关重要的作用,主要有以下几个主要原因: 1、确保软件质量 2、提供决策支持 3、记录测试过程和结果 4、促进沟通和协作 5、符合标准和法规要求 6、改进测试流程和策略 7、降低风险 软件开发全套资料获取进主页或者本文末…...

C++中的模板方法模式

目录 模板方法模式(Template Method Pattern) 实际应用 数据处理流程 在线教育系统的课程模板 软件开发生命周期 总结 模板方法模式(Template Method Pattern) 模板方法模式是一种行为设计模式,它定义了一个操作…...

【数据结构】第十七弹---C语言实现选择排序

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、选择排序 1.1、基本思想 1.2、代码实现 1.3、代码测试 1.4、时空复杂度分析 总结 1、选择排序 1.1、基本思想 选择排序是一种简单直观的比…...

信号处理中的梯型权重操作(Tapering)

目录 1. 引言2. 一个Tapering操作的例子3. Tapering操作的简单实现延伸阅读1. 引言 Tapering 操作是对信号数据在水平和垂直方向上应用梯形权重,这个操作可以减弱数据边界效应,从而在进行傅里叶变换时减少伪影和边缘效应。本文将通过一个简单的例子来展示 Tapering 操作的具…...

深入解析分布式链路追踪:原理、技术及应用

目录 分布式链路追踪简介分布式链路追踪的基本概念 Span 和 Trace上下文传播采样策略 分布式链路追踪的工作原理常见的分布式链路追踪系统 ZipkinJaegerOpenTelemetry 分布式链路追踪的技术实现 数据收集数据传输数据存储数据展示 分布式链路追踪的应用场景 性能优化故障排除依…...

2024信息系统、信号处理与通信技术国际会议(ICISPCT2024)

2024信息系统、信号处理与通信技术国际会议(ICISPCT2024) 会议简介 2024国际信息系统、信号处理与通信技术大会(ICISPCT2024)将在青岛隆重开幕。本次会议旨在汇聚全球信息系统、信号处理和通信技术领域的专家学者,共同探索行业…...

用这个神级提示词插件,能让你的AI绘画工具Stable diffusion提示词直接写中文!

大家好,我是设计师阿威 最近,有同学在使用AI绘画工具 Stable Diffusion的时候和我说:老师,我英文不好,能不能直接让我写中文提示词啊?最好可以直接在SD的输入框就能直接写中文,不用切换网页或者…...

Android里的设计模式

一:设计模式分类 经典的23种设计模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称“Gang of Four”)在他们的书《设计模式:可复用面向对象软件的基础》中定义的。以下是这些设计模式的分类和简要介绍。 1.…...

token无感刷新

Token无感刷新通常指的是在用户不知情的情况下自动刷新认证Token,以保持用户的会话状态。这通常在使用JWT(JSON Web Tokens)作为认证方式时使用。以下是实现无感刷新的一种常见方法: 1. 前端请求拦截: 在发送请求前&a…...

Golang的协程调度器GMP

目录 GMP 含义 设计策略 全局队列 P的本地队列 GMP模型以及场景过程 场景一 场景2 场景三 场景四 场景五 场景六 GMP 含义 协程调度器,它包含了运行协程的资源,如果线程想运行协程,必须先获取P,P中还包含了可运行的G…...

C++ 后端,Vue前端

参考2篇博客 1-VUE、C前后端调用 2-Vue解决CORS header ‘Access-Control-Allow-Origin’ missing及同源、跨域问题 这里给出App.vue代码 <script setup lang"ts"> import HelloWorld from ./components/HelloWorld.vueimport axios from axios import { ref…...

使用Navicat Premium向mysql插入2000000条数据

DELIMITER // DROP PROCEDURE IF EXISTS sys_log; CREATE PROCEDURE sys_log() BEGIN DECLARE n int DEFAULT 1; WHILE(n<2000000) DO INSERT INTO sys_log VALUES (n, 超级系统管理员, 查询实时工况数据, /keyParameterMonitoring/getNewestUnitData, {\"role\"…...

docker命令记录

基本命令和参数 docker run: 运行一个新的容器实例。-itd: 组合参数&#xff0c;含义如下&#xff1a; -i: 以交互模式运行容器&#xff0c;保持标准输入打开。-t: 分配一个伪终端。-d: 后台运行容器&#xff0c;即使容器启动后依然返回控制台。 设备映射 --device/dev/dri…...

Java学习七

Java包 String对象 String案例 集合 ArrayList 集合...

麒麟Kylin | 操作系统的安装与管理

以下所使用的环境为&#xff1a;VMware Workstation 17 Pro、Kylin-Server-10-SP2-x86-Release-Build09-20210524 一、创建虚拟机 在VMware主机单击【创建新的虚拟机】 **在新建虚拟机向导中选择【自定义】&#xff0c;然后点击【下一步】 ** 保持默认选项&#xff0c;然后…...

数据结构预备知识(Java):包装类泛型

1、包装类 1.1 包装类 在Java中&#xff0c;每一个基本数据类型都有一个对应的包装类&#xff1a; 在SE的学习中我们已有过简单了解。 我们可以注意到&#xff0c;除了int类型的包装类为Integer&#xff0c;char类型的包装类为Character外&#xff0c;其余基本类型的包装类均…...

掌握Linux Vim:从基础到高级的全面指南

Vim是一款在Linux世界中备受推崇的文本编辑器,它以其强大的功能和高效的操作模式闻名于世。尽管Vim的学习曲线较陡,但一旦掌握,你将发现它在代码编辑和文本处理方面的无与伦比的优势。本文将从Vim的基础知识开始,逐步深入到高级用法和技巧,帮助你全面掌握这款强大的编辑器…...

打好“组合拳”,实现国有企业降本增效

在当前经济不确定性加剧、市场寒意明显的背景下&#xff0c;众多国有企业因历史积累的管理问题而陷入困境。随着经济形势的严峻&#xff0c;各行业普遍出现发展乏力的现象&#xff0c;促使企业开始重视“修炼内功”、“向内挖潜”&#xff0c;试图控制成本&#xff0c;以确保平…...

Wan2.2-I2V-A14B开源可部署:符合等保2.0要求,支持审计日志+访问控制

Wan2.2-I2V-A14B开源可部署&#xff1a;符合等保2.0要求&#xff0c;支持审计日志访问控制 1. 镜像概述与核心特性 Wan2.2-I2V-A14B是一款专为文生视频任务优化的私有部署镜像&#xff0c;基于RTX 4090D 24GB显存显卡和CUDA 12.4环境深度定制。本镜像不仅提供高性能的视频生成…...

从零到一:手把手教你用海康VisionMaster完成第一个字符识别项目(附完整流程与避坑点)

从零到一&#xff1a;手把手教你用海康VisionMaster完成第一个字符识别项目&#xff08;附完整流程与避坑点&#xff09; 在工业自动化领域&#xff0c;字符识别技术正逐渐成为生产线上的"眼睛"。无论是产品追溯码读取、包装日期检测&#xff0c;还是仪表盘数值记录&…...

ESP WiFi中继器终极配置指南:从零开始打造智能无线网络扩展器

ESP WiFi中继器终极配置指南&#xff1a;从零开始打造智能无线网络扩展器 【免费下载链接】esp_wifi_repeater A full functional WiFi Repeater (correctly: a WiFi NAT Router) 项目地址: https://gitcode.com/gh_mirrors/es/esp_wifi_repeater 想要轻松扩展WiFi覆盖范…...

Hunyuan-MT-7B实战教程:OpenWebUI插件开发——添加术语库与记忆功能

Hunyuan-MT-7B实战教程&#xff1a;OpenWebUI插件开发——添加术语库与记忆功能 1. 项目背景与目标 Hunyuan-MT-7B作为腾讯混元开源的70亿参数多语翻译模型&#xff0c;在WMT2025竞赛中斩获30项第一&#xff0c;支持33种语言双向互译&#xff0c;包括5种中国少数民族语言。这…...

Gepetto核心工具详解:函数反编译、变量重命名与代码注释

Gepetto核心工具详解&#xff1a;函数反编译、变量重命名与代码注释 【免费下载链接】Gepetto IDA plugin which queries OpenAIs gpt-3.5-turbo language model to speed up reverse-engineering 项目地址: https://gitcode.com/gh_mirrors/ge/Gepetto Gepetto是一款集…...

大模型进阶必看:Agent Skills如何让AI开发更标准化、可复用?速收藏!

随着AI应用开发成熟&#xff0c;工具调用经历了Function Calling、MCP协议到Agent Skills三个阶段。Agent Skills通过文件系统原生设计&#xff0c;将指令、工作流和资源打包成可复用模块&#xff0c;革新上下文管理&#xff0c;实现代码即工具&#xff0c;摆脱供应商锁定。它使…...

Anomalib Padim模型训练完整踩坑记录:从环境配置、自制数据集准备到ONNX导出一步到位

Anomalib Padim模型实战&#xff1a;工业缺陷检测从零到ONNX部署全指南 工业质检领域正经历一场从传统人工检测到智能算法驱动的变革。想象一下&#xff0c;当生产线上的金属部件以每分钟数十个的速度通过摄像头时&#xff0c;如何确保每个产品表面没有细微划痕、凹陷或腐蚀&am…...

esp-hosted 方案深度解析:从架构选型到性能调优实战

1. 为什么选择esp-hosted方案&#xff1f; 如果你正在为嵌入式系统寻找稳定可靠的无线连接方案&#xff0c;esp-hosted绝对值得考虑。这个由乐鑫推出的开源方案&#xff0c;本质上是通过ESP32系列芯片为Linux主机或MCU设备提供Wi-Fi和蓝牙连接能力。我曾在多个工业物联网项目中…...

轻量级语义通信系统在边缘计算中的实践与优化

1. 边缘计算为什么需要轻量级语义通信&#xff1f; 想象一下你家的智能门铃摄像头&#xff0c;它需要实时把门口的画面传到你的手机上。传统的通信方式就像把整本相册邮寄给你&#xff0c;而语义通信则是只告诉你"门口有个穿红衣服的快递员"。这种"说重点"…...

**Modbus协议深度解析:基于Python的TCP通信实战与发散创新应用**在工业自动化领域,**Modbus协议

Modbus协议深度解析&#xff1a;基于Python的TCP通信实战与发散创新应用 在工业自动化领域&#xff0c;Modbus协议因其简单、稳定和开放性成为最广泛使用的串行通信标准之一。本文将从底层原理出发&#xff0c;深入剖析 Modbus TCP 的数据帧结构&#xff0c;并结合 Python 实现…...