Mysql 温故知新系列「联表查询」

「这是我参与11月更文挑战的第 20 天,活动详情查看:2021最后一次更文挑战

在 mysql 的查询操作中,我们一般都是在一张表上做数据查询,但有的时候,又需要我们联合上多张表来做数据获取

image.png

举个例子,我们需要获取 a 表中的数据,但是需要限定 a 表中的外键字段 b_id 对应的关联记录中的状态为指定值。这个需求可以拆分为 2 个操作

  1. 先查询 b 中的记录数据,根据 status=1 过滤,拿到符合要求的 id
  2. 在 a 表中查询数据,使用 where 过滤,限定他的外键 b_id 必须在上一个操作的结果集中

像上述的操作可以合并为 1 条 sql,即我们可以吧第一步 sql 的结果,作为一个临时表,然后供第二步的 sql 使用

select *from a 
where 
b_id in (select id from b where status =`1)
复制代码

像上面的这种操作,准确的描述,应该叫表的嵌套查询。他将上一步查询得到的结果集,作为一个条件,供下一个表使用,但这种操作,限定返回的结果只有 a 的字段,不涉及到 b 的字段


现在,我们在返回 a 表的字段的时候,同时需要部分 b 表的数据,就需要联合表a,表b然后根据给定的条件,过滤得到结果集

SELECT
  a.*, b.*
FROM
  tableA a,
  (
    SELECT
      *
    FROM
      tableB
    WHERE
      STATUS = 0
  ) b
WHERE
  a.b_id = b.id
复制代码

像这种操作,其实就是 mysql 的内连接查询(inner join)

sql 的模式为:

selectfrom 之间,添加我们需要连接查询的表,在后面使用 where 条件来限定我们需求的结果,必备的条件就是多个表之间的连接判断,如上述的判断就是 a.b_id = b.id


以上一篇文章 # Mysql 温故知新系列「group by | having」 中提到的分组案例,我们拿到了重复的条码,但需要分析一下这些重复条码的记录都分布在哪些产线上

先统计重复的条码,获取到条码后,去匹配有哪些记录使用了这些条码,再对过滤得到的结果按照产线进行分组统计,整个逻辑非常清楚

现在我表演个仙术:

SELECT
  sparator_line,
  count(sparator_line) count
FROM
  rfid_info
WHERE
  id IN (
    SELECT
      id
    FROM
      rfid_info r,
      (
        SELECT
          product_time,
          COUNT(product_time) count
        FROM
          rfid_info
        GROUP BY
          product_time
        HAVING
          count > 1
      ) t
    WHERE
      r.product_time = t.product_time
  )
GROUP BY
  sparator_line
order by count desc
复制代码

sql 看着有点长,其实就是上述分析思路的多次嵌套查询,联表查询


本文主要讲的日常 sql 中的稍微复杂一点点的联表查询,下一章安排 mysql 的 join 关键字,讲讲他的左连接,右连接,内连接,外连接等具体的细节

猜你喜欢

转载自juejin.im/post/7032646555647770661