• 〖Python 数据库开发实战 - MySQL篇㉒〗- 子查询的语法规则


    万叶集
    🎉 隐约雷鸣,阴霾天空。 🎉
    🎉 但盼风雨来,能留你在此。 🎉


    前言
    ✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我 🐶哈士奇🐶 ,一位致力于 TFS - 全栈 赋能的博主 ✌
    🏆 CSDN博客专家认证、新星计划第三季全栈赛道 MVP 、华为云享专家、阿里云专家博主 🏆
    📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
    💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬
    🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦


    专栏系列(点击解锁)学习路线(点击解锁)知识定位
    🔥Python全栈白皮书🔥 零基础入门篇 以浅显易懂的方式轻松入门,让你彻底爱上Python的魅力。
    语法进阶篇 主要围绕多线程编程、正则表达式学习、含贴近实战的项目练习 。
    自动化办公篇 实现日常办公软件的自动化操作,节省时间、提高办公效率。
    自动化测试实战篇 从实战的角度出发,先人一步,快速转型测试开发工程师。
    数据库开发实战篇 掌握关系型与非关系数据库知识,提升数据库实战开发能力。
    爬虫入门与实战 更新中
    数据分析篇 更新中
    前端入门+flask 全栈篇 更新中
    django+vue全栈篇 更新中
    拓展-人工智能入门 更新中
    网络安全之路 踩坑篇 记录学习及演练过程中遇到的坑,便于后来居上者
    网安知识扫盲篇 三天打鱼,不深入了解原理,只会让你成为脚本小子。
    vulhub靶场漏洞复现 让漏洞复现变得简单,让安全研究者更加专注于漏洞原理本身。
    shell编程篇 不涉及linux基础,最终案例会偏向于安全加固方向。 [待完结]
    WEB漏洞攻防篇 2021年9月3日停止更新,转战先知社区等安全社区及小密圈
    渗透工具使用集锦 2021年9月3日停止更新,转战先知社区等安全社区及小密圈
    点点点工程师 测试神器 - Charles 软件测试数据包抓包分析神器
    测试神器 - Fiddler 一文学会 fiddle ,学不会倒立吃翔,稀得!
    测试神器 - Jmeter 不仅是性能测试神器,更可用于搭建轻量级接口自动化测试框架。
    RobotFrameWork Python实现的自动化测试利器,该篇章仅介绍UI自动化部分。
    Java实现UI自动化 文档写于2016年,Java实现的UI自动化,仍有借鉴意义。
    MonkeyRunner 该工具目前的应用场景已不多,文档已删,为了排版好看才留着。

    在这里插入图片描述


    子查询是在查询语句里面再嵌套一个查询,这是因为我们在提取数据的时候有很多不知道的数据产生了依赖关系。此时我们就需要先查询一组数据的结果集,然后将这个结果集作用为下一个查询的对象。在 “表连接的章节”,我们曾说过子查询的效率低下的问题,其实并不是所有的子查询效率都是低下的,“WHERE” 子查询在匹配记录的时候要反复执行,这是不推荐使用的;但是如果将查询结果集当做一张表来使用,与其他的表做一个连接,这就是 “FROM” 子句的子查询了,这种子查询的方式,还是比较推荐使用的。

    详细的说,子查询分为 “单行子查询”、“多行子查询”、"WHERE"子查询、“FROM” 子查询 和 “SELECT” 子查询;这些都是该章节我们需要学习的内容。



    🐳 子查询简介


    • 子查询是一种查询语句中再嵌套一个查询的语句
    • 普通查询语句分为 “SELECT” 子查询、“FROM” 子查询、“WHERE"子查询;(重点推荐使用 " ‘FROM’ 子查询”)

    子查询示例如下:

    查询底薪超过公司平均底薪的员工信息。(之前我们使用过表连接的方式做个这个案例,这里来看一下如何通过子查询的方式来实现。)

    SELECT
    	empno, ename, sal
    FROM 
    	t_emp
    WHERE
    	sal >= (SELECT AVG(sal) FROM t_emp);
    	
    -- 正常情况下,将聚合函数作为 WHERE 子句的条件是不可以的,但是这里利用子查询与聚合函数先将平均底薪查询出来,这就变成具体的数据了
    -- 这种情况下,作为 WHERE 子句的条件,就可以被使用了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    以上就是 WHERE 子句的子查询,不过 WHERE 子句的子查询使不推荐使用的,应该使用表连接的写法。



    🐬 WHERE 子查询


    • 在书写 SQL 语句的时候, WHERE 子查询最符合我们人的思考逻辑
    • 虽然这种 子查询 最简单、最容易理解,但是却是效率很低的子查询

    以刚刚演示的 查询底薪超过公司平均底薪的员工信息 来说吧。“WHERE” 子句拿每一条员工的记录与 “SELECT” 子查询做比较的时候,子查询都需要重新执行一次。如果员工表有 10000 条记录,那么 子查询 就需要执行 10000次,反复执行这么多次,效率上是极其低下的。

    在查询语句中,反复被查询的子查询被称为 “相关子查询”,这里的 “WHERE” 子查询就属于 “相关子查询” 应该避免使用这种子查询。



    🐬 FROM 子查询


    • 在查询语句中, “FROM” 子查询只会执行一次,这与 “WHERE” 子查询是相反的,所以查询效率很高。

    同样以 查询底薪超过公司平均底薪的员工信息 为例,来看一看 “FROM” 子查询是如何实现的。

    SELECT
    	e.empno, e.ename, e.sal, t.avg
    FROM t_emp e 
    JOIN (SELECT deptno, AVG(sal) AS avg FROM t_emp GROUP BY deptno) t
    ON e.deptno = t.deptno 
    AND e.sal >= t.avg;
    
    -- 首先,按照每一个部门编号去分组,然后统计部门标号与该部门对应的平均月薪。将这个结果集作为一张临时的表与员工的表做连接。
    -- 连接的条件为 "员工表" 的 "部门编号" = "结果集" 的 "部门编号",并且员工的月薪大于部门的平均月薪
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    所以这个题目利用 "FROM" 子查询也可以轻松的实现,未必要使用 "WHERE" 子查询。因为 "FROM" 子查询并不是 相关子查询,所以再解决一些问题的时候应该有限选择这种子查询类型。



    🐬 SELECT 子查询


    • 说一句实在的,这种子查询在我目前经历的所有项目中,一次也没见到过。
    • 究其原因呢,是因为 “SELECT” 子查询也是相关子查询,它在SQL语句中也会反复的执行,查询效率很低。

    这里我们就举个例子:比如说现在要查询每个员工的部门信息,

    SELECT
    	e.empno,
    	e.ename,
    	(SELECT dname FROM t_dept WHERE deptno = e.deptno) AS 部门名称
    FROM t_emp e;
    
    -- 先试用 "SELECT" 子查询查询出 "部门表" 中的部门名称,约束条件为 "部门表"中的 "部门编号" 与 "员工表"中的 "部门编号" 一致
    -- 将 "SELECT" 子查询得到的 "部门名称" 作为SQL语句中的一个字段进行输出
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    虽然执行出来的结果是对的,但是执行的效率实在是太低了,所以这种 "SELECT" 子查询的方式也是不推荐使用的,了解即可,当我们看到有其他人使用 "SELECT" 子查询的时候,最好善意的提醒一下。



  • 相关阅读:
    【C++】类和对象(下)
    分省/市/县最低工资标准(2012-2021年)和 全国/省/市/县GDP数据(1949-2020年)
    Spring 概述
    防止雪崩问题
    FreeSql 将 Saas 租户方案精简到极致[.NET ORM SAAS]
    使用 Python Timedelta 月份计算日期
    基于Python3.6配置开发环境
    sqlmap使用教程
    EasyRecovery2024破解版激活码
    【系统架构设计师】一、计算机系统基础知识(指令系统|存储系统|输入输出技术|总线结构)
  • 原文地址:https://blog.csdn.net/weixin_42250835/article/details/126151051