搞数据分析肯定是要学习下数据库的;
纵向表合并
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 JOIN
和 RIGHT 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多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。