• MySQL 关联子查询


    MySQL 关联子查询

    关联子查询是指一个包含对表的引用的子查询,该表也显示在外部查询中。通俗一点来讲,就是子查询引用到了主查询的数据数据。

    以一个实际的例子来理解关联子查询:

    article 文章表:
    aidtitlecontentuid
    1 文章1 文章1正文内容... 1
    2 文章2 文章2正文内容... 1
    3 文章3 文章3正文内容... 2
    4 文章4 文章4正文内容... 4
    user 用户表:
    uidusernameemail
    1 admin admin@5idev.com
    2 小明 xiao@163.com
    3 Jack jack@gmail.com

    我们要查出 article 表中的数据,但要求 article 中的某个或某些字段与 user 表字段有逻辑关系(本例为 uid 相等)。SQL 语句如下:

    SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE article.uid = user.uid)
    

    返回查询结果如下:

    aidtitlecontentuid
    1 文章1 文章1正文内容... 1
    2 文章2 文章2正文内容... 1
    3 文章3 文章3正文内容... 2

    将该例 SQL 与如下语句比较更能看出关联子查询与普通子查询的区别:

    SELECT * FROM article WHERE uid IN(SELECT uid FROM user)
    

    在本实例中,虽然两个 SQL 执行后的返回结果都一样,但它们的实现过程是完全不一样的。后者(普通子查询)实际被执行为:

    SELECT * FROM article WHERE uid IN(1,2,3)
    

    但在关联子查询中,是无法单独执行子查询语句的。其实际流程大致为:

    1. 先做外部主查询;
    2. 将主查询的值传入子查询并执行;
    3. 子查询再将查询结果返回主查询,主查询根据返回结果完成最终的查询。

    这个执行流程类似于 EXISTS 子查询,实际上某些情况下 MySQL 就是将关联子查询重写为 EXISTS 子查询来执行的。

    MySQL 关联子查询效率

    很明显,一般情况下关联子查询的效率是比较低下的,实际上本例中的关联子查询例子也仅是为了演示关联子查询的原理及用法。如果可以的话,关联子查询尽量使用 JOIN 或其他查询来代替。如本例中,使用 INNER JOIN 来替换的 SQL 为:

    SELECT article.* FROM article INNER JOIN user ON article.uid = user.uid
    

    注意:此处只是为了演示用 INNER JOIN 替换关联子查询的样例,并非表名这种处理是最优处理。

  • 相关阅读:
    JDK的KeyTool和KeyStore等加密相关
    关于分布式事务的随笔[待续]
    Netty实例几则
    Disruptor快速入门
    Java获取系统环境信息
    JDK的BIO, NIO, AIO
    四种常用IO模型
    JDK的多线程与并发库
    递归转换为迭代的一种通用方式
    二叉树的java实现
  • 原文地址:https://www.cnblogs.com/txd66/p/3269401.html
Copyright © 2020-2023  润新知