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 使用

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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sql复制代码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」 中提到的分组案例,我们拿到了重复的条码,但需要分析一下这些重复条码的记录都分布在哪些产线上

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

现在我表演个仙术:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
sql复制代码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 关键字,讲讲他的左连接,右连接,内连接,外连接等具体的细节

原创文章,未经允许,禁止转载

– by 安逸的咸鱼

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%