MySQL复合查询

[STM32H750]HAL库下FMC驱动正点原子MCU屏的移植与优化 本文详细介绍了在STM32H750平台上使用HAL库移植与优化正点原子MCU屏幕驱动的完整过程。重点解析了FMC硬件配置、Cache一致性处理、精确延时实现等关键技术难点,提供了实用的移植方案和性能优化技巧,帮助开发者高效解决屏幕显示问题。 阅读详情

1. 基本查询回顾

在进入复合查询之前,我们首先回顾单表查询的基础操作,包括条件过滤、排序、聚合函数、分组与子查询等。

基于这个数据库和表

DROP database IF EXISTS `scott`;
CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `scott`;

DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `deptno` int(2) unsigned zerofill NOT NULL COMMENT '部门编号',
  `dname` varchar(14) DEFAULT NULL COMMENT '部门名称',
  `loc` varchar(13) DEFAULT NULL COMMENT '部门所在地点'
);


DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
  `ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',
  `job` varchar(9) DEFAULT NULL COMMENT '雇员职位',
  `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
  `hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',
  `sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
  `comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',
  `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
);


DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (
  `grade` int(11) DEFAULT NULL COMMENT '等级',
  `losal` int(11) DEFAULT NULL COMMENT '此等级最低工资',
  `hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资'
);


insert into dept (deptno, dname, loc)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept (deptno, dname, loc)
values (20, 'RESEARCH', 'DALLAS');
insert into dept (deptno, dname, loc)
values (30, 'SALES', 'CHICAGO');
insert into dept (deptno, dname, loc)
values (40, 'OPERATIONS', 'BOSTON');

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);

insert into salgrade (grade, losal, hisal) values (1, 700, 1200);
insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);
insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);
insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);
insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);

示例:

查询工资高于500或职位为MANAGER,且姓名以J开头的员工:

select * from EMP where (sal > 500 or job = 'MANAGER') and ename like 'J%';

按部门升序、工资降序排序:

select * from EMP order by deptno, sal desc;

显示年薪(含奖金)并降序排序:

select ename,sal*12 + ifnull(comm,0) as '年薪' from emp order by 年薪 desc;

显示工资最高的员工:

select ename, job from EMP where sal = (select max(sal) from EMP);

显示高于平均工资的员工:

select ename,sal from emp where sal > (select avg(sal) from emp);

显示每个部门的平均工资和最高工资:

select deptno,format(avg(sal),2) ,max(sal) from emp group by deptno;

显示平均工资低于2000的部门:

select deptno,avg(sal) as avg_sal from emp group by deptno having avg_sal < 2000;

显示每种岗位的雇员总数和平均工资:

select job,count(*),format(avg(sal),2) from emp group by job;

2. 多表查询(重点)

多表查询用于从多个表中获取数据,通常通过连接条件避免笛卡尔积。

实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询。

2.1 笛卡尔积

案例:

显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询。
当不指定连接条件时,两张表的每一行都会组合,产生大量无用数据。

2.2 等值连接

通过连接条件过滤出有效数据。

示例:

显示雇员名、工资和所在部门名:

select emp.ename,emp.sal,dept.dname from emp,dept where emp.deptno = dept.deptno;

显示部门号为10的部门名、员工名和工资:

select ename, sal,dname from emp, dept where emp.deptno=dept.deptno and dept.deptno = 10;

显示员工姓名、工资和工资级别(根据SALGRADE表):

select ename,sal,grade from emp,salgrade where emp.sal between salgrade.losal and salgrade.hisal;

3. 自连接

自连接是指在同一张表内进行连接查询,常用于查找表中记录之间的层级关系。

示例:

查找员工'FORD'的上级领导编号和姓名 (mgr 是员工领导的编号 -- empno)

使用的子查询:

select empno,ename from emp where emp.empno = (select mgr from emp where ename = 'FORD');

使用多表查询(自查询)

--from emp leader, emp worker,给自己的表起别名,因为要先做笛卡尔积,所以别名可以先识别

select leader.empno , leader.ename from emp leader,emp worker where leader.empno = worker.mgr and worker.ename = 'FORD';

4. 子查询

子查询是嵌套在其他SQL语句中的查询,分为单行、多行、多列子查询。

4.1 单行子查询

返回一行一列的数据。

示例:

显示与 smith 同一部门的员工:

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

4.2 多行子查询

使用IN、ANY、ALL关键字。

示例:

查询和 10 号部门的 工作岗位相同 的雇员的名字,岗位,工资,部门号,但是 不包含10号部门自己的员工 。
select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno = 10) and deptno<>10;

显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

select ename,sal,deptno from emp where sal > all(select sal from emp where deptno = 30);

显示工资比部门30的 任意 员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)

4.3 多列子查询

单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。

示例:

查询与SMITH部门和岗位相同的员工(不包括SMITH):

select ename from emp where (deptno, job)=(select deptno, job from emp where ename='SMITH') and ename <> 'SMITH';

5. FROM子句中的子查询(派生表)

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

示例:

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
select ename,deptno,sal,format(asal,2) from emp,
(select avg(sal) asal,deptno dt from emp group by deptno) tmp 
where emp.sal > tmp.asal and emp.deptno = tmp.dt;

查找每个部门工资最高的人的姓名、工资、部门、最高工资
select emp.ename,emp.sal,emp.deptno,ms from emp,
(select max(sal) ms,deptno from emp group by deptno) tmp 
where emp.deptno = tmp.deptno and emp.sal = tmp.ms;

显示每个部门的信息(部门名,编号,地址)及人员数量:

方法1:使用多表

select dept.dname,dept.deptno,dept.loc,count(*) '部门人数' from emp,dept 
where emp.deptno = dept.deptno group by dept.deptno,dept.dname,dept.loc;

方法2:使用子查询

select dept.deptno, dname, mycnt, loc from dept, 
(select count(*) mycnt, deptno from emp group by deptno) tmp 
where dept.deptno=tmp.deptno;

6. 合并查询

用于合并多个SELECT语句的结果,支持 UNION 和 UNION ALL。

6.1 UNION

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

示例:

查询工资大于2500或职位为MANAGER的员工:

select ename,sal,job from emp where sal > 2500 union select ename,sal,job from emp where job = 'MANAGER';

6.2 UNION ALL

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

示例:

不去重地合并两个查询结果:

select ename,sal,job from emp where sal > 2500 union all select ename,sal,job from emp where job = 'MANAGER';

7.总结

复合查询是MySQL中非常重要的部分,主要包括:

  • 多表连接(等值连接、自连接)。

  • 子查询(单行、多行、多列、派生表)。

  • 合并查询(UNION、UNION ALL)。

掌握这些查询技巧可以高效地从多个表中提取复杂数据,是数据库开发与数据分析的基础能力。

8.OJ题目练习

查找所有员工入职时候的薪水情况_牛客题霸_牛客网

select s1.emp_no , s1.salary from salaries s1 
where s1.from_date = (select min(s2.from_date) from salaries s2
        where s2.emp_no = s1.emp_no group by s2.emp_no)
order by s1.emp_no desc

获取所有非manager的员工emp_no_牛客题霸_牛客网

select employees.emp_no from employees where 
employees.emp_no not in(select  emp_no from dept_manager);

获取所有员工当前的manager_牛客题霸_牛客网

select dept_emp.emp_no,dept_manager.emp_no as manager from dept_emp,dept_manager
where dept_emp.dept_no = dept_manager.dept_no and 
dept_emp.emp_no not in(select emp_no from dept_manager);

RTAB-map:实时高效的SLAM库 Real‐time appearance‐based mapping (RTAB‐Map)是一种基于外观的闭环检测方法,具有良好的内存管理,以满足处理大场景和在线长周期管理要求。RTAB‐Map集成了视觉和激光雷达SLAM方案,并支持目前绝大多数的传感器 是一个强大的、开源的Simultaneous Localization and Mapping(SLAM)库,专为机器人和无人驾驶领域设计。它提供了一套完整的解决方案,用于构建三维地图,并在未知环境中进行实时定位与导航。 github项目地址 RTAB- 阅读详情

相关推荐

Jenkins+docker 微服务实现自动化部署安装和部署过程

本文详细介绍了如何使用Docker部署Jenkins自动化服务器。主要内容包括:1)拉取Jenkins官方或BlueOcean镜像;2)创建容器并配置端口映射、数据卷挂载;3)设置防火墙规则;4)配置清华大学镜像加速;5)安装必要插件;6)SSH密钥配置;7)构建触发器设置;8)编写自动化构建脚本。通过Docker部署Jenkins可以简化安装流程,确保环境一致性,并利用容器特性实现快速启动和管理。文章提供了完整的配置步骤和注意事项,帮助用户快速搭建CI/CD环境。

qq_33665793的博客 1691

【MySQL】复合查询

💬 hello!各位铁子们大家好哇。今日更新了MySQL复合查询的内容。

qinjh_的博客 2754

2025趋势:经济学研究中AI多智能体系统的6大架构方向(AI应用架构师必藏)

多智能体系统(MAS)由多个相互作用的智能体组成,每个智能体具备自主决策能力、感知环境的能力和与其他智能体通信的能力。微观行为的精细化建模:智能体可被赋予异质的偏好函数、信息集和决策规则,模拟真实市场的多样性动态交互的涌现性分析:通过智能体间的局部互动(如交易、合作、竞争),观察宏观经济现象的涌现过程反事实政策实验:在虚拟环境中安全测试极端政策(如负利率、全民基本收入)的连锁反应实时自适应调整:智能体可通过机器学习持续优化策略,模拟经济系统的演化特性。

AI 领航者的博客 1425

【MySQL基础】MySQL复合查询全面解析:从基础到高级应用

【MySQL基础】关于MySQL查询操作的知识点的全面深度刨析,掌握查询操作的同时学会如何高效的查询!!

2301_80220607的博客 3397

Android 的端智能学习路径

基础层:先补齐 Android 进阶(JNI / 性能优化)和 AI 基础概念,无需深入算法开发;核心层:掌握 TFLite 的模型加载、推理、量化,能完成基础端侧推理;落地层:聚焦实战场景(图像 / OCR / 语音),解决工程化问题(模型管理、异常处理);优化层:通过模型量化、硬件加速、工程优化,提升推理性能和用户体验。

hqiangtai的博客 346

随机森林文本分类

随机森林原理及代码实现 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录随机森林原理及代码实现前言一、集成算法是什么?二、随机森林是什么三、 数据预处理3.1 先来看一下我们的文本数据3.2 预处理3.3 统计评论情感值积极与消极的占比二、使用步骤参数介绍(4个)属性1.引入库2.参数调参方法总结 前言 提示:这里可以添加本文要记录的大概内容: 例如

m0_46579176的博客 5809

MySQL:复合查询

本文讲解MySQL中的复合查询,干货满满,快来看看吧!!!

小白成长之路 1238

NFS服务器配置与autofs自动挂载

NFS服务器配置autofs自动挂载 环境: hostname ip OS server 192.168.220.138 centos7 client 192.168.220.139 centos7 一、NFS概述 NFS(Network File System)网络文件系统。最大功能就是通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。 二、端口 [root@se...

DoloresOOO的博客 1027

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

通过第一张表emp中的 员工FORD, 找到对应的领导编号,正好对应第二张emp表的员工编号。对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要。查询和10号部门的工作岗位相同雇员的名字、岗位、工资、部门号 ,但是不包含10号自己的。寻找到emp表的部门号 与 tmp表的部门号 相同的 数据 才是合适的,所以加上。左侧的表按条件拼接(条件满足拼接,条件不满足拼NULL) 右侧表完全显示。左侧表完全显示 右侧的表按条件拼接(条件满足拼接,条件不满足拼NULL)

qq_62939852的博客 3048

《深入掌握PostgreSQL数据库》 - 专栏介绍和目录

本专栏系统讲解PostgreSQL数据库的全栈知识,涵盖基础入门到高级实战。内容分为语言基础与进阶、核心原理、高可用架构、性能优化、运维管理、扩展开发等多个模块。从安装配置、数据类型选择到窗口函数、CTE等高级特性,再到索引优化、执行计划分析等性能调优技巧,全面解析PostgreSQL的核心功能。同时深入探讨MVCC机制、WAL日志、并发控制等底层原理,并分享高可用架构设计、备份恢复等运维实践。适合各层次开发者系统学习PostgreSQL,掌握这一强大开源数据库的关键技术。

数据知道的博客 3461

【Coppeliasim|轨迹规划(三)】机械臂逆解

文章目录一些设置导航点设置添加连接用于碰撞的设置代码实现终端输出 一些设置 导航点设置 关于如何添加设置 dummy 的细节建议参考官方手册,这里不再赘述。 添加连接用于碰撞的设置 按照序号点击(一个是机械臂,一个是所有的物体除了机械臂): 代码实现 getMatrixShiftedAlongZ=function(matrix,localZShift) local m={} for i=1,12,1 do m[i]=matrix[i] end

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

MySQL复合查询全面解析

摘要: MySQL复合查询通过组合多个简单查询实现复杂数据处理,是数据库操作的核心技术。本文系统讲解五种复合查询类型:子查询(嵌套逻辑)、连接查询(表关联)、UNION查询(结果合并)、派生表与CTE(代码复用),并配以实战案例演示多层级数据分析。重点解析INNER/OUTER JOIN的区别、EXISTS优化技巧、递归CTE实现层级查询等高级用法,同时提供索引优化、小表驱动等性能提升策略,帮助开发者高效处理跨表关联、数据聚合等业务场景。

没事学AI的博客 1107

YOLO+OpenClaw缺陷检测智能体 | 低代码工业质检自动化方案 | 含YOLO模型训练/智能体集成/任务全流程,支持离线日报/预警/趋势分析,解决实时性瓶颈问题(下篇)

某PCB板制造商需要对生产线上的PCB板进行缺陷检测,主要检测划痕、凹坑、污渍和裂纹等缺陷。原有人工检测方式效率仅为200件/小时,漏检率达5%,且检测人员长期工作易疲劳。

qq_36130719的博客 207

【MySQL篇】复合查询

基于上篇MySQL基本查询,基本上都是对一张表进行查询。【MySQL篇】MySQL基本查询详解-优快云博客复合查询是处理复杂业务逻辑的核心技能 ,本篇涵盖多表查询,子查询和合并查询等复杂场景。

2401_82677021的博客 1238

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[MySQL]MySQL复合查询

MySQL的复合查询。

csdn_myhome的博客 541

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【MYSQL】复合查询

本文介绍了SQL中的内置函数、多表查询、自连接、子查询和合并查询等常用操作。内置函数包括日期函数、字符串函数、数学函数等,用于处理日期、字符串和数值数据。多表查询通过笛卡尔积将多张表的数据组合,并通过条件筛选有意义的结果。自连接用于对同一张表进行查询,常用于查找员工与上级的关系。子查询分为单行、多行、多列子查询,用于嵌套查询和复杂条件筛选。合并查询使用union和union all将多个查询结果合并,前者去重,后者不去重。这些操作在数据库查询中广泛应用,帮助用户高效处理和分析数据。

2301_80555259的博客 976

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

多表查询,笛卡尔积,子查询,内外连接

2303_80828380的博客 1145
上一篇: MySQL内置函数
下一篇: C语言常见概念入门指南
FirstFrost --sy
博客等级 码龄3年 371粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值