Datawhale SQL TASK4
作者:互联网
第4章 集合运算
目录摘要:感觉不是很难,但是知识点比较零碎,自己做了两张表格,可能有不大准确的地方,欢迎指正
4.1 表的加减法
-
表的加法-UNION,两个SELECT FROM 语句中间使用UNION
- 同一张表,可以使用UNION或者OR,不同的表只能使用UNION
- 如果想要保留重复行,采用UNION ALL语句
-
SELECT * FROM product AS p1 WHERE product_id NOT IN (SELECT product_id FROM product2) -- 这儿用SELECT 语句不能用p1.product_id,这--- 儿不能写p2否者报错 UNION SELECT * FROM product2 AS p2 WHERE product_id NOT IN (SELECT product_id FROM product)
-
如果用UNION,两个SELECT语句各有各的WHERE,而不是两个SELECT对应一个WHERE.
-
UNION可以隐式数据类型转换,hive中join关联时,应该避免隐式数据类型转换,否则容易数据倾斜
-
日期时间类型可以和数值、字符串、NULL兼容
-
MySQL 8.0 不支持交运算INTERSECT,用 inner join 来求得交集,或者AND
-
SELECT p1.product_id, p1.product_name FROM Product p1 INNER JOIN Product2 p2 ON p1.product_id=p2.product_id
-
-
MySQL 8.0 不支持交运算EXCEPT ,用 NOT IN
-
对称差=并集-交集
表格 | 加法 | 减法 | ||
---|---|---|---|---|
集合 | 并 | 交 | 差 | 对称差 |
关键字 | UNION | INTERSECT | EXCEPT | |
MySQL 8.0是否支持 | 支持 | 不支持 | 不支持 | 否 |
替代方案 | 单表用OR,多表只能UNION | INNER JOIN ON | WHERE NOT IN | NOT IN UNION NOT IN |
方案简记 | 两个SELECT FROM 语句中间使用UNION | 内连结 | NOT IN | A-B UNION B-A |
用法 | SELECT FROM UNION SELECT FROM | 两个SELECT FROM 语句中使用INNER JOIN,最后放ON | ||
注意事项 | 合并后删除重复记录,不想删除用UNION ALL | 也可以用对称差,并集-对称差 |
4.2 连结 JOIN
-
能够简化关联子查询,关联子查询在数据量较多的时候时间消耗很大
-
内连结,INNER JOIN
-
FROM tab_1 INNER JOIN tab_2 ON conditions
-
表先连结后筛选,
-
-
自然连结,NATURAL JOIN ,不需要使用ON,就是一个定义表示一张表的连结
-
外连接,LETF/RIGHT/FULL OUTER JOIN,那个连结就会保留哪个的不匹配的数据
-
全连接