【MySQL 08】复合查询

目录

1.准备工作

2.多表查询 

笛卡尔积

多表查询案例

3. 自连接

4.子查询 

1.单行子查询

2.多行子查询

3.多列子查询

4.在from子句中使用子查询

5.合并查询 

1.union

2.union all


1.准备工作

如下三个表,将作为示例,理解复合查询

  • EMP员工表

  • DEPT部门表

  • SALGRADE工资等级表

2.多表查询 

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

笛卡尔积

什么是笛卡尔积:
        数学上,有两个集合A={a,b},B={1,2,3},则两个集合的笛卡尔积={{a,1}, {a,2}, {a,3}, {b,1}, {b,2}, {b,3}} 列出所有情况,一共是2*3=6条记录;

在数据库中,笛卡尔积是多表查询没有连接条件时返回的表结果。

笛卡尔积的元素是元组,关系A和关系B的笛卡尔积可以记为(AXB),如果A表a条,B表为b条,那么A和B的笛卡尔积为(a+b)列数,有(a*b)行的元素集合。检索出来的条目是将第一个表中的行数乘以第二个表中的行数。

避免全笛卡尔积 :在 where 加入有效的连接条件;

消除笛卡尔积:使用等值连接和非等值连接;


例子:

        显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询

        对部分结果截取,由于两张表进行了笛卡尔积,任意一种可能都是存在的,我们可以看到SMITH时20部门的,但是给他拼接了其它部门的信息,这显然是没有意义的,所以我们在进行笛卡尔积的时候是要加过滤条件的。

        我们需要通过员工的部门号与对应的部门做关联,这才是正确的。这其实就有点像员工表中的外键,与部门表中的主键做关联。现在两张表就有效的合成了一张表,这张表的信息肯定是准确无误的,我们可以对这张大表多增删查改。


多表查询案例

        1.显示雇员名、雇员工资以及所在部门的名字
        雇员名、雇员工资是存在于emp表中的,二所在部门存在于dept表中的,因此我们要同时对emp表和dept进行查询。

  • select emp.ename, emp.sal, dept.dname: 这部分指定了查询的结果应该包含哪些列。
  • from emp, dept: 这部分指定了查询将要使用的表。在这个例子中,它指定了两个表:empdept。注意,这里使用的是表的直接连接(也称为笛卡尔积),但实际的连接条件在WHERE子句中给出。
  • where emp.deptno = dept.deptno: 这是查询的关键部分,它指定了两个表之间的连接条件。这里,它要求emp表中的deptno字段(雇员所属的部门编号)必须与dept表中的deptno字段(部门编号)相匹配。

        2.显示部门号为10的部门名,员工名和工资
        在上一题的基础上多给个条件就行了。

        3.显示各个员工的姓名,工资,及工资级别

        姓名和薪资属于emp表,而工资级别属于salgrade表,所以要对两表做笛卡尔积,但薪资要在薪资对应等级的范围内,不然就是错误关系。

3. 自连接

        自连接是指在同一张表连接查询,即自己与自己做笛卡尔积。在自连接中要,要取别名才可以。
        自连接在处理需要比较表中记录之间的关系时非常有用。例如,你可能有一个包含员工信息的表,并希望找到每个员工的直接上级或下级。

例子:

        显示员工 FORD 的上级领导的编号和姓名

        第一步先筛选出,在自连接表中与FORD有关的信息。        

select * from emp e1,emp e2 where e1.ename='FORD';

        第二步,我们知道要的不是FORD的信息,而是需要看到它领导的信息。因此我们可以用FORD领导的编号找到它领导的信息。       

select * from emp e1,emp e2 where e1.ename='FORD' and e1.mgr=e2.empno;

        第三步,我们只需要领导的编号和姓名,那么我们在第二步的基础上,选出我们需要的信息就好了  

4.子查询 

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

1.单行子查询

        该子查询返回的是单行单列的数据,即一个格子

例子:显示SMITH同一部门的员工

        那么首先我们就要找出SMITH的部门号,返回的是一个格子

        然后就用SMITH返回的部门号查找同一部门的员工


2.多行子查询

        该子查询返回的是多行但是单列的数据

例子:

        1.查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的

        先找出10号部门的工作岗位,这里对工作岗位一般会用到去重操作

        然后我们将此作为子查询条件,这里会用到in关键字,只要是上面三种岗位其中一个的就符合筛选条件,当然除10号部门以外的员工。

        2.显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
        这里我们子查询条件就是30号部门所有的工资,可以对该结果去重。

        然后,我们要用到all关键字,工资大于30号部门所有工资的员工,就筛选出来。(当然也可以用大于30号最高工资的方法进行筛选,而不是用all关键字)

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

        这里把all关键字换成any关键字就可以了(当然也可以用大于30号最低工资的方法进行筛选,而不是用any关键字)


3.多列子查询

        该子查询返回的是多列但是单行的数据

例子:

        查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
        那么首先就要查询SMITH的部门和岗位

        然后,只要筛选出deptno和job,与SMITH完全一样的就可以了。


4.在from子句中使用子查询

        你可以在FROM子句中使用子查询来创建一个临时表或派生表。这个临时表在查询的执行期间存在,并且你可以像对待普通表一样对它进行操作,包括选择列、应用过滤条件以及与其他表进行笛卡尔积。

        这也就是MySQL中一切皆表的思想,只不过在from中使用子查询,所得的临时表要取别名使用。

例子:

        1.显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
        首先获取各个部门的平均工资,将其看作临时表

        我们需要部门的平均工资和部门号,我们不存在这种表,因此只能构建临时表。然后通过此表,与员工表做笛卡尔积,筛选出我们需要的数据就可以了。

        2.显示每个部门的信息(部门名,编号,地址)和人员数量
        使用多表查询方法:

        统计每个部门的人数,并同时返回部门的名称(dname)、部门编号(deptno)和位置(loc)。这个查询使用了EMP(员工)表和DEPT(部门)表。

        并通过EMP.deptno=DEPT.deptno条件将它们连接起来。然后,它按部门编号、部门名称和部门位置进行分组,并使用count(*)函数来计算每个组中的记录数(即每个部门的人数)。

        使用子查询方法:

        先查询出每个部门人员数量、部门编号。        

        一上面查询结果作为临时表,与部门表做笛卡尔积,筛选出符合条件的情况。

5.合并查询 

        在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all
        union操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。union all操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

1.union

案例:将工资大于25000或职位是MANAGER的人找出来

        这里一共有七行数据

        使用union进行合并(这里对结果做了去重)


2.union all

        接上面例子,发现是没有对结果去重的

 

 ​​​​​​​

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在IDEA里用XDebug调试PHP,断点....

做程序开发,调试必不可少,这里最近用到了PHP,顺便写个关于PHP的调试安装使用: 1、首先是PHP先安装xdebug扩展(还有zend的),这个我的工具是IDEA,所以安装方法也相对简单,如果你是用VSCode等应该也是一样,如下图,找到这个PHP->DEBUG 2、直接点上面的Install XDebug 就可以帮你…

C(十五)函数综合(一)--- 开公司吗?

在这篇文章中,杰哥将带大家 “开公司”。 主干内容部分(你将收获):👉 为什么要有函数?函数有哪些?怎么自定义函数以及获得函数的使用权?怎么对函数进行传参?函数中变量的…

springboot kafka多数据源,通过配置动态加载发送者和消费者

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需…

FastAPI框架使用枚举来型来限定参数、FastApi框架隐藏没多大意义的Schemes模型部分内容以及常见的WSGI服务器Gunicorn、uWSGI了解

一、FastAPI框架使用枚举来型来限定参数 FastAPI框架验证时,有时需要通过枚举的方式来限定参数只能为某几个值中的一个,这时就可以使用FastAPI框架的枚举类型Enum了。publish:December 23, 2020 -Wednesday 代码如下: #引入Enum模块 from fa…

Python常用的函数大全!

对Python的内置函数进行了非常详细且有条理的分组和描述。 第一组 print():用于输出信息到控制台。input():用于从用户那里接收输入。len():返回对象(如字符串、列表、元组等)的长度。类型转换函数(int()…

YOLOv11改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性

一、背景 目标检测和实例分割中的关键问题: 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值,这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足: 现有的基于 ℓ n \ell_n ℓn​范数的损失函数简单但对各种尺度…

vSAN06:ESA与OSA对比、ESA安装、新架构、工作方式、自动策略管理、原生快照、数据压缩、故障处理

目录 vSAN ESAvSAN ESA 安装ESA新架构ESA工作方式ESA自动策略管理自适应RAID5策略 原生快照支持数据压缩的改进ESA故障处理 vSAN ESA vSAN ESA 安装 流程和OSA完全一致,但要注意要勾选启用vSAN ESA ESA和OSA的底层架构不一样,但是UI上是一致的。 生产环…

使用Python编写你的第一个算法交易程序

背景 Background ​ 最近想学习一下量化金融,总算在盈透投资者教育(IBKRCampus)板块找到一篇比较好的算法交易入门教程。我在记录实践过程后,翻译成中文写成此csdn博客,分享给大家。 ​ 如果你的英语好可以直接看原文…

2024百度云智大会|百度大模型内容安全合规探索与实践

9月25日,2024百度云智大会在北京举办。会上,百度智能云分别针对算力、模型、AI 应用,全面升级百舸 AI 异构计算平台 4.0、千帆大模型平台 3.0 两大 AI 基础设施,并升级代码助手、智能客服、数字人三大 AI 原生应用产品。 在大模型…

[uni-app]小兔鲜-08云开发

uniCloud可以通过JS开发服务端,包含云数据库, 云函数, 云存储等功能, uniCloud可结合 uni-ui 组件库使用 效果展示: <picker>城市选择组件不支持h5端和APP端, 所以我们使用 <uni-data-picker>组件进行兼容处理 <uni-data-picker>的数据使用云数据库的数据 云…

K8s中pod的管理和优化

一、k8s中的资源 1.1 资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象 资源&#xff0c;用户需要通过操作资源来管理kubernetes。kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务所谓的部署服务&#xff0c;其实就是在kubernetes集群中…

【D3.js in Action 3 精译_030】3.5 给 D3 条形图加注图表标签(下):Krisztina Szűcs 人物专访 + 3.6 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

Hive3.x版本调优总结

文章目录 第 1 章 Explain 查看执行计划&#xff08;重点&#xff09;1.1 创建测试用表1&#xff09;建大表、小表和 JOIN 后表的语句2&#xff09;分别向大表和小表中导入数据 1.2 基本语法1.3 案例实操 第 2 章 Hive 建表优化2.1 分区表2.1.1 分区表基本操作2.1.2 二级分区2.…

WMS系统拣货管理的优化与创新

一、WMS系统拣货管理的重要性 随着电子商务的快速发展&#xff0c;物流仓储行业面临着巨大的挑战。订单量的激增导致传统的手工拣货方式难以满足需求&#xff0c;而WMS系统的引入则解决了这一问题。通过WMS系统&#xff0c;仓库可以实现自动化、智能化的拣货管理&#xff0c;大…

小米路由器R3Gv2安装openwrt记录

前言 小米路由器R3Gv2的硬件配置与小米路由器4A千兆版一致&#xff0c;但bootloader有所不同&#xff0c;因此openwrt的固件不要互刷。另外&#xff0c;R3Gv2和R3G、4A百兆版是不同的设备&#xff0c;切勿混淆。 硬件信息 OpenWrt参数页-Xiaomi MiWiFi 3G v2 CPU&#xff1a…

小猿口算APP脚本(协议版)

小猿口算是一款专注于数学学习的教育应用,主要面向小学阶段的学生。它提供多种数学练习和测试,包括口算、速算、应用题等。通过智能化的题目生成和实时批改功能,帮助学生提高数学计算能力。此外,它还提供详细的学习报告和分析,帮助家长和教师了解学生的学习进度和薄弱环节…

[含文档+PPT+源码等]精品大数据项目-基于python爬虫实现的大数据岗位的挖掘与分析

大数据项目——基于Python爬虫实现的大数据岗位的挖掘与分析&#xff0c;其背景主要源于以下几个方面&#xff1a; 一、大数据时代的来临 随着互联网、物联网、云计算等技术的快速发展&#xff0c;数据呈现出爆炸式增长。根据国际数据公司&#xff08;IDC&#xff09;的预测&…

新电脑 Windows 系统初始配置

文章目录 前言1 前置配置2 安装软件2.1 通讯工具2.2 后端开发工具2.3 硬件开发工具2.4 前端开发工具2.4 其它工具 3 Windows 11 优化4 写在最后 前言 分区&#xff08;个人习惯&#xff09;&#xff1a;1TB SSD 分为 2 个分区&#xff0c;一个 256GB 分区为系统盘&#xff0c;剩…

003 Springboot操作RabbitMQ

Springboot整合RabbitMQ 文章目录 Springboot整合RabbitMQ1.pom依赖2.yml配置3.配置队列、交换机方式一&#xff1a;直接通过配置类配置bean方式二&#xff1a;消息监听通过注解配置 4.编写消息监听发送测试5.其他类型交换机配置1.FanoutExchange2.TopicExchange3.HeadersExcha…

【AIGC】寻找ChatGPT最佳推理步骤:CoT思维链技术的探索与应用

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;CoT思维链概述&#x1f4af;CoT思维链在大型语言模型中的应用&#x1f4af;CoT思维链改变对模型推理能力的理解和改进方式多样化应用场景挑战与未来发展总结 &#x1f4a…