学习MySQL第七天

 夕阳无限好           

            只是近黄昏

一、子查询

        1.1 定义

        将一个查询语句嵌套到另一个查询语句内部的查询

        我们通过具体示例来进行演示,这一篇博客更侧重于通过具体的小问题来引导大家独立思考,然后熟悉子查询相关的知识点

        1.2 问题1

        谁的工资比Tom高

方式1:
SELECT name,salary
FROM employees
WHERE name='Tom'SELECT NAME,salary
FROM employees
WHERE salary > 500方式2:自连接
SELECT t2.NAME,t2.salary
from employees t1,employees t2
WHERE t2.salary > t1.salary  AND 
t1.name = 'Tom'方式3:子查询
# 外部
SELECT name,salary
FROM employees
WHERE salary > (
# 内部SELECT salary FROM employeesWHERE name ='Tom'
)

        1.3 称谓的规范

        (1) 外查询(主查询)、内查询(子查询) 
        (2) 子查询(内查询)在主查询之前一次执行完成
        (3) 子查询的结果被主查询(外查询)使用

        1.4 注意事项

        (1) 子查询要包含在括号内
        (2) 将子查询放在比较条件的右侧,提高可读性
        (3) 单行操作符对应单行子查询,多行操作符对应多行子查询

        1.5 子查询分类

        1.单行子查询和多行子查询
        子查询部分只返回一个值供使用,就比如C语言中副函数每次return只返回一个值,这种情况叫做单行子查询
        2.根据内查询是否被执行多次
        分为相关子查询和不相关子查询
        不相关子查询:子查询固定返回的值不受外部的影响

二、单行子查询

        2.1 单行操作符: = > < >= <=> !=
        2.2 练习1:查询工资大于id为3的员工工资的员工信息
SELECT id,name,salary
from employees
WHERE salary > (SELECT salaryFROM employeesWHERE id=3
)

        2.3 练习2:返回top_id与id=3相同的员工的工资比他多的 name、id
SELECT name,id,salary
FROM employees
WHERE top_id = (SELECT top_idFROM employeesWHERE id = 3
) 
AND salary > (SELECT salaryFROM employeesWHERE id =3
)

        2.4 练习3:返回公司里面工资最少的人的信息,包含name、id、top_id、salary
SELECT name,id,top_id,salary
FROM employees
WHERE salary = (SELECT MIN(salary)FROM employees
)

        2.5 问题4:查询最低工资大于top_id为1的部门的最低工资的部门top_id和最低工资
SELECT top_id,MIN(salary)
FROM employees
GROUP BY top_id
HAVING MIN(salary) > (SELECT MIN(salary)FROM employeesWHERE top_id = 1
)

三、多行子查询

        3.1 引言

        与单行查询不同的是,内查询返回多行,也就是多个值,你用一个可以选择其中的一个作为你的选择,你也可以全部都接收,但需要用同等数量的字段来接受

        3.2 命令语句

        (1) IN 等于列表中的任意一个
        (2) ANY 只选一个
        (3) SOME ANY的别名和ANY作用一样
        (4) ALL 全部选择

        3.3 练习: 这里演示一个 IN
# 查找工资等于各个top_id中最低工资的人员姓名
SELECT name,salary
FROM employees
WHERE salary IN (SELECT MIN(salary)FROM employeesGROUP BY top_id
)

        3.4 练习: 这里演示ALL
按照top_id进行分组,求平均工资最小的那一组
SELECT top_id,AVG(salary)
FROM employees
GROUP BY top_id
HAVING avg(salary)<=ALL(# 小于所有部门的最小值就相当于值最小的那个组SELECT AVG(salary)FROM employeesGROUP BY top_id 					
)

        3.5 注意

        这里我们要特别注意下空值问题,下面的题目中,我们的department_id中包含一个空值,当我们对其内查询时,就会出现错误,此时我们可以通过加注判断条件来避免

        报错演示

# 查询已经分配好部门的员工信息
# 示例
SELECT name,department_id
FROM employees
WHERE department_id NOT IN (SELECT department_idFROM employees
)

四、相关子查询

        4.1 引入

        在这里,我们采用具体练习的方法来带领大家一步一步的深入了解什么是相关子查询

        4.2 练习1:查询员工中工资大于本部门平均工资的员工的name,salary

        我们先从查询员工中工资大于本公司平均工资的员工的name,salary 开始,方便大家进行对比发现

# 查询员工中工资大于本公司平均工资的员工的name,salary
SELECT name,salary
FROM employees
WHERE salary > (SELECT AVG(salary)FROM employees
)

 

        然后我们用两步逐步去对比发现相关子查询特点

# 方式1:
SELECT name,salary,top_id
FROM employees t1
WHERE salary > (SELECT AVG(salary)FROM employees t2WHERE top_id = t1.top_id
)

        这里是利用查询过程中,是一条一条进行的特点,通过自连接的方式,建立类似于for循环的方式,动态更新AVG(salary),实现分部门、逐员工检查

# 方式2
SELECT e.name,e.salary
FROM employees e,(# 在此中的查询以一张表对的形式返回,定义别名为 t,同时后面比较时需要用AVG(salary),但是出了这个括号,AVG(salary)就将作为一个列名出现,但是不能被原样调用,所以取一个别名 avg。SELECT top_id,AVG(salary) avgFROM employeesGROUP BY top_id) t
WHERE e.top_id = t.top_id
AND e.salary > t.avg

        4.3 练习2
# 查询员工的id,salary,按照departments中的manger_id进行排序
SELECT id,salary
FROM employees 
ORDER BY (SELECT mange_idFROM departmentsWHERE employees.department_id=departments.department_id
)

        在上面命令基础上,展示更多的信息

SELECT id,salary,name,(SELECT nameFROM departmentsWHERE employees.department_id=departments.department_id
) 'names',(SELECT mange_idFROM departmentsWHERE employees.department_id=departments.department_id
) 'mange_id'
FROM employees 
ORDER BY (SELECT mange_idFROM departmentsWHERE employees.department_id=departments.department_id
)

        4.4 小结论

        在 SELECT中,除了 LIMIT 和 GROUP BY中,其他位置都可以声明子查询

        4.5 EXISTS / NOT EXISTS
# 查询公司所有管理者的信息
SELECT DISTINCT t1.name, t1.top_id, t1.id
FROM employees t1,employees t2
WHERE t1.id = t2.top_id

        (1) EXISTS首先执行外层查询,再执行内层查询‌

        (2) 取出外层表中的第一行数据,代入子查询中执行

        (3) 如果子查询返回结果,则保留该行(对于EXISTS)或排除该行(对于NOT EXISTS)

        (4) 接着处理外层表中的下一行,重复上述过程‌

五、结语

        山不在高,有仙则名;水不在深,有龙则灵。希望我们都可以通过自己的努力成为那个关键的要素

须知少日拏云志,曾许人间第一流。我们还年轻,我们还有无限可能!

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

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

相关文章

Nginx 常见面试题

一、nginx常见错误及处理方法 1.1 404 bad request 一般原因&#xff1a;请求的Header过大 解决办法&#xff1a; 配置nginx.conf 相关设置1. client_header_buffer_size 16k; 2. large_client_header_buffers 4 64k;1.2 413 Request Entity Too Large 一般原因&#xff1…

LeetCode 每日一题 2025/3/31-2025/4/6

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/31 2278. 字母在字符串中的百分比4/1 2140. 解决智力问题4/2 2873. 有序三元组中的最大值 I4/3 2874. 有序三元组中的最大值 II4/4 1123. 最深叶节点的最近公共祖先4/5 1…

Docker Compose 常用命令 运行 docker-compose.yaml

Docker Compose 中有两个重要的概念 服务 (service)&#xff1a;一个应用的容器&#xff0c;实际上可以包括若干运行相同镜像的容器实例。 项目 (project)&#xff1a;由一组关联的应用容器组成的一个完整业务单元&#xff0c;在 docker-compose.yml 文件中定义。 为了更方便…

深度学习中的 Batch 机制:从理论到实践的全方位解析

一、Batch 的起源与核心概念 1.1 批量的中文译名解析 Batch 在深度学习领域标准翻译为"批量"或"批次"&#xff0c;指代一次性输入神经网络进行处理的样本集合。这一概念源自统计学中的批量处理思想&#xff0c;在计算机视觉先驱者Yann LeCun于1989年提出…

Unity Internal-ScreenSpaceShadows 分析

一、代码结构 // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "Hidden/Internal-ScreenSpaceShadows" {Properties {_ShadowMapTexture ("", any) "" {} // 阴影贴图纹理&…

Token+JWT+Redis 实现鉴权机制

TokenJWTRedis 实现鉴权机制 使用 Token、JWT 和 Redis 来实现鉴权机制是一种常见的做法&#xff0c;尤其适用于分布式应用或微服务架构。下面是一个大致的实现思路&#xff1a; 1. Token 和 JWT 概述 Token&#xff1a;通常是一个唯一的字符串&#xff0c;可以用来标识用户…

RPC与其他通信技术的区别,以及RPC的底层原理

1、什么是 RPC&#xff1f; 远程过程调用&#xff08;RPC&#xff09; 是一种协议&#xff0c;它允许程序在不同计算机之间进行通信&#xff0c;让开发者可以像调用本地函数一样发起远程请求。 通过 RPC&#xff0c;开发者无需关注底层网络细节&#xff0c;能够更专注于业务逻…

简洁的 PlantUML 入门教程

评论中太多朋友在问&#xff0c;我的文章中图例如何完成的。 我一直用plantUML,也推荐大家用&#xff0c;下面给出一个简洁的PlantUML教程。 &#x1f331; 什么是 PlantUML&#xff1f; PlantUML 是一个用纯文本语言画图的工具&#xff0c;支持流程图、时序图、用例图、类图、…

互联网三高-高性能之JVM调优

1 运行时数据区 JVM运行时数据区是Java虚拟机管理的内存核心模块&#xff0c;主要分为线程共享和线程私有两部分。 &#xff08;1&#xff09;线程私有 ① 程序计数器&#xff1a;存储当前线程执行字节码指令的地址&#xff0c;用于分支、循环、异常处理等流程控制‌ ② 虚拟机…

浅谈StarRocks 常见问题解析

StarRocks数据库作为高性能分布式分析数据库&#xff0c;其常见问题及解决方案涵盖环境部署、数据操作、系统稳定性、安全管控及生态集成五大核心领域&#xff0c;需确保Linux系统环境、依赖库及环境变量配置严格符合官方要求以避免节点启动失败&#xff0c;数据导入需遵循格式…

P1332 血色先锋队(BFS)

题目背景 巫妖王的天灾军团终于卷土重来&#xff0c;血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团&#xff0c;以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围&#xff0c;现在他们将主力只好聚集了起来&#xff0c;以抵…

大文件上传之断点续传实现方案与原理详解

一、实现原理 文件分块&#xff1a;将大文件切割为固定大小的块&#xff08;如5MB&#xff09; 进度记录&#xff1a;持久化存储已上传分块信息 续传能力&#xff1a;上传中断后根据记录继续上传未完成块 块校验机制&#xff1a;通过哈希值验证块完整性 合并策略&#xff1a;所…

【动手学深度学习】卷积神经网络(CNN)入门

【动手学深度学习】卷积神经网络&#xff08;CNN&#xff09;入门 1&#xff0c;卷积神经网络简介2&#xff0c;卷积层2.1&#xff0c;互相关运算原理2.2&#xff0c;互相关运算实现2.3&#xff0c;实现卷积层 3&#xff0c;卷积层的简单应用&#xff1a;边缘检测3.1&#xff0…

Opencv计算机视觉编程攻略-第十一节 三维重建

此处重点讨论在特定条件下&#xff0c;重建场景的三维结构和相机的三维姿态的一些应用实现。下面是完整投影公式最通用的表示方式。 在上述公式中&#xff0c;可以了解到&#xff0c;真实物体转为平面之后&#xff0c;s系数丢失了&#xff0c;因而无法会的三维坐标&#xff0c;…

大厂不再招测试?软件测试左移开发合理吗?

&#x1f449;目录 1 软件测试发展史 2 测试左移&#xff08;Testing shift left&#xff09; 3 测试右移&#xff08;Testing shift right&#xff09; 4 自动化测试 VS 测试自动化 5 来自 EX 测试的寄语 最近两年&#xff0c;互联网大厂的招聘中&#xff0c;测试工程师岗位似…

windows10下PointNet官方代码Pytorch实现

PointNet模型运行 1.下载源码并安装环境 GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/gh_mirrors/po/pointnet.pyto…

git pull 和 git fetch

关于 git pull 和 git fetch 的区别 1. git fetch 作用&#xff1a;从远程仓库获取最新的分支信息和提交记录&#xff0c;但不会自动合并或修改当前工作目录中的内容。特点&#xff1a; 它只是更新本地的远程分支引用&#xff08;例如 remotes/origin/suyuhan&#xff09;&am…

前端开发中的单引号(‘ ‘)、双引号( )和反引号( `)使用

前端开发中的单引号&#xff08;’ &#xff09;、双引号&#xff08;" "&#xff09;和反引号&#xff08; &#xff09;使用 在前端开发中&#xff0c;单引号&#xff08;’ &#xff09;、双引号&#xff08;" "&#xff09;和反引号&#xff08; &…

程序化广告行业(69/89):DMP与PCP系统核心功能剖析

程序化广告行业&#xff08;69/89&#xff09;&#xff1a;DMP与PCP系统核心功能剖析 在数字化营销浪潮中&#xff0c;程序化广告已成为企业精准触达目标受众的关键手段。作为行业探索者&#xff0c;我深知其中知识的繁杂与重要性。一直以来&#xff0c;都希望能和大家一同学习…

Amodal3R ,南洋理工推出的 3D 生成模型

Amodal3R 是一款先进的条件式 3D 生成模型&#xff0c;能够从部分可见的 2D 物体图像中推断并重建完整的 3D 结构与外观。该模型建立在基础的 3D 生成模型 TRELLIS 之上&#xff0c;通过引入掩码加权多头交叉注意力机制与遮挡感知注意力层&#xff0c;利用遮挡先验知识优化重建…