第六章 复合查询

news2024/11/25 23:47:01

第六章 复合查询

  • 一、前言
  • 二、笛卡尔积
  • 三、多表查询
    • 1、多表查询的理解
    • 2、笛卡尔积与多表拼接
    • 3、多表查询示例
      • (1)显示雇员名、雇员工资以及所在部门的名字
      • (2)显示部门号为10的部门名,员工名和工资
      • (3)显示各个员工的姓名,工资,及工资级别
  • 四、自连接
    • 1、什么是自连接
    • 2、自连接示例
      • (1)方法一:单表查询:
      • (2)方法二:多表查询:
  • 五、子查询
    • 1、什么是子查询
    • 2、单行子查询
      • 示例
    • 3、多行子查询
      • (1)in关键字
      • (2)all关键字
      • (3)any关键字
    • 4、多列子查询
      • (1)示例
    • 5、在from子句中使用子查询
      • (1)查询结果作为一张临时表
      • (2)示例
        • 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
        • 查找每个部门工资最高的人的姓名、工资、部门、最高工资
        • 显示每个部门的信息(部门名,编号,地址)和人员数量
    • 6、合并查询
      • (1)union
        • 作用
        • 示例:将工资大于2500或职位是MANAGER的人找出来
      • (2)union all
        • 作用
        • 示例:将工资大于25000或职位是MANAGER的人找出来

一、前言

在前面的章节中,我们介绍的是单表查询,但是在本章节中我们要讲解的是多表查询。

二、笛卡尔积

设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成有序对,所有这样的有序对组成的集合叫做A与B的笛卡尔积,记作AxB.

笛卡尔积的符号化为:

A x B = < x , y > ∣ x ∈ A ∧ y ∈ B AxB={<x,y>|x∈A∧y∈B} AxB=<x,y>xAyB

例如, A = a , b , B = 0 , 1 , 2 A={a,b},B={0,1,2} A=a,b,B=0,1,2,则

A x B = < a , 0 > , < a , 1 > , < a , 2 > , < b , 0 > , < b , 1 > , < b , 2 > AxB={<a,0>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>} AxB=<a,0>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>

B x A = < 0 , a > , < 0 , b > , < 1 , a > , < 1 , b > , < 2 , a > , < 2 , b > BxA={<0,a>,<0,b>,<1,a>,<1,b>,<2,a>,<2,b>} BxA=<0,a>,<0,b>,<1,a>,<1,b>,<2,a>,<2,b>

三、多表查询

1、多表查询的理解

当我们涉及到多表查询的时候,MySQL会将各个表格以笛卡尔积的形式进行拼接,最终拼接为一张表。 所以表面上我们是对多个表进行查询,但实际上我们依旧是在进行单表查询。

2、笛卡尔积与多表拼接

比如我们现在有两个表A和B,那么mysql在拼接的时候,会将A表中每一条语句与B表中的所有语句进行拼接。也就是说,最终会罗列出记录拼接的所有可能。

当mysql进行拼接之后,所谓的多表查询就转化为了单表查询。

但是,由于mysql罗列出了所有的拼接可能,所以在这些拼接的结果中难免会有一些不符合逻辑的记录,此时就需要我们进行适当的筛选。

3、多表查询示例

我们这里使用的是一个新的数据库:scott。
这个数据库中有三个表:dept、emp、salgrade
这三个表的描述如下:

表dept的描述:
在这里插入图片描述
表emp的描述:
在这里插入图片描述

表salgrade的描述:
在这里插入图片描述

(1)显示雇员名、雇员工资以及所在部门的名字

因为上面的数据来自EMP和DEPT表,因此要联合查询。
我们先看看两个表各自的内容,再看一看两个表拼接后的内容。
emp表的内容如下:
在这里插入图片描述
dept的内容如下:
在这里插入图片描述
现在将两个表进行拼接,结果如下(由于拼接的结果很长,所以只展示一部分):
在这里插入图片描述
上面这个表中有一个缺点,我们发现,表中有两列deptno,但是某些记录在这两列对应的数值并不相等。这些不相等的数据就是我们要筛选掉的。
所以我们可以用如下语句进行筛选:

select * from emp, dept where emp.deptno = dept.deptno;

这里形如:表的名称.变量名的语法格式非常像c中的结构体或者是c++中的类。
在这里插入图片描述
当我们将表中数据进行正确的筛选后,就可以进行单表查询了。

我们刚刚的需求是:显示雇员名、雇员工资以及所在部门的名字

所以可以使用下面的语句进行筛选:

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

在这里插入图片描述

(2)显示部门号为10的部门名,员工名和工资

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

在这里插入图片描述

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

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

在这里插入图片描述

四、自连接

1、什么是自连接

自连接是指同一张表进行连接查询,即自己和自己做笛卡尔积运算。

2、自连接示例

显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno)

(1)方法一:单表查询:

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

在这里插入图片描述

(2)方法二:多表查询:

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

这里用到了给表起别名的方式。
在这里插入图片描述

五、子查询

1、什么是子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。其实我们刚刚在介绍自连接的时候, 示例中所用到的第一个方法就是子查询。

2、单行子查询

示例

显示SMITH同一部门的员工

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

在这里插入图片描述

3、多行子查询

多行子查询即:返回多行记录的子查询。

(1)in关键字

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

select ename, job, sal, deptno from emp where job in (select job from emp where deptno = 10) and deptno != 10;

在这里插入图片描述

(2)all关键字

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

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

在这里插入图片描述

(3)any关键字

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

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

在这里插入图片描述

4、多列子查询

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

(1)示例

查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人。

select * from emp where (deptno, job) = (select deptno, job from emp where ename = 'SMITH') and ename != 'SMITH';

在这里插入图片描述

5、在from子句中使用子查询

(1)查询结果作为一张临时表

通过前面的例子,我们发现每次我们执行一个语句后,都会出现一个新的表。那么我们就可以把这个表当作一个临时表作为后续的查询需要。

(2)示例

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

我们先查询一下各个部门的平均工资。形式如下图所示:
在这里插入图片描述
现在我们将这个表作为新的表,并且给这个表起名为tmp。接下来就可以按照多表查询的方式去完成我们的题目了。

select ename, emp.deptno, sal, asal from emp,(select deptno, avg(sal) asal  from emp group by deptno)o) tmp where emp.deptno = tmp.deptno and sal > asal;

在这里插入图片描述

查找每个部门工资最高的人的姓名、工资、部门、最高工资

select ename, sal, emp.deptno, msal from emp,(select deptno, max(sal) msal from emp group by deptno)) tmp where emp.deptno = tmp.deptno and emp.sal = msal;

在这里插入图片描述

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

6、合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。

(1)union

作用

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

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

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

在这里插入图片描述

(2)union all

作用

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

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

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

在这里插入图片描述

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

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

相关文章

力扣热门100题之缺失的第一个正数【困难】

题目描述 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1…

Linux学习之while循环和until循环

while while的格式如下&#xff1a; while 条件表达式 do指令集 done若是条件表达式为真&#xff0c;那么才能执行do和done之间的指令集。若是第一次都不符合条件&#xff0c;就不会执行指令集。每次循环都会判断条件表达式&#xff0c;只要不符合&#xff0c;就会退出循环。…

【前端学JAVA】java的基础语法

theme: cyanosis 作为一个前端程序员&#xff0c;其发展前途是远不及后端程序员的。因此&#xff0c;只有了解后端&#xff0c;才能让自己更加具备核心竞争力。本系列教程将以一个前端程序员的角度快速学习JAVA。 新建项目 开发JAVA程序&#xff0c;我们第一步是使用IDEA新建…

VAE-根据李宏毅视频总结的最通俗理解

1.VAE的直观理解 先简单了解一下自编码器&#xff0c;也就是常说的Auto-Encoder。Auto-Encoder包括一个编码器&#xff08;Encoder&#xff09;和一个解码器&#xff08;Decoder&#xff09;。其结构如下&#xff1a; 自编码器是一种先把输入数据压缩为某种编码, 后仅通过该编…

CMU 15-445 -- Timestamp Ordering Concurrency Control - 15

CMU 15-445 -- Timestamp Ordering Concurrency Control - 15 引言Basic T/OBasic T/O ReadsBasic T/O WritesBasic T/O - Example #1Basic T/O - Example #2 Basic T/O SummaryRecoverable Schedules Optimistic Concurrency Control (OCC)OCC - ExampleSERIAL VALIDATIONOCC …

Linux:ELK:日志分析系统(使用elasticsearch集群)

原理 1. 将日志进行集中化管理&#xff08;beats&#xff09; 2. 将日志格式化&#xff08;logstash&#xff09; 将其安装在那个上面就对那个进行监控 3. 对格式化后的数据进行索引和存储&#xff08;elasticsearch&#xff09; 4. 前端数据的展示&#xff08;kibana&…

【MySQL】基本查询(表的增删查改)

目录 一、插入操作 --- insert1.1 单行指定列插入&&单行全列插入1.2 多行指定列插入&&多行全列插入1.3 插入否则更新 duplicate key update1.4 删除并替换 replace 二、查询操作 --- select2.1 基本查询2.2 where条件2.3 案例演示2.4 排序&#xff08;order by…

HDFS异构存储详解

异构存储 HDFS异构存储类型什么是异构存储异构存储类型如何让HDFS知道集群中的数据存储目录是那种类型存储介质 块存储选择策略选择策略说明选择策略的命令 案例&#xff1a;冷热温数据异构存储对应步骤 HDFS内存存储策略支持-- LAZY PERSIST介绍执行使用 HDFS异构存储类型 冷…

【代码随想录day20】二叉搜索树的最小绝对差

题目 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 思路 最简单的一个思路是使用中序遍历&#xff0c;从二叉排序树中得到有序序列&#xff0c;存储到self.elem中&…

静态 链接

1、空间与地址的分配 现在的链接器空间分配的策略基本上都采用 “相似段合并” 的方式。通过将所有相同类型的 section 合并到一起&#xff0c;例如将所有输入目标文件的 .text 合并&#xff08;按顺序合并&#xff09;到输出文件的 .text 节中&#xff1b;然后&#xff0c;链接…

EasyExcel实现多sheet excel导出

EasyExcel简介 Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行&#xff0c;但是一旦并发上来后一定会OOM或 者JVM频繁的full gc。 EasyExcel是阿里巴巴开源的一个excel处理框架…

eNSP的安装【最全最详细教程】

目录 一、下载软件和插件二、VirtualBox安装步骤三、WinPcap安装步骤四、Wireshark安装步骤五、eNSP安装步骤六、eNSP测试安装eNSP可能失败的原因 一、下载软件和插件 在安装eNSP之前分别要下载三个插件&#xff1a;VirtualBox、WinPcap、Wireshark 下载软件链接&#xff1a;…

集成学习概述

集成学习 1. 集成学习概念 集成学习是解决有监督机器学习任务的一类方法,它的思路是基于多个学习算法的集成来提升预测结果,它通过多个模型的组合形成一个精度更高的模型,参与组合的模型成为弱学习器(基学习器)。训练时,使用训练集依次训练出这些弱学习器,对未知的样本…

PLC编程:关键在于模拟操作流程和实现控制

PLC编程的核心是通过程序描述流程&#xff0c;完成控制过程。因此&#xff0c;掌握PLC编程语言和基本功能实现是必要的。 PLC语言主要分为梯形图、语句和功能图。梯形图适合基本逻辑描述&#xff0c;语句表用于数据处理&#xff0c;相对较难理解。步进式功能图的状态函数描述很…

[NLP]LLaMA与LLamMA2解读

摘要 Meta最近提出了LLaMA(开放和高效的基础语言模型)模型参数包括从7B到65B等多个版本。最值得注意的是&#xff0c;LLaMA-13B的性能优于GPT-3&#xff0c;而体积却小了10倍以上&#xff0c;LLaMA-65B与Chinchilla-70B和PaLM-540B具有竞争性。 一、引言 一般而言&#xff0…

IT 资产管理功能

ServiceDesk Plus 支持ITIL流程&#xff0c;帮助管理员制定明智的业务决策&#xff0c;在整个生命周期中跟踪所有资产的硬件和软件。 ServiceDesk Plus 中的资产管理模块包含多种功能&#xff0c;例如&#xff1a;多种扫描资产的方法&#xff1b;基于代理和无代理的方法&#…

新老联手,火花四溅?大众汽车与小鹏汽车达成长期合作框架协议

7 月 26 日资讯&#xff0c;大众汽车宣布与小鹏汽车达成长期合作框架协议&#xff0c;并在官网中正式宣布&#xff0c;大众是老牌油车领军代表&#xff0c;小鹏则是新势力中的佼佼者&#xff0c;新老强强联手&#xff0c;又会碰撞出怎样的火花呢&#xff1f; 现阶段大众计划与…

凭借一份深入解析 Java 虚拟机 HotSpot 手册,让我卷成美团架构师

前言 Java 语言已经走过了 20 多个年头&#xff0c;在此期间虽然新语言层出不穷&#xff0c;但是都没有撼动 Java 的位置。可能是历史选择了 Java&#xff0c;也可能是 Java 改变了历史&#xff0c;总之&#xff0c;Java 无疑是一门成功的编程语言。这门语言之所以能如此成功&…

MODBUS RTU转 EtherNet/IP 网关连接森兰变频器与欧姆龙系统通讯配置案例

捷米特JM-EIP-RTU&#xff08;Modbus转Ethernet/Ip&#xff09;网关&#xff0c;用于将多个 MODBUS 从站设备接入 ETHERNET/IP 主站网络&#xff0c;实现 MODBUS 转 ETHERNET/IP 功能。配上 捷米特JM-EIP-RTU网关专用的 EDS 文件,实现 ETHERNET/IP 主 站对 MODBUS 从站设备的控…

Java多线程锁

多线程锁 本专栏学习内容又是来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 Synchronized Synchronized是Java中锁的一种实现方法&#xff0c;我们需要了解他锁在什么地方&#xff0c;锁的类型有哪些 阿里巴巴开发手册规定&#xff1a; 高并发时&#xff0c;同…