MySQL05: 表合并

搞数据分析肯定是要学习下数据库的;

纵向表合并

UNION ALL 在合并表的时候不做任何附加动作,只是将多个表格简单的首尾相连;

UNION 合并表格的时候,除了拼接之外还会多一个附加动作——去重(以前旧版本还有排序功能,新版本舍弃了排序功能) 去重复就会在数据量大的时候相比UNION ALL慢

注意:表的列名顺序要一致

SELECT * FROM table1
UNION ALL
SELECT * FROM table2;

表连接操作

NNER JOIN、LEFT JOIN、RIGHT JOIN 类似 tidyverse 或者 pandas

  • INNER JOIN(内连接):
    • INNER JOIN返回两个表中联结字段相等的所有记录的组合。
    • 它只显示两个表中具有匹配项的行。
    • 如果左表中的某行在右表中找不到匹配项,或者右表中的某行在左表中找不到匹配项,那么这些行都不会出现在结果集中。
  • LEFT JOIN(左连接):
    • LEFT JOIN返回左表(左边的表)的所有记录,以及右表中与左表相匹配的记录。
    • 如果左表中的某行在右表中没有匹配项,那么结果集中右表的部分将显示为NULL。
    • 左表的每一行至少会出现一次,即使它在右表中没有匹配项。
  • RIGHT JOIN(右连接):
    • RIGHT JOIN与LEFT JOIN相反,它返回右表(右边的表)的所有记录,以及左表中与右表相匹配的记录。
    • 如果右表中的某行在左表中没有匹配项,那么结果集中左表的部分将显示为NULL。
    • 右表的每一行至少会出现一次,即使它在左表中没有匹配项。
SELECT *
FROM table1
INNER JOIN table2
ON table1.id=table2.id;
  • FULL OUTER JOIN

MySQL 直到 2024年还不直接支持 FULL OUTER JOIN。为了达到类似 FULL OUTER JOIN 的效果,通常需要使用 UNION 操作符来组合 LEFT JOINRIGHT JOIN 的结果

SELECT a.product_id, a.price, b.units
FROM Prices a
LEFT JOIN UnitsSold b ON a.product_id = b.product_id
UNION
SELECT a.product_id, a.price, b.units
FROM Prices a
RIGHT JOIN UnitsSold b ON a.product_id = b.product_id
WHERE a.product_id IS NULL;

在这个示例中,首先通过 LEFT JOIN 获取左表(Prices)的所有记录,包括与右表(UnitsSold)匹配的记录以及左表独有的记录(右表部分为 NULL)。

然后通过 RIGHT JOIN 获取右表的所有记录,以及右表独有的记录(此时左表部分为 NULL),最后通过 UNION 将两部分结果合并,并且在第二次查询中使用 WHERE a.product_id IS NULL 来确保只选择那些在左表中没有匹配项的行,从而模拟实现了 FULL OUTER JOIN 的功能 纵向表合并

ON后筛选

在使用 INNER JOIN 等进行表关联时,可以在 ON 子句后面直接添加筛选条件,这样做会先完成表的连接操作,然后基于指定的条件过滤出结果。这种方式能够提高查询效率,因为它先缩小了需要关联的数据集。

下面是一个示例:

SELECT a.product_id, a.price, b.units
FROM 
Prices a
INNER JOIN UnitsSold b 
ON a.product_id = b.product_id AND b.units > 100

在这个例子中,Prices 表和 UnitsSold 表通过 product_id 字段进行内连接。但是,除了基本的连接条件 a.product_id = b.product_id 外,还添加了一个额外的筛选条件 b.units > 100

这意味着只有当 UnitsSold 表中的 units 值大于100时,相应的记录才会被包含在最终结果集中。

这种方式的优点是,它能够更精确地控制哪些记录参与连接,有助于减少不必要的数据处理,提高查询性能。

不过,需要注意的是,这样的条件会直接影响到连接操作,确保它符合你的查询意图。

本文由 mdnice 多平台发布

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值