神奇的 SQL 之 子查询 → 细节拉满,快来看看 开心一刻 老婆今天发了个朋友圈写道:我家老公昨天和别人家的老婆出去旅游,迄今未归,我则被别人家的老公折腾了一天,好累哦! 圈子下面,评论无数,各种吃瓜群众等着吃瓜 好多朋友我说:你和你老婆怎么了,你快看看你老婆朋友圈 我赶紧在下面评论到:能不能好好说话,我只不过陪女儿去毕业旅游行,而你负责在家留守,照顾三岁儿子,要不要写的这么刺激? 我还补充了一句:你是不是有点虎?
子查询 讲子查询之前,我们先来看看视图,何谓视图 ? 视图是基于 SQL 语句的结果集的可视化的表,包含行和列,就像一个真实的表,但只是一张虚拟表,我们可以将其视作为一张普通的表 视图只供数据查询,不能进行数据更改,也不能保存数据,查询数据来源于我们的实体表 说的简单点,视图就是复杂 SELECT 语句的一个代号,为查询提供便利 视图总是显示最近的数据,每当我们查询视图时,数据库引擎通过使用 SQL 语句来重建数据 回到子查询,那何谓子查询,它与视图又有何关系 ? 视图是持久化的 SELECT 语句,而子查询就是将定义视图的 SELECT 语句直接用于 FROM 子句当中,它是个一次性的视图,在 SELECT 语句执行完之后就会消失 这么类比,你们是不是没想过,这是不是一个细节?
光说概念,可能还是不太好理解,我们来看下视图与子查询的具体示例,通过示例我们就能更好的理解了 假设我们有如下表 以及如下 3 个视图
也可以用 子查询 来实现,写法如下 注意 SQL 的执行顺序,子查询 作为内层查询会首先执行 原则上 子查询 必须设定名称,所以我们尽量从处理内容的角度出发为子查询设定一个恰当的名称 通过这个案例,对上面 视图 与 子查询 的类比,是不是理解了? 我们回到 t_customer_credit,大家有没有觉得眼熟? 在 神奇的 SQL 之 CASE 表达式 → 这么妖娆,不来看看吗 出现过的啦,这是不是也算个细节?
普通子查询 上面讲到的 子查询 就是 普通子查询,非要给个定义的话,就是返回多行结果的子查询 这个在实际应用中还是用的非常多的,相信大家都比较熟悉,不做过多的说明,只简单举个例子 假设我们有商品表:t_commodity 现在我们要实现如下需求: SQL 该如何写? 针对 统计出各个类别下商品的数量,最优解往往是 GROUP BY,而非 子查询 这算个失败案例,不算一个细节,大家就别记了
标量子查询 普通子查询 一般是返回多行结果(偶尔也会只返回 1 行,有时也会查不到结果) 当返回结果是 1行1列 时,该 子查询 被称作 标量子查询 标量子查询有个特殊的限制,必须而且只能返回 1行1列 的结果 说的简单点:标量子查询 就是返回单一值的 子查询 由于返回值是单一值,所以 标量子查询 可以用在 = 或 < > 这样需要单一值的比较运算符之中,这也正是其优势所在 我们来看一些简单的例子,还是以 t_commodity 为例,如何实现如下需求 高于平均出售单价 查询出售单价高于平均出售单价的商品,该 SQL 该如何写? 第一反应,是不是会这么写 你去执行下,会发现这个 SQL 执行报错,因为 WHERE 子句中不能使用 聚合函数 那该怎么写? 此时 标量子查询 就派上用场了 平均出售单价 & 平均进货单价 查询所有商品信息,并在每个商品的信息中加入 平均出售单价 和 平均进货单价 这个比较简单,相信大家都会 类别平均出售单价高于全部平均出售单价 按照商品类别分类,查询出平均出售单价高于全部商品的平均出售单价的商品类别(类别名、类别平均出售单价) 我们先拆分下需求 以类别进行分组 各个类别的平均出售价格 全部商品的平均出售价格 比较平均出售价格,过滤出满足条件的类别与平均出售价格 SQL 实现如下 这么实现,是不是没想到,这算不算一个细节?
关联子查询 关联子查询 是指一个包含对表的引用的 子查询,该表也显示在外部查询中 通俗一点来讲,就是 子查询 引用到了 主查询 的数据 在 关联子查询 中,对于 外部查询 返回的每一行数据,内部查询 都要执行一次 另外,在 关联子查询 中的信息流是双向的,外部查询 的每行数据传递一个值给 子查询,然后 子查询 为每一行数据执行一次并返回它的记录,然后 外部查询 根据返回的记录做出决策 光看概念,晦涩难懂,我们结合具体的例子来看 关联子查询 还是以商品表 t_commodity 为例,如何选取出各商品类别中高于该类别平均出售价格的商品 可能大家还没明白这个需求,那么我们具体点 所有商品的类别、出售价格如下
各类别及类别平均出售价格很容易得到吧,如下所示
要从各个类别中找出出售价格高于对应类别平均出售价格的商品
问:SQL 该如何写? 如上写法是肯定不行的,执行会报错 正确的写法是要用到 关联子查询 的
这是不是不会了,算不算一个细节?
子查询 中的 WHERE 子句(WHERE t1.category = t2.category) 至关重要,它的作用是在同一商品类别中对各商品的出售单价与平均单价进行比较 在对表中某一部分记录的集合进行比较时,就可以使用 关联子查询,当出现 限定 或 限制 这样的词汇时,通常会使用 关联子查询 在 关联子查询 中,对于外部查询返回的每一行数据,内部查询都要执行一次,DBMS 内部的执行结果类似如下
总结 SQL 逻辑执行顺序 子查询 书写位置 子查询 可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中,同 = < > >= <= IN BETWEEN 等运算符一起使用,使用起来非常灵活 标量子查询 出现的位置就更灵活了,并不仅仅局限于 WHERE 子句中,通常任何可以使用单一值的位置都可以使用,SELECT 子句、GROUP BY 子句、HAVING 子句、ORDER BY 子句,也就是说,能够使用 常量 或者 列名 的地方,都可以使用 标量子查询 子查询 效率问题 子查询 的效率一直都是一个比较头疼的问题,加合适的索引能改善效率,但也只是局限于很少的情况 如果数据量大,对性能要求又高,能不用 子查询 就尽量别用 子查询,尽量用其他的方式替代,很多情况下,子查询 可以用关联查询来替代 作者:青石路 链接:https://juejin.cn/post/
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/65307.html