八、MySql表的复合查询

news2025/1/21 2:59:20

文章目录

  • 一、基本查询回顾
  • 二、多表查询
    • (一)笛卡尔积的初步过滤
    • (二)例子
      • 1.显示部门号为10的部门名,员工名和工资
      • 2.显示各个员工的姓名,工资,及工资级别
  • 三、自连接
    • (一)定义
    • (二)显示员工FORD的上级领导的编号和姓名
  • 四、子查询
    • (一)单行子查询
      • 1.显示SMITH同一部门的员工
    • (二)多行子查询
      • 1.in关键字
      • 2.all关键字
  • 五、合并查询

一、基本查询回顾

二、多表查询

  • 实际开发中往往需要将多张表关联起来进行查询,即多表查询。
  • 在进行多表查询时,只需将多张表的表名依次放到from子句后,用逗号隔开即可。
  • MySQL将会对给定的这多张表取笛卡尔积,作为多表查询的初始数据源。
    多表查询的本质,就是对给定的多张表取笛卡尔积,然后在笛卡尔积中进行查询。

对多张表取笛卡尔积,即得到这多张表的记录的所有可能有序对组成的集合,如下面对员工表和部门表进行多表查询,由于查询语句中没有指明筛选条件,因此最终得到的结果便是员工表和部门表的笛卡尔积!

(一)笛卡尔积的初步过滤

由于以上要查询的数据分别来自于emp表和dept表,因此要联合这两张表进行查询:
在这里插入图片描述

  • 员工表和部门表的笛卡尔积由两部分组成,前半部分是员工表的列信息,后半部分是部门表的列信息。
  • 对员工表和部门表取笛卡尔积时,会先从员工表中选出一条记录与部门表中的所有记录进行组合,然后再从员工表中选出一条记录与部门表中的所有记录进行组合,以此类推,最终得到的就是这两张表的笛卡尔积。
mysql> select *from DEPT,EMP ;

在这里插入图片描述
对多张表取笛卡尔积后得到的数据并不都是有意义的,如对员工表和部门表取笛卡尔积时,员工表中的每一个员工信息都会和部门表中的每一个部门信息进行组合,而实际一个员工只有和自己所在的部门信息进行组合才是有意义的,因此需要从笛卡尔积中筛选出员工的部门号和部门的编号相等记录!

注意:进行笛卡尔积的多张表中可能会存在相同的列名,在选中列名时需通过 表名.列名 的方式指明!

mysql> select *from DEPT,EMP where EMP.deptno = DEPT.deptno;

在这里插入图片描述

(二)例子

1.显示部门号为10的部门名,员工名和工资

由于部门名仅在部门表中,而员工名和员工工资仅在员工表中,因此需同时使用员工表和部门表进行多表查询,在where子句中指明筛选条件为员工的部门号等于部门编号,并且部门号为10的记录。

mysql> select ENAME,SAL,DNAME from EMP,DEPT where EMP.deptno = DEPT.deptno and DEPT.deptno=10;

在这里插入图片描述

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

员工名和工资仅在员工表中,工资级别仅在工资等级表中,因此需同时使用员工表和工资等级表进行多表查询,在where子句中指明筛选条件为员工的工资在losal和hisal之间的记录!

select ENAME,SAL,GRADE from EMP,salgrade where EMP.SAL between losal and hisal;

在这里插入图片描述

  • 员工表和工资等级表的笛卡尔积中,将每一个员工的信息和每一个工资等级的信息都进行了组合,而实际一个员工只有和自己的工资对应的工资等级信息组合才有意义
  • 因此需要根据各个工资等级的最低工资和最高工资判断一个员工是否属于该工资等级,进而筛选出有意义的记录

三、自连接

(一)定义

  • 自连接是指在同一张表进行连接查询,即不仅可以取不同表的笛卡尔积,也可以对同一张表取笛卡尔积。
  • 若一张表中的某个字段能够将表中的多条记录关联起来,那么就可以通过自连接将表中通过该字段关联的记录组合起来。

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

  • 解决该问题可使用子查询,先对员工表查询得到FORD的领导的编号,然后再根据领导的编号对员工表进行查询得到FORD领导的姓名。
select empno,ename from EMP where empno = (select empno from EMP where ename = 'FORD');

在这里插入图片描述

  • 也可使用自连接解决该问题,因为员工表中的mgr字段能够将表中员工的信息和员工领导的信息关联起来
select leader.empno,leader.ename from EMP leader,EMP worker where leader.empno = worker.mgr and worker.ename='FORD';

在这里插入图片描述
注意: 自连接是对同一张表取笛卡尔积,因此在自连接时至少需给一张表取别名,否则无法区分这两张表中的列。

四、子查询

(一)单行子查询

单行子查询,即返回单行单列数据(唯一数据)的子查询!

1.显示SMITH同一部门的员工

在子查询中查询SMITH所在的部门号,在where子句中指明筛选条件为员工部门号等于子查询返回的部门号,并且员工的姓名不为SMITH。

mysql> select deptno from EMP where ename = 'SMITH';

mysql> select *from EMP where deptno = (select deptno from EMP where ename = 'SMITH') and ename <> 'SMITH';

在这里插入图片描述
也可以使用自连接解决该问题,因为和SMITH同一部门的员工的信息也在员工表中,因此对员工表进行自连接后,在where子句中指明表1的员工姓名为SMITH,并且表1和表2的部门号必须相等,并且表2的员工姓名不为SMITH,这样也能筛选出和SMITH同一部门的员工信息!

(二)多行子查询

多行子查询,即返回多行数据(集合)的子查询!

1.in关键字

显示和10号部门的工作岗位相同的员工的名字、岗位、工资和部门号,但是不包含10号部门的员工。

select distinct job from EMP where deptno = 10;

在这里插入图片描述

mysql> select ename,job,sal,deptno from EMP where job in(select distinct job from EMP where deptno = 10) and deptno<>10;

在这里插入图片描述

2.all关键字

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

五、合并查询

合并查询,是指将多个查询结果进行合并,可使用的操作符有union和union all。

  • union用于取得两个查询结果的并集,union会自动去掉结果集中的重复行。
  • union all也用于取得两个查询结果的并集,但union all不会去掉结果集中的重复行。

显示工资大于2500或职位是MANAGER的员工

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

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

相关文章

基于SSM的校园快递一站式服务系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Consensus-AI论文搜索引擎 直接从论文中找答案

Consensus介绍 Consensus是一个人工智能AI论文搜索引擎&#xff0c;一个可以在科学论文中找到答案的搜索引擎&#xff0c;使用人工智能从数亿篇科学论文数据库中即时提取和聚合易于使用&#xff0c;搜索结果在几秒内即可完成&#xff0c;而且100%无广告。 截图 提示&#xf…

朋友圈大佬都去读研了,这份备考书单我码住了

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

Golang 单元测试合集整理,(我最常用 gomonkey)欢迎收藏

无论写什么样的语言&#xff0c;单元测试都是必不可少的&#xff0c;它可以极大的提高我们的代码质量&#xff0c;减少各种低级错误和 bug 无论你是一个靠谱合格的码农&#xff0c;还是一个优秀的程序员&#xff0c;单元测试都是咱们必须落实的一环 单元测试比较容易&#xf…

python:使用RESTful API(flask)调用python程序传递参数,实现Web端调用python程序

问题描述 现有一个用python写的程序&#xff08;或者是一个或几个的函数接口&#xff09;&#xff0c;需要在Web前端调用python写的函数。如果直接用前端java来调用会很不方便&#xff0c;而且会出现各种麻烦的问题&#xff0c;下面给出如何在web前端调用python的接口。 解决…

STM32WB55开发(2)----修改蓝牙地址

STM32WB55开发----2.修改蓝牙地址 概述硬件准备视频教学样品申请完整代码下载选择芯片型号配置时钟源配置时钟树RTC时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙设置工程信息工程文件设置修改置BLE设备公共地址Ble_Hci_Gap_Gatt_Init结果演示 概述 在…

更多场景、更多选择,Milvus 新消息队列 NATS 了解一下

在 Milvus 的云原生架构中&#xff0c;消息队列&#xff08;Log Broker&#xff09;可谓任重道远&#xff0c;它不仅要具备流式数据持久性、支持 TT 同步、事件通知等能力&#xff0c;还要确保工作节点从系统崩溃中恢复时增量数据的完整性。 在 Milvus 的架构中&#xff0c;一切…

【计算机视觉 | 语义分割】干货:语义分割常见算法介绍合集(一)

文章目录 一、U-Net二、Fully Convolutional Network三、SegNet四、DeepLab五、DeepLabv3六、UNet七、PSPNet八、EfficientDet九、SegFormer十、ENet 一、U-Net U-Net 是一种语义分割架构。 它由收缩路径和扩张路径组成。 收缩路径遵循卷积网络的典型架构。 它由两个 3x3 卷积…

基于SSM的学生信息管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Python 图形化界面基础篇:使用包装器( Pack )布局元素

Python 图形化界面基础篇&#xff1a;使用包装器&#xff08; Pack &#xff09;布局元素 引言什么是 Tkinter 的 Pack 布局&#xff1f;步骤1&#xff1a;导入 Tkinter 模块步骤2&#xff1a;创建 Tkinter 窗口步骤3&#xff1a;创建和使用 Pack 布局步骤4&#xff1a; Pack 布…

Android codec2 编码 -- 基于录屏

文章目录 前言android 原生的应用srcreenrecordMediaCodec获取编码数据流程 前言 本篇文章主要是理解Android 12编码的流程&#xff0c; 首先从上层的应用出发理解mediacodec提供给外部API的用法。然后针对每个api 分析编码各个流程中框架中的流程。 熟悉一个框架的流程 可以…

嵌入式这个领域会变得过于内卷吗?

今日话题&#xff0c;嵌入式这个领域会变得过于内卷吗&#xff1f;嵌入式开发主要服务于第二产业&#xff0c;尤其是制造业&#xff0c;包括电器、电气、机械、汽车、装备、航空航天等行业的“智能制造”部门&#xff0c;稳定性较强&#xff0c;不像互联网行业那样波动大。因此…

【LangChain系列 8】Prompt模版——少样本prompt模版(二)

原文地址&#xff1a;【LangChain系列 8】Prompt模版——少样本prompt模版(二) 本文速读&#xff1a; 固定少样本prompt模版 动态少样本prompt模版 在上篇文章中介绍了少样本模版的基本用法&#xff0c;本文将介绍 对话模型(chat model) 中 少样本prompt模版的用法。 LangCh…

C语言双向链表

文章目录 前言双向链表链表头结点的创建节点尾插与尾删节点头插与头删特定位置插入或删除节点链表节点查找双向链表的销毁 链表的打印 前言 假期时间因为为学校开学考试做准备所以一直没更新博客&#xff0c;今天开始博客会陆续更新。 双向链表 之前我们说过了顺序表和单链表…

加密狗软件有什么作用?

加密狗软件是一种用于加密和保护计算机软件和数据的安全设备。它通常是一个硬件设备&#xff0c;可以通过USB接口连接到计算机上。加密狗软件的作用主要体现在以下几个方面&#xff1a; 软件保护&#xff1a;加密狗软件可以对软件进行加密和授权&#xff0c;防止未经授权的用户…

K8S:kubectl陈述式、声明式资源管理及金丝雀部署

文章目录 一.陈述式资源管理方法1.陈述式资源管理概念2.基本信息查看&#xff08;1&#xff09;查看版本信息&#xff08;2&#xff09;查看资源对象简写&#xff08;3&#xff09;查看集群信息&#xff08;4&#xff09;配置kubectl自动补全&#xff08;5&#xff09;node节点…

【Java实战项目】【超详细过程】—大饼的图片服务器4

目录 1.引入servlet依赖2.处理客户端请求2.1 上传图片2.1.1.获取图片属性写入数据库&#xff08;1&#xff09;创建factory对象和fileUpload对象为获取图片信息做准备&#xff08;2&#xff09;将获取到的文件信息存到列表items中&#xff08;3&#xff09;获取列表items中第一…

无涯教程-JavaScript - XNPV函数

描述 XNPV函数返回的现金Stream量表的净现值不一定是周期性的。要计算一系列定期现金Stream量的净现值,请使用NPV函数。 语法 XNPV (rate, values, dates)争论 Argument描述Required/OptionalRateThe discount rate to apply to the cash flows.RequiredValues 与日期付款时…

(已解决)AttributeError: module ‘cv2.gapi.wip.draw‘ has no attribute ‘Text‘

问题描述 今天再跑Caption-Anything项目的时候&#xff0c;最开始的时候就报了这样一个错误&#xff1a;AttributeError: module cv2.gapi.wip.draw has no attribute Text。 Caption-Anything是一种多功能的图像处理工具&#xff0c;结合了Segment Anything&#xff0c;Visual…

前端项目开发流程

一 参加需求对称(评审)会议 时间&#xff1a;在产品设计完成以后&#xff0c;进入正式的开发流程之前 组织者&#xff1a;产品&项目经理 目的&#xff1a;统一大家对产品的认识&#xff0c;及时发现产品设计缺陷&#xff0c;尽可能降低后续修改需求的频率 参与者&#xff…