mysql复合查询mysql子查询

基础表结构创建

表结构包含主外键约束和字符集配置,确保数据完整性
部门表

CREATE TABLE `dept` (`deptno` int NOT NULL COMMENT '部门编号',`dname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '部门名称',`loc` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '部门属地',PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

用户表(含部门外键)

CREATE TABLE `emp` (`empno` int NOT NULL COMMENT '编号',`ename` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '名称',`job` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '工作',`mgr` int DEFAULT NULL COMMENT '上司编号',`hiredate` date DEFAULT NULL COMMENT '入职时间',`sal` decimal(10,2) DEFAULT NULL COMMENT '薪资',`deptno` int DEFAULT NULL COMMENT '部门编号',PRIMARY KEY (`empno`),KEY `deptno` (`deptno`),CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

薪资等级表

CREATE TABLE `salgrade` (`grade` int NOT NULL COMMENT '等级',`losal` decimal(10,2) DEFAULT NULL COMMENT '最小薪资',`hisal` decimal(10,2) DEFAULT NULL COMMENT '最大薪资',PRIMARY KEY (`grade`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

给表补充数据

部门表

INSERT INTO dept VALUES 
(10,'ACCOUNTING','NEW YORK'),
(20,'RESEARCH','DALLAS'),
(30,'SALES','CHICAGO');

用户表

INSERT INTO emp VALUES
(7369,'张三1','develop',7499,'2025-05-06 16:16:53',8600,20),
(7499,'李四1','reception',0,'2025-05-06 16:16:53',8300,30),
(7521,'王先生1','develop',0,'2025-05-06 16:16:53',6000,30),
(7566,'李强1','develop',7499,'2025-05-06 16:16:53',8600,20),
(7698,'寇1','develop',7521,'2025-05-06 16:16:53',8600,30);

薪资表

INSERT INTO salgrade VALUES
(1,700,1200),
(2,1201,1400),
(3,1401,2000),
(4,2001,3000),
(5,3001,9999);

复合查询SQL演示

多表联合查询‌

通过薪资范围关联等级表,查询员工姓名、部门及薪资等级:

SELECT e.ename, d.dname, s.grade
FROM emp e
JOIN dept d ON e.deptno = d.deptno
JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;

在这里插入图片描述
查询员工名称是张三1员工的姓名、部门及薪资等级

SELECT e.ename, d.dname, s.grade
FROM emp e
JOIN dept d ON e.deptno = d.deptno
JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal
where e.ename = '张三1';

在这里插入图片描述
查询名称结尾是1 员工的姓名、部门及薪资等级

SELECT e.ename, d.dname, s.grade
FROM emp e
JOIN dept d ON e.deptno = d.deptno
JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal
where e.ename like '%1';

在这里插入图片描述

笛卡尔积(联表查询需要关注的概念)

概念

笛卡尔积是指两个集合中所有可能的有序对组合,在数据库中表现为两个表的每一行都与另一个表的每一行进行组合。数学表达式为:A × B = {(a,b) | a ∈ A ∧ b ∈ B}

语法
-- 1.显式语法:
SELECT * FROM emp CROSS JOIN dept;
-- 2.隐式语法:
SELECT * FROM emp , dept;

在这里插入图片描述
两种方式都会产生m×n行的结果集(m为表1行数,n为表2行数)

注意
  1. 风险:百万级表连接可能产生万亿级结果
  2. 优化方案:
    添加WHERE条件限制结果集
    使用子查询替代多表连接
    建立合适的索引

‌子查询应用‌

关联子查询实现分组筛选,查询各部门薪资高于该部门平均工资的员工:

SELECT e.ename, e.sal, d.dname
FROM emp e
JOIN dept d ON e.deptno = d.deptno
WHERE e.sal > (SELECT AVG(sal) FROM emp WHERE deptno = e.deptno
);

在这里插入图片描述
多列子查询:查找同部门同岗位薪资更高的员工

SELECT a.ename, a.sal, a.job
FROM emp a
WHERE EXISTS (SELECT 1 FROM emp bWHERE a.deptno = b.deptno AND a.job = b.jobAND a.sal < b.sal
);

在这里插入图片描述

优化技巧

‌索引策略‌

-- 部门关联字段索引
CREATE INDEX idx_emp_deptno ON emp(deptno);
-- 薪资查询复合索引
CREATE INDEX idx_emp_sal_dept ON emp(sal, deptno);

优先为连接条件和筛选字段建索引

‌执行计划分析‌

使用EXPLAIN检查查询效率:

EXPLAIN SELECT ... FROM emp JOIN dept ...;

例如

EXPLAIN SELECT e.ename, d.dname, s.grade
FROM emp e
JOIN dept d ON e.deptno = d.deptno
JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;

在这里插入图片描述

重点关注type列避免ALL扫描

子查询复杂应用

‌EXISTS优化IN‌

查询有下属的管理者:

SELECT ename FROM emp e1
WHERE EXISTS (SELECT 1 FROM emp e2 WHERE e2.mgr = e1.empno
);

比IN更高效的关联查询

‌派生表实现复杂统计‌

各部门薪资等级分布统计:

SELECT d.dname, s.grade, COUNT(*) count
FROM dept d
JOIN emp e ON d.deptno = e.deptno
JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal
GROUP BY d.dname, s.grade WITH ROLLUP;

多维度分组统计
建议通过EXPLAIN ANALYZE验证优化效果,避免超过3层嵌套子查询

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

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

相关文章

vlan(虚拟局域网)逻辑图解+实验详解

VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09; 是一种通过逻辑方式&#xff08;非物理连接&#xff09;将网络设备划分为多个独立广播域的技术。它允许管理员在同一个物理网络中创建多个隔离的虚拟网络&#xff0c;从而提升网络的安全性、灵…

2025年—Comfy UI 和 Stable Diffusion底层原理

为什么要先讲SD原理 &#xff1f; 逻辑理解: ComfyUI是节点式操作&#xff0c;需要自行搭建工作流&#xff0c;理解原理才能灵活定制工作流学习效率: 基础原理不懂会导致后续学习吃力&#xff0c;原理是掌握ComfyUI的关键核心价值: ComfyUI最有价值的功能就是自主搭建工作流&a…

深入理解C#中的Web API:构建现代化HTTP服务的完整指南

在当今的软件开发领域&#xff0c;构建高效、可扩展的Web服务已成为一项基本需求。作为.NET开发者&#xff0c;C#中的Web API框架为我们提供了创建RESTful服务的强大工具。本文将全面探讨Web API的核心概念、实现细节和最佳实践&#xff0c;帮助您掌握这一关键技术。 一、Web A…

起重机指挥人员在工作中需要注意哪些安全事项?

起重机指挥人员在作业中承担着协调设备运行、保障作业安全的关键职责&#xff0c;其安全操作直接关系到整个起重作业的安全性。以下从作业前、作业中、作业后的全流程&#xff0c;详细说明指挥人员需注意的安全事项&#xff1a; 一、作业前的安全准备 资质与状态检查&#xff…

【高等数学】傅里叶级数逼近例子

f ( x ) π 2 − ∣ x ∣ f(x)\frac{\pi}{2}-|x| f(x)2π​−∣x∣ 由于是偶函数只需要求 cos ⁡ ( n x ) , 1 \cos(nx),1 cos(nx),1 的系数 a n 0 a_n 0 an​0, n n n 是偶数 a n 1 ( 2 n − 1 ) 2 a_n \frac{1}{(2n-1)^2} an​(2n−1)21​, n n n 是奇数 则 f ( x )…

PowerBI企业运营分析—全动态盈亏平衡分析

PowerBI企业运营分析—全动态盈亏平衡分析 欢迎来到Powerbi小课堂&#xff0c;在竞争激烈的市场环境中&#xff0c;企业运营分析平台成为提升竞争力的核心工具。 该平台通过整合多源数据&#xff0c;实现关键指标的实时监控&#xff0c;从而迅速洞察业务动态&#xff0c;精准…

用ApiFox MCP一键生成接口文档,做接口测试

日常开发过程中&#xff0c;尤其是针对长期维护的老旧项目&#xff0c;许多开发者都会遇到一系列相同的困扰&#xff1a;由于项目早期缺乏严格的开发规范和接口管理策略&#xff0c;导致接口文档缺失&#xff0c;甚至连基本的接口说明都难以找到。此外&#xff0c;由于缺乏规范…

26考研 | 王道 | 计算机组成原理 | 三、存储系统

26考研 | 王道 | 计算机组成原理 | 三、存储系统 文章目录 26考研 | 王道 | 计算机组成原理 | 三、存储系统3.1 存储系统基本概念3.2 主存储器1. 主存储器的基本组成2. SRAM与DRAM1.DRAM和SRAM对比2.DRAM的刷新3.DRAM的地址线复用技术 3. 只读存储器ROM4.双端口RAM和多模块存储…

IDEA 开发PHP配置调试插件XDebug

1、安装PHP环境 为了方便&#xff0c;使用的PhpStudy。 安装路径&#xff1a;D:\resources\phpstudy_pro\Extensions\php\php7.3.4nts 2、下载Xdebug Xdebug: Downloads 选择对应的版本下载&#xff0c;本次使用的是7.3。 3、配置Xdebug 在php.ini中添加Xdebug配置。 D…

Go 语言的 GC 垃圾回收

序言 垃圾回收&#xff08;Garbage Collection&#xff0c;简称 GC&#xff09;机制 是一种自动内存管理技术&#xff0c;主要用于在程序运行时自动识别并释放不再使用的内存空间&#xff0c;防止内存泄漏和不必要的资源浪费。这篇文章让我们来看一下 Go 语言的垃圾回收机制是如…

60天python训练计划----day45

DAY 45 Tensorboard使用介绍 知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 之前的内容中&#xff0c;我们在神经网络训练中&#xff0c;为了帮助自己理解&#xff0c;借用了很多的组件&#x…

RocketMQ基础概念的理解

1、生产者 生产者和主题之间存在多对多关系。一个生产者可以向多个主题发送消息&#xff0c;一个主题可以接收来自多个生产者的消息。这种多对多关系有助于提高性能扩展和灾难恢复能力。 2、消费者以及消费者组 一个队列可以被多个消费者&#xff08;其中这多个消费者必须分…

Flash烧录速度和加载配置速度(纯FPGA ZYNQ)

在工程综合完成或者implement完成后&#xff0c;打开综合设计或者实现设计。 toots--->Edit Device Properties--->打开比特流设置 将bitstream进行压缩 上图中&#xff0c;时钟频率选择的档位有限&#xff0c;最大为66MHZ io的bus width可以设置为x1,x2,x4 vivado在设计…

优化09-表连接

一、表连接介绍 表连接类型 表连接是关系型数据库关键特性&#xff0c;在关系型数据库中&#xff0c;表连接分为三类&#xff1a;循环嵌套连接&#xff08;Nested Loops Join&#xff09;、哈希连接&#xff08;Hash Join&#xff09;、合并排序连接&#xff08;Merge Sort J…

Dify工作流实践—根据word需求文档编写测试用例到Excel中

前言 这篇文章依赖到的操作可查阅我之前的文章&#xff1a; dify里的大模型是怎么添加进来的&#xff1a;在Windows本地部署Dify详细操作 flask 框架app.route()函数的开发和调用&#xff1a;PythonWeb开发框架—Flask工程创建和app.route使用详解 结构化提示词的编写&…

AWTK 嵌入式Linux平台实现多点触控缩放旋转以及触点丢点问题解决

前言 最近涉及海图的功能交互&#xff0c;多点触摸又开始找麻烦。 在PC/Web平台awtk是通过底层的sdl2库来实现多点触摸&#xff0c;但是在嵌入式Linux平台&#xff0c;可能是考虑到性能原因&#xff0c;awtk并没有采用sdl库来做事件处理&#xff0c;而是自己实现一个awtk-lin…

Diffusion Planner:扩散模型重塑自动驾驶路径规划(ICLR‘25)

1. 概述 2025年2月14日&#xff0c;清华大学AIR智能产业研究院联合毫末智行、中科院自动化所和香港中文大学团队&#xff0c;在ICLR 2025会议上发布了Diffusion Planner——一种创新性的基于Diffusion Transformer的自动驾驶规划模型架构。该系统联合建模周车运动预测与自车行…

ESP32对接巴法云实现配网

目录 序言准备工作巴法云注册与使用Arduino准备 开发开始配网 序言 本文部分内容摘抄原创作者巴法云-做优秀的物联网平台 代码有部分修改并测试运行正常 巴法云支持免费用户通过开发对接实现各智能音箱设备语音控制智能家居设备&#xff0c;并有自己的App进行配网和控制&…

深度学习习题3

1.训练神经网络过程中&#xff0c;损失函数在一些时期&#xff08;Epoch&#xff09;不再减小, 原因可能是&#xff1a; 1.学习率太低 2.正则参数太大 3.卡在了局部最小值 A1 and 2 B. 2 and 3 C. 1 and 3 D. 都是 2.对于分类任务&#xff0c;我们不是将神经网络中的随机权重…

【EasyExcel】导出时添加页眉页脚

一、需求 使用 EasyExcel 导出时添加页眉页脚 二、添加页眉页脚的方法 通过配置WriteSheet或WriteTable对象来添加页眉和页脚。以下是具体实现步骤&#xff1a; 1. 创建自定义页眉页脚实现类 public class CustomFooterHandler implements SheetWriteHandler {private final…