【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.xdnf.cn/news/1554769.html

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

相关文章

MongoDB-aggregate流式计算:带条件的关联查询使用案例分析

在数据库的查询中,是一定会遇到表关联查询的。当两张大表关联时,时常会遇到性能和资源问题。这篇文章就是用一个例子来分享MongoDB带条件的关联查询发挥的作用。 假设工作环境中有两张MongoDB集合:SC_DATA(学生基本信息集合&…

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言,广泛应用于多个领域。Java的编程思想,包括面向过程和面向对象编程,Java的发展历史,各版本的特点,JVM原理,数据类型,Java SE与Java EE的区别,应用场景&…

Colorize: 0 variables Colorize is not activated for this file. VsCode

问题情况 解决步骤 1.找到setting.json文件 2.输入以下代码,保存setting.json文件 "colorize.languages": ["css", "javascript", "sass", "less", "postcss", "stylus", "xml"…

小程序 uniapp+Android+hbuilderx体育场地预约管理系统的设计与实现

目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户 注册…

2024年7月大众点评全国酒吧前百名城市分析

在做一些城市分析、学术研究分析、商业选址、商业布局分析等数据分析挖掘时,大众点评的数据参考价值非常大,截至2024年7月,大众点评美食店铺剔除了暂停营业、停止营业后的最新数据情况分析如下。 分析研究的字段维度包括大众点评数字id、字母…

DMA 正点原子版

就是介绍一下dma,只能内存到外设,外设到内存,内存到内存,不能外设到外设这样进行数据传输 这个是 可以看这个表来查,哪个dma的哪个通道用来传输什么数据,这个是芯片固定好的,只能看表查&#xf…

汉代儒家对道家《老子》修改为儒家《道德经》

汉代儒家对道家《老子》修改为儒家《道德经》 汉代对《老子》文本的改造和诠释。在汉代,由于政治、社会和文化背景的变化,许多先秦典籍,包括《老子》,都经历了不同程度的修改和重新解释。这些改造不仅反映了当时的思想潮流&#…

grep的使用

cat .\test.log |grep 1 cat .\test.log |grep [23] cat .\test.log |grep [123\|124] cat .\test.log |grep 123\|124 cat .\test.log |grep -e 2.*d

IPS和IDS有啥区别

在网络安全领域,入侵检测系统 (IDS) 和入侵防御系统 (IPS) 是两种关键的技术,旨在保护网络免受各种威胁。这两者尽管名字相似,但在功能、配置、以及应用场景等方面都有着显著的差异。 入侵检测系统 (IDS) IDS 是一种被动监控系统&#xff0c…

【Android】自定义控件

本文介绍App开发经常涉及的自定义控件相关技术,主要包括自定义视图的过程与步骤、自定义动画的原理与实现、自定义对话框的概念与示例、自定义通知栏的用法与定制,另外介绍四大组件之一的服务Service的生命周期与启停方式。 自定义视图 自定义视图的编…

【AIGC】VoiceControl for ChatGPT指南:轻松开启ChatGPT语音对话模式

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯安装VoiceControl for ChatGPT插件💯如何使用VoiceControl for ChatGPT进行语音输入VoiceControl for ChatGPT快捷键注意点 💯VoiceControl for C…

毕业设计_基于springboot+layui+mybatisPlus的中小型仓库物流管理系统源码+SQL+教程+可运行】41004

毕业设计_基于springbootlayuimybatisPlus的中小型仓库物流管理系统源码SQL教程可运行】41004 下载地址: https://download.csdn.net/download/qq_24428851/89843203 技术栈 后端:springboot、mybatis-plus、shiro 前端:layUI 存储&…

贴吧软件怎么切换ip

在网络使用中,有时我们需要切换IP地址来满足特定的需求,比如需要切换贴吧软件IP以进行不同的操作。本文将介绍几种贴吧切换IP地址的方法,帮助用户更好地管理自己的网络身份和访问权限。 1、更换网络环境‌ 通过连接到不同的Wi-Fi网络或使用移…

15分钟学 Python 第37天 :Python 爬虫入门(三)

Day 38 : Python爬虫入门大纲 章节1:Python爬虫概述 1.1 什么是爬虫? 网页爬虫(Web Crawler)是一种自动访问互联网上网页并提取数据的程序。爬虫的作用包括搜索引擎索引内容、市场调查、数据分析等。 1.2 爬虫的工作原理 发起…

1c语言基础

1.关键字 一、数据类型关键字 A基本数据类型(5个) void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果char:字符型类型数据,属于整型数据的一种int:整型数据&#x…

[SAP ABAP] 数据元素添加参数ID(Parameter ID)

学生表(ZDBT_STU_437) 示例:为学生表ZDBT_STU_437中的数据元素ZDE_STUID_437创建Parameter ID 1.使用事务码SM30维护TPARA表 新建参数ID并输入简短描述 点击保存按钮,选择指定的包即可生成参数ID 2.参数ID和数据元素绑定 使用SE11对学生表(ZDBT_STU_…

自动驾驶系列—颠覆未来驾驶:深入解析自动驾驶线控转向系统技术

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

终于知道神秘的蓝莓真身了

黑森林实验室(Black Forest Labs,简称 BFL)是一家初创公司,由流行的 Stable Diffusion AI 图像生成模型的创建者创立,该模型是许多 AI 图像生成应用程序和服务(如 Midjourney)的基础。 这意味着…

模拟实现string

1.代码理解 1.substr 断言指定的位置在字符的长度之内,_size-len是剩余字符的长度(pos后面的),如果输入len是大于pos后面的字符长度则默认为pos后面全部的字符去拷贝,再建立一个sub去储存,通过循环把pos后面的字符接收到sub里面。 string …

新闻推荐系统:Spring Boot的创新应用

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…